]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFSv4.1 mark qualified async operations as MOVEABLE tasks
authorOlga Kornievskaia <kolga@netapp.com>
Wed, 25 May 2022 16:12:59 +0000 (12:12 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 31 May 2022 21:09:30 +0000 (17:09 -0400)
Mark async operations such as RENAME, REMOVE, COMMIT MOVEABLE
for the nfsv4.1+ sessions.

Fixes: 5a950c3496fa8 ("NFSv4.1 identify and mark RPC tasks that can move between transports")
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4proc.c
fs/nfs/pagelist.c
fs/nfs/unlink.c
fs/nfs/write.c
include/linux/nfs_fs_sb.h

index 337609befd1789894c5b5543b856dc4d810d465d..c0fdcf8c00329b297063e69341017b980e7b704b 100644 (file)
@@ -1162,7 +1162,7 @@ static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
 {
        unsigned short task_flags = 0;
 
-       if (server->nfs_client->cl_minorversion)
+       if (server->caps & NFS_CAP_MOVEABLE)
                task_flags = RPC_TASK_MOVEABLE;
        return nfs4_do_call_sync(clnt, server, msg, args, res, task_flags);
 }
@@ -2568,7 +2568,7 @@ static int nfs4_run_open_task(struct nfs4_opendata *data,
        };
        int status;
 
-       if (server->nfs_client->cl_minorversion)
+       if (nfs_server_capable(dir, NFS_CAP_MOVEABLE))
                task_setup_data.flags |= RPC_TASK_MOVEABLE;
 
        kref_get(&data->kref);
@@ -3737,7 +3737,7 @@ int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
        };
        int status = -ENOMEM;
 
-       if (server->nfs_client->cl_minorversion)
+       if (nfs_server_capable(state->inode, NFS_CAP_MOVEABLE))
                task_setup_data.flags |= RPC_TASK_MOVEABLE;
 
        nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP,
@@ -4407,7 +4407,7 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
        };
        unsigned short task_flags = 0;
 
-       if (server->nfs_client->cl_minorversion)
+       if (nfs_server_capable(dir, NFS_CAP_MOVEABLE))
                task_flags = RPC_TASK_MOVEABLE;
 
        /* Is this is an attribute revalidation, subject to softreval? */
@@ -6639,10 +6639,13 @@ static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred,
                .rpc_client = server->client,
                .rpc_message = &msg,
                .callback_ops = &nfs4_delegreturn_ops,
-               .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT | RPC_TASK_MOVEABLE,
+               .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
        };
        int status = 0;
 
+       if (nfs_server_capable(inode, NFS_CAP_MOVEABLE))
+               task_setup_data.flags |= RPC_TASK_MOVEABLE;
+
        data = kzalloc(sizeof(*data), GFP_KERNEL);
        if (data == NULL)
                return -ENOMEM;
@@ -6956,10 +6959,8 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
                .workqueue = nfsiod_workqueue,
                .flags = RPC_TASK_ASYNC,
        };
-       struct nfs_client *client =
-               NFS_SERVER(lsp->ls_state->inode)->nfs_client;
 
-       if (client->cl_minorversion)
+       if (nfs_server_capable(lsp->ls_state->inode, NFS_CAP_MOVEABLE))
                task_setup_data.flags |= RPC_TASK_MOVEABLE;
 
        nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client,
@@ -7230,9 +7231,8 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
                .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
        };
        int ret;
-       struct nfs_client *client = NFS_SERVER(state->inode)->nfs_client;
 
-       if (client->cl_minorversion)
+       if (nfs_server_capable(state->inode, NFS_CAP_MOVEABLE))
                task_setup_data.flags |= RPC_TASK_MOVEABLE;
 
        data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
@@ -10467,7 +10467,8 @@ static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
                | NFS_CAP_POSIX_LOCK
                | NFS_CAP_STATEID_NFSV41
                | NFS_CAP_ATOMIC_OPEN_V1
