Messages in this thread Patch in this message | | | Date | Mon, 2 Apr 2007 12:41:07 +0200 | From | Eric Dumazet <> | Subject | Re: [PATCH 13/16] show-pipesize-in-stat.diff |
| |
On Sun, 1 Apr 2007 20:17:24 +0200 (MEST) Jan Engelhardt <jengelh@linux01.gwdg.de> wrote:
> > Show the fill status of a pipe (in bytes) when stat'ing one. > > Signed-off-by: Jan Engelhardt <jengelh@gmx.de> > > fs/stat.c | 31 ++++++++++++++++++++++++++++++- > include/linux/un.h | 2 ++ > include/net/af_unix.h | 3 +++ > net/unix/af_unix.c | 10 ++++++++++ > 4 files changed, 45 insertions(+), 1 deletion(-)
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; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |