smb: client: move some params to cifs_open_info_data
authorPaulo Alcantara <pc@manguebit.com>
Thu, 17 Aug 2023 15:34:01 +0000 (12:34 -0300)
committerSteve French <stfrench@microsoft.com>
Sun, 20 Aug 2023 21:05:50 +0000 (16:05 -0500)
Instead of passing @adjust_tz and some reparse point related fields as
parameters in ->query_path_info() and
{smb311_posix,cifs}_info_to_fattr() calls, move them to
cifs_open_info_data structure as they can be easily accessed through
@data.

No functional changes.

Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsglob.h
fs/smb/client/inode.c
fs/smb/client/smb1ops.c
fs/smb/client/smb2inode.c
fs/smb/client/smb2proto.h

index 712557c..4792de2 100644 (file)
@@ -186,6 +186,12 @@ struct cifs_cred {
 };
 
 struct cifs_open_info_data {
+       bool adjust_tz;
+       union {
+               bool reparse_point;
+               bool symlink;
+       };
+       __u32 reparse_tag;
        char *symlink_target;
        union {
                struct smb2_file_all_info fi;
@@ -318,9 +324,11 @@ struct smb_version_operations {
        int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
                                  struct cifs_sb_info *, const char *);
        /* query path data from the server */
-       int (*query_path_info)(const unsigned int xid, struct cifs_tcon *tcon,
-                              struct cifs_sb_info *cifs_sb, const char *full_path,
-                              struct cifs_open_info_data *data, bool *adjust_tz, bool *reparse);
+       int (*query_path_info)(const unsigned int xid,
+                              struct cifs_tcon *tcon,
+                              struct cifs_sb_info *cifs_sb,
+                              const char *full_path,
+                              struct cifs_open_info_data *data);
        /* query file data from the server */
        int (*query_file_info)(const unsigned int xid, struct cifs_tcon *tcon,
                               struct cifsFileInfo *cfile, struct cifs_open_info_data *data);
index c3eeae0..0d11e63 100644 (file)
@@ -632,10 +632,11 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
 }
 
 /* Fill a cifs_fattr struct with info from POSIX info struct */
-static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_info_data *data,
+static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
+                                      struct cifs_open_info_data *data,
                                       struct cifs_sid *owner,
                                       struct cifs_sid *group,
-                                      struct super_block *sb, bool adjust_tz, bool symlink)
+                                      struct super_block *sb)
 {
        struct smb311_posix_qinfo *info = &data->posix_fi;
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
@@ -655,7 +656,7 @@ static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct cifs_ope
        fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
        fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 
-       if (adjust_tz) {
+       if (data->adjust_tz) {
                fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
                fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
        }
@@ -669,7 +670,7 @@ static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct cifs_ope
        /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
        /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
 
-       if (symlink) {
+       if (data->symlink) {
                fattr->cf_mode |= S_IFLNK;
                fattr->cf_dtype = DT_LNK;
                fattr->cf_symlink_target = data->symlink_target;
@@ -690,13 +691,14 @@ static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct cifs_ope
                fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
 }
 
-static void cifs_open_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_info_data *data,
-                                   struct super_block *sb, bool adjust_tz, bool symlink,
-                                   u32 reparse_tag)
+static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
+                                   struct cifs_open_info_data *data,
+                                   struct super_block *sb)
 {
        struct smb2_file_all_info *info = &data->fi;
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
        struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
+       u32 reparse_tag = data->reparse_tag;
 
        memset(fattr, 0, sizeof(*fattr));
        fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
@@ -711,7 +713,7 @@ static void cifs_open_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_i
        fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
        fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 
-       if (adjust_tz) {
+       if (data->adjust_tz) {
                fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
                fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
        }
@@ -736,7 +738,7 @@ static void cifs_open_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_i
        } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
                fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
                fattr->cf_dtype = DT_BLK;
-       } else if (symlink || reparse_tag == IO_REPARSE_TAG_SYMLINK ||
+       } else if (data->symlink || reparse_tag == IO_REPARSE_TAG_SYMLINK ||
                   reparse_tag == IO_REPARSE_TAG_NFS) {
                fattr->cf_mode = S_IFLNK;
                fattr->cf_dtype = DT_LNK;
@@ -789,8 +791,6 @@ cifs_get_file_info(struct file *filp)
        struct cifsFileInfo *cfile = filp->private_data;
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
        struct TCP_Server_Info *server = tcon->ses->server;
-       bool symlink = false;
-       u32 tag = 0;
 
        if (!server->ops->query_file_info)
                return -ENOSYS;
@@ -800,11 +800,12 @@ cifs_get_file_info(struct file *filp)
        switch (rc) {
        case 0:
                /* TODO: add support to query reparse tag */
+               data.adjust_tz = false;
                if (data.symlink_target) {
-                       symlink = true;
-                       tag = IO_REPARSE_TAG_SYMLINK;
+                       data.symlink = true;
+                       data.reparse_tag = IO_REPARSE_TAG_SYMLINK;
                }
-               cifs_open_info_to_fattr(&fattr, &data, inode->i_sb, false, symlink, tag);
+               cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
                break;
        case -EREMOTE:
                cifs_create_dfs_fattr(&fattr, inode->i_sb);
@@ -968,14 +969,11 @@ int cifs_get_inode_info(struct inode **inode, const char *full_path,
        struct TCP_Server_Info *server;
        struct tcon_link *tlink;
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
-       bool adjust_tz = false;
        struct cifs_fattr fattr = {0};
-       bool is_reparse_point = false;
        struct cifs_open_info_data tmp_data = {};
        void *smb1_backup_rsp_buf = NULL;
        int rc = 0;
        int tmprc = 0;
-       __u32 reparse_tag = 0;
 
        tlink = cifs_sb_tlink(cifs_sb);
        if (IS_ERR(tlink))
@@ -992,8 +990,8 @@ int cifs_get_inode_info(struct inode **inode, const char *full_path,
                        cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
                        goto out;
                }
-               rc = server->ops->query_path_info(xid, tcon, cifs_sb, full_path, &tmp_data,
-                                                 &adjust_tz, &is_reparse_point);
+               rc = server->ops->query_path_info(xid, tcon, cifs_sb,
+                                                 full_path, &tmp_data);
                data = &tmp_data;
        }
 
@@ -1008,24 +1006,23 @@ int cifs_get_inode_info(struct inode **inode, const char *full_path,
                 * since we have to check if its reparse tag matches a known
                 * special file type e.g. symlink or fifo or char etc.
                 */
-               if (is_reparse_point && data->symlink_target) {
-                       reparse_tag = IO_REPARSE_TAG_SYMLINK;
+               if (data->reparse_point && data->symlink_target) {
+                       data->reparse_tag = IO_REPARSE_TAG_SYMLINK;
                } else if ((le32_to_cpu(data->fi.Attributes) & ATTR_REPARSE) &&
                           server->ops->query_reparse_tag) {
                        tmprc = server->ops->query_reparse_tag(xid, tcon, cifs_sb, full_path,
-                                                           &reparse_tag);
-                       if (tmprc)
-                               cifs_dbg(FYI, "%s: query_reparse_tag: rc = %d\n", __func__, tmprc);
+                                                              &data->reparse_tag);
+                       cifs_dbg(FYI, "%s: query_reparse_tag: rc = %d\n", __func__, tmprc);
                        if (server->ops->query_symlink) {
-                               tmprc = server->ops->query_symlink(xid, tcon, cifs_sb, full_path,
+                               tmprc = server->ops->query_symlink(xid, tcon, cifs_sb,
+                                                                  full_path,
                                                                   &data->symlink_target,
-                                                                  is_reparse_point);
-                               if (tmprc)
-                                       cifs_dbg(FYI, "%s: query_symlink: rc = %d\n", __func__,
-                                                tmprc);
+                                                                  data->reparse_point);
+                               cifs_dbg(FYI, "%s: query_symlink: rc = %d\n",
+                                        __func__, tmprc);
                        }
                }
-               cifs_open_info_to_fattr(&fattr, data, sb, adjust_tz, is_reparse_point, reparse_tag);
+               cifs_open_info_to_fattr(&fattr, data, sb);
                break;
        case -EREMOTE:
                /* DFS link, no metadata available on this server */
@@ -1168,9 +1165,7 @@ smb311_posix_get_inode_info(struct inode **inode,
        struct cifs_tcon *tcon;
        struct tcon_link *tlink;
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
-       bool adjust_tz = false;
        struct cifs_fattr fattr = {0};
-       bool symlink = false;
        struct cifs_open_info_data data = {};
        struct cifs_sid owner, group;
        int rc = 0;
@@ -1190,9 +1185,9 @@ smb311_posix_get_inode_info(struct inode **inode,
                goto out;
        }
 
-       rc = smb311_posix_query_path_info(xid, tcon, cifs_sb, full_path, &data,
-                                         &owner, &group, &adjust_tz,
-                                         &symlink);
+       rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
+                                         full_path, &data,
+                                         &owner, &group);
 
        /*
         * 2. Convert it to internal cifs metadata (fattr)
@@ -1200,8 +1195,7 @@ smb311_posix_get_inode_info(struct inode **inode,
 
        switch (rc) {
        case 0:
-               smb311_posix_info_to_fattr(&fattr, &data, &owner, &group,
-                                          sb, adjust_tz, symlink);
+               smb311_posix_info_to_fattr(&fattr, &data, &owner, &group, sb);
                break;
        case -EREMOTE:
                /* DFS link, no metadata available on this server */
index 7d1b3fc..094ef4f 100644 (file)
@@ -542,14 +542,17 @@ cifs_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
        return rc;
 }
 
-static int cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
-                               struct cifs_sb_info *cifs_sb, const char *full_path,
-                               struct cifs_open_info_data *data, bool *adjustTZ, bool *symlink)
+static int cifs_query_path_info(const unsigned int xid,
+                               struct cifs_tcon *tcon,
+                               struct cifs_sb_info *cifs_sb,
+                               const char *full_path,
+                               struct cifs_open_info_data *data)
 {
        int rc;
        FILE_ALL_INFO fi = {};
 
-       *symlink = false;
+       data->symlink = false;
+       data->adjust_tz = false;
 
        /* could do find first instead but this returns more info */
        rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */, cifs_sb->local_nls,
@@ -562,7 +565,7 @@ static int cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
        if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) {
                rc = SMBQueryInformation(xid, tcon, full_path, &fi, cifs_sb->local_nls,
                                         cifs_remap(cifs_sb));
-               *adjustTZ = true;
+               data->adjust_tz = true;
        }
 
        if (!rc) {
@@ -589,7 +592,7 @@ static int cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
                /* Need to check if this is a symbolic link or not */
                tmprc = CIFS_open(xid, &oparms, &oplock, NULL);
                if (tmprc == -EOPNOTSUPP)
-                       *symlink = true;
+                       data->symlink = true;
                else if (tmprc == 0)
                        CIFSSMBClose(xid, tcon, fid.netfid);
        }
index 8e696fb..260b2ed 100644 (file)
@@ -541,9 +541,11 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
        return rc;
 }
 
-int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
-                        struct cifs_sb_info *cifs_sb, const char *full_path,
-                        struct cifs_open_info_data *data, bool *adjust_tz, bool *reparse)
+int smb2_query_path_info(const unsigned int xid,
+                        struct cifs_tcon *tcon,
+                        struct cifs_sb_info *cifs_sb,
+                        const char *full_path,
+                        struct cifs_open_info_data *data)
 {
        __u32 create_options = 0;
        struct cifsFileInfo *cfile;
@@ -553,8 +555,8 @@ int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
        bool islink;
        int rc, rc2;
 
-       *adjust_tz = false;
-       *reparse = false;
+       data->adjust_tz = false;
+       data->reparse_point = false;
 
        if (strcmp(full_path, ""))
                rc = -ENOENT;
@@ -588,7 +590,7 @@ int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
                        if (rc)
                                goto out;
 
-                       *reparse = true;
+                       data->reparse_point = true;
                        create_options |= OPEN_REPARSE_POINT;
 
                        /* Failed on a symbolic link - query a reparse point info */
@@ -619,12 +621,13 @@ out:
 }
 
 