-               | NFS_CAP_LGOPEN,
+               | NFS_CAP_LGOPEN
+               | NFS_CAP_MOVEABLE,
        .init_client = nfs41_init_client,
        .shutdown_client = nfs41_shutdown_client,
        .match_stateid = nfs41_match_stateid,
@@ -10502,7 +10503,8 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = {
                | NFS_CAP_LAYOUTSTATS
                | NFS_CAP_CLONE
                | NFS_CAP_LAYOUTERROR
-               | NFS_CAP_READ_PLUS,
+               | NFS_CAP_READ_PLUS
+               | NFS_CAP_MOVEABLE,
        .init_client = nfs41_init_client,
        .shutdown_client = nfs41_shutdown_client,
        .match_stateid = nfs41_match_stateid,
index 9157dd19b8b4f3ef4387827376a603c5ce22d48e..317cedfa52bf6d760093ffa6579023c26a4e3947 100644 (file)
@@ -767,6 +767,9 @@ int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
                .flags = RPC_TASK_ASYNC | flags,
        };
 
+       if (nfs_server_capable(hdr->inode, NFS_CAP_MOVEABLE))
+               task_setup_data.flags |= RPC_TASK_MOVEABLE;
+
        hdr->rw_ops->rw_initiate(hdr, &msg, rpc_ops, &task_setup_data, how);
 
        dprintk("NFS: initiated pgio call "
index 6f325e10056cebecf767d4a988715c1d5b58737c..9697cd5d2561c3064bf4d16f7b05aa92b87e34a1 100644 (file)
@@ -102,6 +102,10 @@ static void nfs_do_call_unlink(struct inode *inode, struct nfs_unlinkdata *data)
        };
        struct rpc_task *task;
        struct inode *dir = d_inode(data->dentry->d_parent);
+
+       if (nfs_server_capable(inode, NFS_CAP_MOVEABLE))
+               task_setup_data.flags |= RPC_TASK_MOVEABLE;
+
        nfs_sb_active(dir->i_sb);
        data->args.fh = NFS_FH(dir);
        nfs_fattr_init(data->res.dir_attr);
@@ -344,6 +348,10 @@ nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
                .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
        };
 
+       if (nfs_server_capable(old_dir, NFS_CAP_MOVEABLE) &&
+           nfs_server_capable(new_dir, NFS_CAP_MOVEABLE))
+               task_setup_data.flags |= RPC_TASK_MOVEABLE;
+
        data = kzalloc(sizeof(*data), GFP_KERNEL);
        if (data == NULL)
                return ERR_PTR(-ENOMEM);
index 2f41659e232e373fdf7ee93807c943f4e2e64bce..1c706465d090b095b98c900d8b5fe7cb407af57e 100644 (file)
@@ -1709,6 +1709,10 @@ int nfs_initiate_commit(struct rpc_clnt *clnt, struct nfs_commit_data *data,
                .flags = RPC_TASK_ASYNC | flags,
                .priority = priority,
        };
+
+       if (nfs_server_capable(data->inode, NFS_CAP_MOVEABLE))
+               task_setup_data.flags |= RPC_TASK_MOVEABLE;
+
        /* Set up the initial task struct.  */
        nfs_ops->commit_setup(data, &msg, &task_setup_data.rpc_client);
        trace_nfs_initiate_commit(data);
index 157d2bd6b241738a7a161bc5627faee779251b75..ea2f7e6b1b0b58e49f4ec8e5f63155ee766eef0b 100644 (file)
@@ -287,4 +287,5 @@ struct nfs_server {
 #define NFS_CAP_XATTR          (1U << 28)
 #define NFS_CAP_READ_PLUS      (1U << 29)
 #define NFS_CAP_FS_LOCATIONS   (1U << 30)
+#define NFS_CAP_MOVEABLE       (1U << 31)
 #endif