lkml.org 
[lkml]   [2019]   [Mar]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.4 08/16] cifs: fallback to older infolevels on findfirst queryinfo retry
    Date
    From: Steve French <stfrench@microsoft.com>

    [ Upstream commit 3b7960caceafdfc2cdfe2850487f8d091eb41144 ]

    In cases where queryinfo fails, we have cases in cifs (vers=1.0)
    where with backupuid mounts we retry the query info with findfirst.
    This doesn't work to some NetApp servers which don't support
    WindowsXP (and later) infolevel 261 (SMB_FIND_FILE_ID_FULL_DIR_INFO)
    so in this case use other info levels (in this case it will usually
    be level 257, SMB_FIND_FILE_DIRECTORY_INFO).

    (Also fixes some indentation)

    See kernel bugzilla 201435

    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/cifs/inode.c | 69 +++++++++++++++++++++++++++----------------------
    1 file changed, 38 insertions(+), 31 deletions(-)

    diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
    index 5c3187df9ab9..d8bd8dd36211 100644
    --- a/fs/cifs/inode.c
    +++ b/fs/cifs/inode.c
    @@ -759,43 +759,50 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
    } else if ((rc == -EACCES) && backup_cred(cifs_sb) &&
    (strcmp(server->vals->version_string, SMB1_VERSION_STRING)
    == 0)) {
    - /*
    - * For SMB2 and later the backup intent flag is already
    - * sent if needed on open and there is no path based
    - * FindFirst operation to use to retry with
    - */
    -
    - srchinf = kzalloc(sizeof(struct cifs_search_info),
    - GFP_KERNEL);
    - if (srchinf == NULL) {
    - rc = -ENOMEM;
    - goto cgii_exit;
    - }
    + /*
    + * For SMB2 and later the backup intent flag is already
    + * sent if needed on open and there is no path based
    + * FindFirst operation to use to retry with
    + */
    +
    + srchinf = kzalloc(sizeof(struct cifs_search_info),
    + GFP_KERNEL);
    + if (srchinf == NULL) {
    + rc = -ENOMEM;
    + goto cgii_exit;
    + }

    - srchinf->endOfSearch = false;
    + srchinf->endOfSearch = false;
    + if (tcon->unix_ext)
    + srchinf->info_level = SMB_FIND_FILE_UNIX;
    + else if ((tcon->ses->capabilities &
    + tcon->ses->server->vals->cap_nt_find) == 0)
    + srchinf->info_level = SMB_FIND_FILE_INFO_STANDARD;
    + else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
    srchinf->info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
    + else /* no srvino useful for fallback to some netapp */
    + srchinf->info_level = SMB_FIND_FILE_DIRECTORY_INFO;

    - srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
    - CIFS_SEARCH_CLOSE_AT_END |
    - CIFS_SEARCH_BACKUP_SEARCH;
    + srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
    + CIFS_SEARCH_CLOSE_AT_END |
    + CIFS_SEARCH_BACKUP_SEARCH;

    - rc = CIFSFindFirst(xid, tcon, full_path,
    - cifs_sb, NULL, srchflgs, srchinf, false);
    - if (!rc) {
    - data =
    - (FILE_ALL_INFO *)srchinf->srch_entries_start;
    + rc = CIFSFindFirst(xid, tcon, full_path,
    + cifs_sb, NULL, srchflgs, srchinf, false);
    + if (!rc) {
    + data = (FILE_ALL_INFO *)srchinf->srch_entries_start;

    - cifs_dir_info_to_fattr(&fattr,
    - (FILE_DIRECTORY_INFO *)data, cifs_sb);
    - fattr.cf_uniqueid = le64_to_cpu(
    - ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
    - validinum = true;
    + cifs_dir_info_to_fattr(&fattr,
    + (FILE_DIRECTORY_INFO *)data, cifs_sb);
    + fattr.cf_uniqueid = le64_to_cpu(
    + ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
    + validinum = true;

    - cifs_buf_release(srchinf->ntwrk_buf_start);
    - }
    - kfree(srchinf);
    - if (rc)
    - goto cgii_exit;
    + cifs_buf_release(srchinf->ntwrk_buf_start);
    + }
    + kfree(srchinf);
    + if (rc)
    + goto cgii_exit;
    } else
    goto cgii_exit;

    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-30 02:32    [W:3.240 / U:0.864 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site