-int smb311_posix_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
-                                struct cifs_sb_info *cifs_sb, const char *full_path,
+int smb311_posix_query_path_info(const unsigned int xid,
+                                struct cifs_tcon *tcon,
+                                struct cifs_sb_info *cifs_sb,
+                                const char *full_path,
                                 struct cifs_open_info_data *data,
                                 struct cifs_sid *owner,
-                                struct cifs_sid *group,
-                                bool *adjust_tz, bool *reparse)
+                                struct cifs_sid *group)
 {
        int rc;
        __u32 create_options = 0;
@@ -636,8 +639,8 @@ int smb311_posix_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
        size_t sidsbuflen = 0;
        size_t owner_len, group_len;
 
-       *adjust_tz = false;
-       *reparse = false;
+       data->adjust_tz = false;
+       data->reparse_point = false;
 
        /*
         * BB TODO: Add support for using the cached root handle.
@@ -659,7 +662,7 @@ int smb311_posix_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
                        if (rc)
                                goto out;
                }
-               *reparse = true;
+               data->reparse_point = true;
                create_options |= OPEN_REPARSE_POINT;
 
                /* Failed on a symbolic link - query a reparse point info */
index d5d7ffb..46eff9e 100644 (file)
@@ -56,9 +56,11 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server,
 extern int smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon,
                                struct cifs_sb_info *cifs_sb, const char *path,
                                __u32 *reparse_tag);
