aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve French <stfrench@microsoft.com>2018-08-27 18:04:13 -0400
committerSteve French <stfrench@microsoft.com>2018-09-03 00:21:42 -0400
commit5e19697b56a64004e2d0ff1bb952ea05493c088f (patch)
tree75afd94f0ec0ef036bde8c9812237d6250c3142f
parentc15e3f19a6d5c89b1209dc94b40e568177cb0921 (diff)
SMB3: Backup intent flag missing for directory opens with backupuid mounts
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>
-rw-r--r--fs/cifs/inode.c2
-rw-r--r--fs/cifs/smb2ops.c25
2 files changed, 22 insertions, 5 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index d32eaa4b2437..6e8765f44508 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -467,6 +467,8 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
467 oparms.cifs_sb = cifs_sb; 467 oparms.cifs_sb = cifs_sb;
468 oparms.desired_access = GENERIC_READ; 468 oparms.desired_access = GENERIC_READ;
469 oparms.create_options = CREATE_NOT_DIR; 469 oparms.create_options = CREATE_NOT_DIR;
470 if (backup_cred(cifs_sb))
471 oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
470 oparms.disposition = FILE_OPEN; 472 oparms.disposition = FILE_OPEN;
471 oparms.path = path; 473 oparms.path = path;
472 oparms.fid = &fid; 474 oparms.fid = &fid;
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 247a98e6c856..b6fada244527 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -630,7 +630,10 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
630 oparms.tcon = tcon; 630 oparms.tcon = tcon;
631 oparms.desired_access = FILE_READ_ATTRIBUTES; 631 oparms.desired_access = FILE_READ_ATTRIBUTES;
632 oparms.disposition = FILE_OPEN; 632 oparms.disposition = FILE_OPEN;
633 oparms.create_options = 0; 633 if (backup_cred(cifs_sb))
634 oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
635 else
636 oparms.create_options = 0;
634 oparms.fid = &fid; 637 oparms.fid = &fid;
635 oparms.reconnect = false; 638 oparms.reconnect = false;
636 639
@@ -779,7 +782,10 @@ smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon,
779 oparms.tcon = tcon; 782 oparms.tcon = tcon;
780 oparms.desired_access = FILE_READ_EA; 783 oparms.desired_access = FILE_READ_EA;
781 oparms.disposition = FILE_OPEN; 784 oparms.disposition = FILE_OPEN;
782 oparms.create_options = 0; 785 if (backup_cred(cifs_sb))
786 oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
787 else
788 oparms.create_options = 0;
783 oparms.fid = &fid; 789 oparms.fid = &fid;
784 oparms.reconnect = false; 790 oparms.reconnect = false;
785 791
@@ -858,7 +864,10 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
858 oparms.tcon = tcon; 864 oparms.tcon = tcon;
859 oparms.desired_access = FILE_WRITE_EA; 865 oparms.desired_access = FILE_WRITE_EA;
860 oparms.disposition = FILE_OPEN; 866 oparms.disposition = FILE_OPEN;
861 oparms.create_options = 0; 867 if (backup_cred(cifs_sb))
868 oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
869 else
870 oparms.create_options = 0;
862 oparms.fid = &fid; 871 oparms.fid = &fid;
863 oparms.reconnect = false; 872 oparms.reconnect = false;
864 873
@@ -1453,7 +1462,10 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
1453 oparms.tcon = tcon; 1462 oparms.tcon = tcon;
1454 oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA; 1463 oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
1455 oparms.disposition = FILE_OPEN; 1464 oparms.disposition = FILE_OPEN;
1456 oparms.create_options = 0; 1465 if (backup_cred(cifs_sb))
1466 oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
1467 else
1468 oparms.create_options = 0;
1457 oparms.fid = fid; 1469 oparms.fid = fid;
1458 oparms.reconnect = false; 1470 oparms.reconnect = false;
1459 1471
@@ -1857,7 +1869,10 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
1857 oparms.tcon = tcon; 1869 oparms.tcon = tcon;
1858 oparms.desired_access = FILE_READ_ATTRIBUTES; 1870 oparms.desired_access = FILE_READ_ATTRIBUTES;
1859 oparms.disposition = FILE_OPEN; 1871 oparms.disposition = FILE_OPEN;
1860 oparms.create_options = 0; 1872 if (backup_cred(cifs_sb))
1873 oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
1874 else
1875 oparms.create_options = 0;
1861 oparms.fid = &fid; 1876 oparms.fid = &fid;
1862 oparms.reconnect = false; 1877 oparms.reconnect = false;
1863 1878