lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 045/136] Fix to check Unique id and FileType when client refer file directly.
    3.16.80-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Nakajima Akira <nakajima.akira@nttcom.co.jp>

    commit 7196ac113a4f38b7ca1a3282fd9edf328bd22287 upstream.

    When you refer file directly on cifs client,
    (e.g. ls -li <filename>, cd <dir>, stat <filename>)
    the function return old inode number and filetype from old inode cache,
    though server has different inode number or filetype.

    When server is Windows, cifs client has same problem.
    When Server is Windows
    , This patch fixes bug in different filetype,
    but does not fix bug in different inode number.
    Because QUERY_PATH_INFO response by Windows does not include inode number(Index Number) .

    BUG INFO
    https://bugzilla.kernel.org/show_bug.cgi?id=90021
    https://bugzilla.kernel.org/show_bug.cgi?id=90031

    Reported-by: Nakajima Akira <nakajima.akira@nttcom.co.jp>
    Signed-off-by: Nakajima Akira <nakajima.akira@nttcom.co.jp>
    Reviewed-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
    Signed-off-by: Steve French <smfrench@gmail.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    fs/cifs/inode.c | 25 +++++++++++++++++++++++++
    1 file changed, 25 insertions(+)

    --- a/fs/cifs/inode.c
    +++ b/fs/cifs/inode.c
    @@ -401,9 +401,25 @@ int cifs_get_inode_info_unix(struct inod
    rc = -ENOMEM;
    } else {
    /* we already have inode, update it */
    +
    + /* if uniqueid is different, return error */
    + if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
    + CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
    + rc = -ESTALE;
    + goto cgiiu_exit;
    + }
    +
    + /* if filetype is different, return error */
    + if (unlikely(((*pinode)->i_mode & S_IFMT) !=
    + (fattr.cf_mode & S_IFMT))) {
    + rc = -ESTALE;
    + goto cgiiu_exit;
    + }
    +
    cifs_fattr_to_inode(*pinode, &fattr);
    }

    +cgiiu_exit:
    return rc;
    }

    @@ -839,6 +855,15 @@ cifs_get_inode_info(struct inode **inode
    if (!*inode)
    rc = -ENOMEM;
    } else {
    + /* we already have inode, update it */
    +
    + /* if filetype is different, return error */
    + if (unlikely(((*inode)->i_mode & S_IFMT) !=
    + (fattr.cf_mode & S_IFMT))) {
    + rc = -ESTALE;
    + goto cgii_exit;
    + }
    +
    cifs_fattr_to_inode(*inode, &fattr);
    }

    \
     
     \ /
      Last update: 2019-12-17 01:53    [W:8.517 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site