On Sun, 1 Apr 2007 20:17:24 +0200 (MEST) Jan Engelhardt <jengelh@linux01.gwdg.de> wrote:Please dont do that, adding uggly tests in generic_fillattr() The following patch does the right thing for pipes, I let you doing the same for sockets... [PATCH] : fill the size of pipes Instead of reporting 0 in size when stating() a pipe, we give the number of queued bytes. This might avoid using ioctl(FIONREAD) to get this information. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> --- --- linux-2.6.21-rc5-mm3/fs/pipe.c +++ linux-2.6.21-rc5-mm3/fs/pipe.c @@ -570,27 +570,34 @@ bad_pipe_w(struct file *filp, const char return -EBADF; } +static int pipe_size(struct inode *inode) +{ + struct pipe_inode_info *pipe; + int count, buf, nrbufs; + + mutex_lock(&inode->i_mutex); + pipe = inode->i_pipe; + count = 0; + buf = pipe->curbuf; + nrbufs = pipe->nrbufs; + while (--nrbufs >= 0) { + count += pipe->bufs[buf].len; + buf = (buf+1) & (PIPE_BUFFERS-1); + } + mutex_unlock(&inode->i_mutex); + return count; +} + static int pipe_ioctl(struct inode *pino, struct file *filp, unsigned int cmd, unsigned long arg) { struct inode *inode = filp->f_path.dentry->d_inode; - struct pipe_inode_info *pipe; - int count, buf, nrbufs; + int count; switch (cmd) { case FIONREAD: - mutex_lock(&inode->i_mutex); - pipe = inode->i_pipe; - count = 0; - buf = pipe->curbuf; - nrbufs = pipe->nrbufs; - while (--nrbufs >= 0) { - count += pipe->bufs[buf].len; - buf = (buf+1) & (PIPE_BUFFERS-1); - } - mutex_unlock(&inode->i_mutex); - + count = pipe_size(inode); return put_user(count, (int __user *)arg); default: return -EINVAL; @@ -908,6 +915,20 @@ static struct dentry_operations pipefs_d .d_dname = pipefs_dname, }; +int pipe_getattr(struct vfsmount *mnt, struct dentry *dentry, + struct kstat *stat) +{ + struct inode *inode = dentry->d_inode; + + generic_fillattr(inode, stat); + stat->size = pipe_size(inode); + return 0; +} + +const struct inode_operations pipe_inode_operations = { + .getattr = pipe_getattr, +}; + static struct inode * get_pipe_inode(void) { struct inode *inode = new_inode(pipe_mnt->mnt_sb); @@ -921,6 +942,7 @@ static struct inode * get_pipe_inode(voi goto fail_iput; inode->i_pipe = pipe; + inode->i_op = &pipe_inode_operations; pipe->readers = pipe->writers = 1; inode->i_fop = &rdwr_pipe_fops; -
| Heiko Carstens | [patch -mm] s390: struct bin_attribute changes |
| Andrew Morton | 2.6.25-rc2-mm1 |
| Eric W. Biederman | Re: [PATCH] kexec: force x86_64 arches to boot kdump kernels on boot cpu |
| Jan Engelhardt | intel iommu (Re: -mm merge plans for 2.6.23) |
git: | |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jens Axboe | Re: [BUG] New Kernel Bugs |
| Andrew Morton | Re: [PATCH] PHYLIB: IRQ event workqueue handling fixes |