-int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
-                        struct cifs_sb_info *cifs_sb, const char *full_path,
-                        struct cifs_open_info_data *data, bool *adjust_tz, bool *reparse);
+int smb2_query_path_info(const unsigned int xid,
+                        struct cifs_tcon *tcon,
+                        struct cifs_sb_info *cifs_sb,
+                        const char *full_path,
+                        struct cifs_open_info_data *data);
 extern int smb2_set_path_size(const unsigned int xid, struct cifs_tcon *tcon,
                              const char *full_path, __u64 size,
                              struct cifs_sb_info *cifs_sb, bool set_alloc);
@@ -275,12 +277,13 @@ extern int smb2_query_info_compound(const unsigned int xid,
                                    struct kvec *rsp, int *buftype,
                                    struct cifs_sb_info *cifs_sb);
 /* query path info from the server using SMB311 POSIX extensions*/
-int smb311_posix_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
-                                struct cifs_sb_info *cifs_sb, const char *full_path,
+int smb311_posix_query_path_info(const unsigned int xid,
+                                struct cifs_tcon *tcon,
+                                struct cifs_sb_info *cifs_sb,
+                                const char *full_path,
                                 struct cifs_open_info_data *data,
                                 struct cifs_sid *owner,
-                                struct cifs_sid *group,
-                                bool *adjust_tz, bool *reparse);
+                                struct cifs_sid *group);
 int posix_info_parse(const void *beg, const void *end,
                     struct smb2_posix_info_parsed *out);
 int posix_info_sid_size(const void *beg, const void *end);