| From 5e19697b56a64004e2d0ff1bb952ea05493c088f Mon Sep 17 00:00:00 2001 |
| From: Steve French <stfrench@microsoft.com> |
| Date: Mon, 27 Aug 2018 17:04:13 -0500 |
| Subject: SMB3: Backup intent flag missing for directory opens with backupuid mounts |
| |
| From: Steve French <stfrench@microsoft.com> |
| |
| commit 5e19697b56a64004e2d0ff1bb952ea05493c088f upstream. |
| |
| When "backup intent" is requested on the mount (e.g. backupuid or |
| backupgid mount options), the corresponding flag needs to be set |
| on opens of directories (and files) but was missing in some |
| places causing access denied trying to enumerate and backup |
| servers. |
| |
| Fixes kernel bugzilla #200953 |
| https://bugzilla.kernel.org/show_bug.cgi?id=200953 |
| |
| Reported-and-tested-by: <whh@rubrik.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| CC: Stable <stable@vger.kernel.org> |
| Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/inode.c | 2 ++ |
| fs/cifs/smb2ops.c | 25 ++++++++++++++++++++----- |
| 2 files changed, 22 insertions(+), 5 deletions(-) |
| |
| --- a/fs/cifs/inode.c |
| +++ b/fs/cifs/inode.c |
| @@ -467,6 +467,8 @@ cifs_sfu_type(struct cifs_fattr *fattr, |
| oparms.cifs_sb = cifs_sb; |
| oparms.desired_access = GENERIC_READ; |
| oparms.create_options = CREATE_NOT_DIR; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options |= CREATE_OPEN_BACKUP_INTENT; |
| oparms.disposition = FILE_OPEN; |
| oparms.path = path; |
| oparms.fid = &fid; |
| --- a/fs/cifs/smb2ops.c |
| +++ b/fs/cifs/smb2ops.c |
| @@ -385,7 +385,10 @@ smb2_is_path_accessible(const unsigned i |
| oparms.tcon = tcon; |
| oparms.desired_access = FILE_READ_ATTRIBUTES; |
| oparms.disposition = FILE_OPEN; |
| - oparms.create_options = 0; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options = CREATE_OPEN_BACKUP_INTENT; |
| + else |
| + oparms.create_options = 0; |
| oparms.fid = &fid; |
| oparms.reconnect = false; |
| |
| @@ -534,7 +537,10 @@ smb2_query_eas(const unsigned int xid, s |
| oparms.tcon = tcon; |
| oparms.desired_access = FILE_READ_EA; |
| oparms.disposition = FILE_OPEN; |
| - oparms.create_options = 0; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options = CREATE_OPEN_BACKUP_INTENT; |
| + else |
| + oparms.create_options = 0; |
| oparms.fid = &fid; |
| oparms.reconnect = false; |
| |
| @@ -613,7 +619,10 @@ smb2_set_ea(const unsigned int xid, stru |
| oparms.tcon = tcon; |
| oparms.desired_access = FILE_WRITE_EA; |
| oparms.disposition = FILE_OPEN; |
| - oparms.create_options = 0; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options = CREATE_OPEN_BACKUP_INTENT; |
| + else |
| + oparms.create_options = 0; |
| oparms.fid = &fid; |
| oparms.reconnect = false; |
| |
| @@ -1215,7 +1224,10 @@ smb2_query_dir_first(const unsigned int |
| oparms.tcon = tcon; |
| oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA; |
| oparms.disposition = FILE_OPEN; |
| - oparms.create_options = 0; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options = CREATE_OPEN_BACKUP_INTENT; |
| + else |
| + oparms.create_options = 0; |
| oparms.fid = fid; |
| oparms.reconnect = false; |
| |
| @@ -1491,7 +1503,10 @@ smb2_query_symlink(const unsigned int xi |
| oparms.tcon = tcon; |
| oparms.desired_access = FILE_READ_ATTRIBUTES; |
| oparms.disposition = FILE_OPEN; |
| - oparms.create_options = 0; |
| + if (backup_cred(cifs_sb)) |
| + oparms.create_options = CREATE_OPEN_BACKUP_INTENT; |
| + else |
| + oparms.create_options = 0; |
| oparms.fid = &fid; |
| oparms.reconnect = false; |
| |