[PATCH] SMB3: Backup intent flag missing from some more ops

Steve French smfrench at gmail.com
Mon Feb 3 23:44:11 UTC 2020


tentatively merged into cifs-2.6.git for-next pending more testing

On Mon, Feb 3, 2020 at 1:47 PM Amir Goldstein <amir73il at gmail.com> wrote:
>
> When "backup intent" is requested on the mount (e.g. backupuid or
> backupgid mount options), the corresponding flag was missing from
> some of the operations.
>
> Change all operations to use the macro cifs_create_options() to
> set the backup intent flag if needed.
>
> Signed-off-by: Amir Goldstein <amir73il at gmail.com>
> ---
>
> Hi Steve,
>
> We have a backup test case which failed on some operations, so I tried
> to fix all operations. Hope I found them all.
> This change fixed the backup test case failure, but I did not run any
> other cifs sanity tests.
>
> I also have a v4.19.y backport patch. Will post it if and when this
> patch is merged.
>
> Thanks,
> Amir.
>
>  fs/cifs/cifsacl.c   | 14 +++-----
>  fs/cifs/cifsfs.c    |  2 +-
>  fs/cifs/cifsglob.h  |  6 ++--
>  fs/cifs/cifsproto.h |  8 +++++
>  fs/cifs/connect.c   |  2 +-
>  fs/cifs/dir.c       |  5 +--
>  fs/cifs/file.c      | 10 ++----
>  fs/cifs/inode.c     |  8 ++---
>  fs/cifs/ioctl.c     |  2 +-
>  fs/cifs/link.c      | 18 +++-------
>  fs/cifs/smb1ops.c   | 19 +++++------
>  fs/cifs/smb2inode.c |  9 ++---
>  fs/cifs/smb2ops.c   | 81 +++++++++++++++------------------------------
>  fs/cifs/smb2proto.h |  2 +-
>  14 files changed, 68 insertions(+), 118 deletions(-)
>
> diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
> index fb41e51dd574..440828afcdde 100644
> --- a/fs/cifs/cifsacl.c
> +++ b/fs/cifs/cifsacl.c
> @@ -1084,7 +1084,7 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
>         struct cifs_ntsd *pntsd = NULL;
>         int oplock = 0;
>         unsigned int xid;
> -       int rc, create_options = 0;
> +       int rc;
>         struct cifs_tcon *tcon;
>         struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
>         struct cifs_fid fid;
> @@ -1096,13 +1096,10 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
>         tcon = tlink_tcon(tlink);
>         xid = get_xid();
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = READ_CONTROL;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = path;
>         oparms.fid = &fid;
> @@ -1147,7 +1144,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
>  {
>         int oplock = 0;
>         unsigned int xid;
> -       int rc, access_flags, create_options = 0;
> +       int rc, access_flags;
>         struct cifs_tcon *tcon;
>         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
>         struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
> @@ -1160,9 +1157,6 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
>         tcon = tlink_tcon(tlink);
>         xid = get_xid();
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
>                 access_flags = WRITE_OWNER;
>         else
> @@ -1171,7 +1165,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = access_flags;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = path;
>         oparms.fid = &fid;
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 5492b9860baa..febab27cd838 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -275,7 +275,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
>         buf->f_ffree = 0;       /* unlimited */
>
>         if (server->ops->queryfs)
> -               rc = server->ops->queryfs(xid, tcon, buf);
> +               rc = server->ops->queryfs(xid, tcon, cifs_sb, buf);
>
>         free_xid(xid);
>         return 0;
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 239338d57086..1205041fd966 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -298,7 +298,8 @@ struct smb_version_operations {
>                              const char *, struct dfs_info3_param **,
>                              unsigned int *, const struct nls_table *, int);
>         /* informational QFS call */
> -       void (*qfs_tcon)(const unsigned int, struct cifs_tcon *);
> +       void (*qfs_tcon)(const unsigned int, struct cifs_tcon *,
> +                        struct cifs_sb_info *);
>         /* check if a path is accessible or not */
>         int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
>                                   struct cifs_sb_info *, const char *);
> @@ -409,7 +410,7 @@ struct smb_version_operations {
>                                struct cifsInodeInfo *);
>         /* query remote filesystem */
>         int (*queryfs)(const unsigned int, struct cifs_tcon *,
> -                      struct kstatfs *);
> +                      struct cifs_sb_info *, struct kstatfs *);
>         /* send mandatory brlock to the server */
>         int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
>                          __u64, __u32, int, int, bool);
> @@ -490,6 +491,7 @@ struct smb_version_operations {
>         /* ioctl passthrough for query_info */
>         int (*ioctl_query_info)(const unsigned int xid,
>                                 struct cifs_tcon *tcon,
> +                               struct cifs_sb_info *cifs_sb,
>                                 __le16 *path, int is_dir,
>                                 unsigned long p);
>         /* make unix special files (block, char, fifo, socket) */
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 948bf3474db1..748bd00cb5f1 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -612,4 +612,12 @@ static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses,
>  }
>  #endif
>
> +static inline int cifs_create_options(struct cifs_sb_info *cifs_sb, int options)
> +{
> +       if (backup_cred(cifs_sb))
> +               return options | CREATE_OPEN_BACKUP_INTENT;
> +       else
> +               return options;
> +}
> +
>  #endif                 /* _CIFSPROTO_H */
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 0aa3623ae0e1..a941ac7a659d 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -4365,7 +4365,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
>
>         /* do not care if a following call succeed - informational */
>         if (!tcon->pipe && server->ops->qfs_tcon) {
> -               server->ops->qfs_tcon(*xid, tcon);
> +               server->ops->qfs_tcon(*xid, tcon, cifs_sb);
>                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
>                         if (tcon->fsDevInfo.DeviceCharacteristics &
>                             cpu_to_le32(FILE_READ_ONLY_DEVICE))
> diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
> index f3b79012ff29..0ef099442f20 100644
> --- a/fs/cifs/dir.c
> +++ b/fs/cifs/dir.c
> @@ -355,13 +355,10 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
>         if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
>                 create_options |= CREATE_OPTION_READONLY;
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = desired_access;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.disposition = disposition;
>         oparms.path = full_path;
>         oparms.fid = fid;
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index a4e8f7d445ac..79e6f4f55b9b 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -222,9 +222,6 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
>         if (!buf)
>                 return -ENOMEM;
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         /* O_SYNC also has bit for O_DSYNC so following check picks up either */
>         if (f_flags & O_SYNC)
>                 create_options |= CREATE_WRITE_THROUGH;
> @@ -235,7 +232,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = desired_access;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.disposition = disposition;
>         oparms.path = full_path;
>         oparms.fid = fid;
> @@ -752,9 +749,6 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
>
>         desired_access = cifs_convert_flags(cfile->f_flags);
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         /* O_SYNC also has bit for O_DSYNC so following check picks up either */
>         if (cfile->f_flags & O_SYNC)
>                 create_options |= CREATE_WRITE_THROUGH;
> @@ -768,7 +762,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = desired_access;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.disposition = disposition;
>         oparms.path = full_path;
>         oparms.fid = &cfile->fid;
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index 9b547f7f5f5d..b1383c524b98 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -472,9 +472,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
>         oparms.tcon = tcon;
>         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.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = path;
>         oparms.fid = &fid;
> @@ -1284,7 +1282,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
> -       oparms.create_options = CREATE_NOT_DIR;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = full_path;
>         oparms.fid = &fid;
> @@ -1822,7 +1820,7 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
>         oparms.cifs_sb = cifs_sb;
>         /* open the file to be renamed -- we need DELETE perms */
>         oparms.desired_access = DELETE;
> -       oparms.create_options = CREATE_NOT_DIR;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = from_path;
>         oparms.fid = &fid;
> diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c
> index 1a01e108d75e..e4c935026d5e 100644
> --- a/fs/cifs/ioctl.c
> +++ b/fs/cifs/ioctl.c
> @@ -65,7 +65,7 @@ static long cifs_ioctl_query_info(unsigned int xid, struct file *filep,
>
>         if (tcon->ses->server->ops->ioctl_query_info)
>                 rc = tcon->ses->server->ops->ioctl_query_info(
> -                               xid, tcon, utf16_path,
> +                               xid, tcon, cifs_sb, utf16_path,
>                                 filep->private_data ? 0 : 1, p);
>         else
>                 rc = -EOPNOTSUPP;
> diff --git a/fs/cifs/link.c b/fs/cifs/link.c
> index b736acd3917b..852aa00ec729 100644
> --- a/fs/cifs/link.c
> +++ b/fs/cifs/link.c
> @@ -315,7 +315,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = GENERIC_READ;
> -       oparms.create_options = CREATE_NOT_DIR;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = path;
>         oparms.fid = &fid;
> @@ -353,15 +353,11 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>         struct cifs_fid fid;
>         struct cifs_open_parms oparms;
>         struct cifs_io_parms io_parms;
> -       int create_options = CREATE_NOT_DIR;
> -
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
>
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = GENERIC_WRITE;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_CREATE;
>         oparms.path = path;
>         oparms.fid = &fid;
> @@ -402,9 +398,7 @@ smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         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.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.fid = &fid;
>         oparms.reconnect = false;
> @@ -457,14 +451,10 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>         struct cifs_fid fid;
>         struct cifs_open_parms oparms;
>         struct cifs_io_parms io_parms;
> -       int create_options = CREATE_NOT_DIR;
>         __le16 *utf16_path;
>         __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
>         struct kvec iov[2];
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         cifs_dbg(FYI, "%s: path: %s\n", __func__, path);
>
>         utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
> @@ -474,7 +464,7 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = GENERIC_WRITE;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_CREATE;
>         oparms.fid = &fid;
>         oparms.reconnect = false;
> diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
> index d70a2bb062df..eb994e313c6a 100644
> --- a/fs/cifs/smb1ops.c
> +++ b/fs/cifs/smb1ops.c
> @@ -504,7 +504,8 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
>  }
>
>  static void
> -cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
> +cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
> +             struct cifs_sb_info *cifs_sb)
>  {
>         CIFSSMBQFSDeviceInfo(xid, tcon);
>         CIFSSMBQFSAttributeInfo(xid, tcon);
> @@ -565,7 +566,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
>                 oparms.tcon = tcon;
>                 oparms.cifs_sb = cifs_sb;
>                 oparms.desired_access = FILE_READ_ATTRIBUTES;
> -               oparms.create_options = 0;
> +               oparms.create_options = cifs_create_options(cifs_sb, 0);
>                 oparms.disposition = FILE_OPEN;
>                 oparms.path = full_path;
>                 oparms.fid = &fid;
> @@ -793,7 +794,7 @@ smb_set_file_info(struct inode *inode, const char *full_path,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES;
> -       oparms.create_options = CREATE_NOT_DIR;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = full_path;
>         oparms.fid = &fid;
> @@ -872,7 +873,7 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
>
>  static int
>  cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
> -            struct kstatfs *buf)
> +            struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
>  {
>         int rc = -EOPNOTSUPP;
>
> @@ -970,7 +971,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
> -       oparms.create_options = OPEN_REPARSE_POINT;
> +       oparms.create_options = cifs_create_options(cifs_sb,
> +                                                   OPEN_REPARSE_POINT);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = full_path;
>         oparms.fid = &fid;
> @@ -1029,7 +1031,6 @@ cifs_make_node(unsigned int xid, struct inode *inode,
>         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
>         struct inode *newinode = NULL;
>         int rc = -EPERM;
> -       int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
>         FILE_ALL_INFO *buf = NULL;
>         struct cifs_io_parms io_parms;
>         __u32 oplock = 0;
> @@ -1090,13 +1091,11 @@ cifs_make_node(unsigned int xid, struct inode *inode,
>                 goto out;
>         }
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = GENERIC_WRITE;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
> +                                                   CREATE_OPTION_SPECIAL);
>         oparms.disposition = FILE_CREATE;
>         oparms.path = full_path;
>         oparms.fid = &fid;
> diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
> index 5ef5e97a6d13..1cf207564ff9 100644
> --- a/fs/cifs/smb2inode.c
> +++ b/fs/cifs/smb2inode.c
> @@ -99,9 +99,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = desired_access;
>         oparms.disposition = create_disposition;
> -       oparms.create_options = create_options;
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>         oparms.mode = mode;
> @@ -457,7 +455,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
>
>         /* If it is a root and its handle is cached then use it */
>         if (!strlen(full_path) && !no_cached_open) {
> -               rc = open_shroot(xid, tcon, &fid);
> +               rc = open_shroot(xid, tcon, cifs_sb, &fid);
>                 if (rc)
>                         goto out;
>
> @@ -474,9 +472,6 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
>                 goto out;
>         }
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         cifs_get_readable_path(tcon, full_path, &cfile);
>         rc = smb2_compound_op(xid, tcon, cifs_sb, full_path,
>                               FILE_READ_ATTRIBUTES, FILE_OPEN, create_options,
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 6787fce26f20..33bb86cae369 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -655,7 +655,8 @@ smb2_cached_lease_break(struct work_struct *work)
>  /*
>   * Open the directory at the root of a share
>   */
> -int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
> +int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
> +               struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid)
>  {
>         struct cifs_ses *ses = tcon->ses;
>         struct TCP_Server_Info *server = ses->server;
> @@ -702,7 +703,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
>         rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
>
>         oparms.tcon = tcon;
> -       oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
>         oparms.fid = pfid;
> @@ -818,7 +819,8 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
>  }
>
>  static void
> -smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
> +smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
> +             struct cifs_sb_info *cifs_sb)
>  {
>         int rc;
>         __le16 srch_path = 0; /* Null - open root of share */
> @@ -830,7 +832,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
> -       oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -838,7 +840,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
>                 rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL,
>                                NULL);
>         else
> -               rc = open_shroot(xid, tcon, &fid);
> +               rc = open_shroot(xid, tcon, cifs_sb, &fid);
>
>         if (rc)
>                 return;
> @@ -860,7 +862,8 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
>  }
>
>  static void
> -smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
> +smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
> +             struct cifs_sb_info *cifs_sb)
>  {
>         int rc;
>         __le16 srch_path = 0; /* Null - open root of share */
> @@ -871,7 +874,7 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
> -       oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -906,10 +909,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -1151,10 +1151,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_WRITE_EA;
>         oparms.disposition = FILE_OPEN;
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -1422,6 +1419,7 @@ SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon,
>  static int
>  smb2_ioctl_query_info(const unsigned int xid,
>                       struct cifs_tcon *tcon,
> +                     struct cifs_sb_info *cifs_sb,
>                       __le16 *path, int is_dir,
>                       unsigned long p)
>  {
> @@ -1447,6 +1445,7 @@ smb2_ioctl_query_info(const unsigned int xid,
>         struct kvec close_iov[1];
>         unsigned int size[2];
>         void *data[2];
> +       int create_options = is_dir ? CREATE_NOT_FILE : CREATE_NOT_DIR;
>
>         memset(rqst, 0, sizeof(rqst));
>         resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
> @@ -1477,10 +1476,7 @@ smb2_ioctl_query_info(const unsigned int xid,
>         memset(&oparms, 0, sizeof(oparms));
>         oparms.tcon = tcon;
>         oparms.disposition = FILE_OPEN;
> -       if (is_dir)
> -               oparms.create_options = CREATE_NOT_FILE;
> -       else
> -               oparms.create_options = CREATE_NOT_DIR;
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -2086,10 +2082,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
>         oparms.disposition = FILE_OPEN;
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = fid;
>         oparms.reconnect = false;
>
> @@ -2343,10 +2336,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = desired_access;
>         oparms.disposition = FILE_OPEN;
> -       if (cifs_sb && backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -2402,7 +2392,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
>
>  static int
>  smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
> -            struct kstatfs *buf)
> +            struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
>  {
>         struct smb2_query_info_rsp *rsp;
>         struct smb2_fs_full_size_info *info = NULL;
> @@ -2439,7 +2429,7 @@ smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
>
>  static int
>  smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
> -            struct kstatfs *buf)
> +              struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
>  {
>         int rc;
>         __le16 srch_path = 0; /* Null - open root of share */
> @@ -2448,12 +2438,12 @@ smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
>         struct cifs_fid fid;
>
>         if (!tcon->posix_extensions)
> -               return smb2_queryfs(xid, tcon, buf);
> +               return smb2_queryfs(xid, tcon, cifs_sb, buf);
>
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
> -       oparms.create_options = 0;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -2722,6 +2712,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>         struct smb2_create_rsp *create_rsp;
>         struct smb2_ioctl_rsp *ioctl_rsp;
>         struct reparse_data_buffer *reparse_buf;
> +       int create_options = is_reparse_point ? OPEN_REPARSE_POINT : 0;
>         u32 plen;
>
>         cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
> @@ -2748,14 +2739,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>         oparms.tcon = tcon;
>         oparms.desired_access = FILE_READ_ATTRIBUTES;
>         oparms.disposition = FILE_OPEN;
> -
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> -       if (is_reparse_point)
> -               oparms.create_options = OPEN_REPARSE_POINT;
> -
> +       oparms.create_options = cifs_create_options(cifs_sb, create_options);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -2934,11 +2918,6 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
>         tcon = tlink_tcon(tlink);
>         xid = get_xid();
>
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> -
>         utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
>         if (!utf16_path) {
>                 rc = -ENOMEM;
> @@ -2949,6 +2928,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
>         oparms.tcon = tcon;
>         oparms.desired_access = READ_CONTROL;
>         oparms.disposition = FILE_OPEN;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.fid = &fid;
>         oparms.reconnect = false;
>
> @@ -2990,11 +2970,6 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
>         tcon = tlink_tcon(tlink);
>         xid = get_xid();
>
> -       if (backup_cred(cifs_sb))
> -               oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
> -       else
> -               oparms.create_options = 0;
> -
>         if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
>                 access_flags = WRITE_OWNER;
>         else
> @@ -3009,6 +2984,7 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
>
>         oparms.tcon = tcon;
>         oparms.desired_access = access_flags;
> +       oparms.create_options = cifs_create_options(cifs_sb, 0);
>         oparms.disposition = FILE_OPEN;
>         oparms.path = path;
>         oparms.fid = &fid;
> @@ -4491,7 +4467,6 @@ smb2_make_node(unsigned int xid, struct inode *inode,
>  {
>         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
>         int rc = -EPERM;
> -       int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
>         FILE_ALL_INFO *buf = NULL;
>         struct cifs_io_parms io_parms;
>         __u32 oplock = 0;
> @@ -4527,13 +4502,11 @@ smb2_make_node(unsigned int xid, struct inode *inode,
>                 goto out;
>         }
>
> -       if (backup_cred(cifs_sb))
> -               create_options |= CREATE_OPEN_BACKUP_INTENT;
> -
>         oparms.tcon = tcon;
>         oparms.cifs_sb = cifs_sb;
>         oparms.desired_access = GENERIC_WRITE;
> -       oparms.create_options = create_options;
> +       oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
> +                                                   CREATE_OPTION_SPECIAL);
>         oparms.disposition = FILE_CREATE;
>         oparms.path = full_path;
>         oparms.fid = &fid;
> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> index 6c678e00046f..de6388ef344f 100644
> --- a/fs/cifs/smb2proto.h
> +++ b/fs/cifs/smb2proto.h
> @@ -68,7 +68,7 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server,
>                                  struct mid_q_entry *mid);
>
>  extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
> -                       struct cifs_fid *pfid);
> +                      struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid);
>  extern void close_shroot(struct cached_fid *cfid);
>  extern void close_shroot_lease(struct cached_fid *cfid);
>  extern void close_shroot_lease_locked(struct cached_fid *cfid);
> --
> 2.17.1
>


-- 
Thanks,

Steve



More information about the samba-technical mailing list