[patch] cifs: fix revalidation test in cifs_llseek()

Jeff Layton jlayton at samba.org
Fri Apr 27 07:40:33 MDT 2012


On Fri, 27 Apr 2012 16:59:07 +0400
Pavel Shilovsky <piastryyy at gmail.com> wrote:

> 20 апреля 2012 г. 1:06 пользователь Dan Carpenter
> <dan.carpenter at oracle.com> написал:
> > This test is always true so it means we revalidate the length every
> > time, which generates more network traffic.  This was introduced in
> > 06222e491e "fs: handle SEEK_HOLE/SEEK_DATA properly in all fs's that
> > define their own llseek".
> >
> > Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
> > ---
> > Josef, there were three other places that had this same problem but I
> > think they've all been fixed now.  Except that I had a question about
> > nfs_file_llseek().  Isn't that reversed?  It seems like it only
> > revalidates when it's not supposed to.  I chose to copy what
> > fuse_file_llseek() does instead.
> >
> > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> > index d342128..97d26c7 100644
> > --- a/fs/cifs/cifsfs.c
> > +++ b/fs/cifs/cifsfs.c
> > @@ -695,7 +695,7 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int origin)
> >         * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
> >         * the cached file length
> >         */
> > -       if (origin != SEEK_SET || origin != SEEK_CUR) {
> > +       if (origin == SEEK_SET || origin == SEEK_CUR) {
> >                int rc;
> >                struct inode *inode = file->f_path.dentry->d_inode;
> >
> 
> In this case the semantic contradict the comment above. May be it
> should be "if (origin != SEEK_SET && origin != SEEK_CUR)"?
> 

Agreed, I think Pavel is correct here. The stuff inside the if block
revalidates the file size, and we only need to do that if whence is not
SEEK_SET or SEEK_CUR.

-- 
Jeff Layton <jlayton at samba.org>


More information about the samba-technical mailing list