]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFS: Move the NFS v4.0 minor version ops into nfs40proc.c
authorAnna Schumaker <anna.schumaker@oracle.com>
Fri, 14 Nov 2025 19:26:36 +0000 (14:26 -0500)
committerAnna Schumaker <anna.schumaker@oracle.com>
Fri, 30 Jan 2026 16:42:20 +0000 (11:42 -0500)
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/nfs40.h
fs/nfs/nfs40proc.c
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c

index a04fb2390fa714c6b6a4251a4ed108aace31017c..05ba9f1afe7cf586761ded7c03872cc31a954cd0 100644 (file)
@@ -9,6 +9,7 @@ extern const struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops;
 extern const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops;
 extern const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops;
 extern const struct nfs4_mig_recovery_ops nfs40_mig_recovery_ops;
+extern const struct nfs4_minor_version_ops nfs_v4_0_minor_ops;
 
 /* nfs40state.c */
 int nfs40_discover_server_trunking(struct nfs_client *clp,
index 736e782a27e12a5c2c1ffc0bd5f701b84cfcc313..36802f9b94b53890e95fdf7ad38836e5b56a5cc7 100644 (file)
@@ -126,6 +126,13 @@ static int nfs4_proc_renew(struct nfs_client *clp, const struct cred *cred)
        return 0;
 }
 
+static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
+                                              nfs4_stateid *stateid,
+                                              const struct cred *cred)
+{
+       return -NFS4ERR_BAD_STATEID;
+}
+
 /*
  * This operation also signals the server that this client is
  * performing migration recovery.  The server can stop returning
@@ -222,6 +229,86 @@ static int _nfs40_proc_fsid_present(struct inode *inode, const struct cred *cred
        return 0;
 }
 
+struct nfs_release_lockowner_data {
+       struct nfs4_lock_state *lsp;
+       struct nfs_server *server;
+       struct nfs_release_lockowner_args args;
+       struct nfs_release_lockowner_res res;
+       unsigned long timestamp;
+};
+
+static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata)
+{
+       struct nfs_release_lockowner_data *data = calldata;
+       struct nfs_server *server = data->server;
+       nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
+                          &data->res.seq_res, task);
+       data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
+       data->timestamp = jiffies;
+}
+
+static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata)
+{
+       struct nfs_release_lockowner_data *data = calldata;
+       struct nfs_server *server = data->server;
+
+       nfs40_sequence_done(task, &data->res.seq_res);
+
+       switch (task->tk_status) {
+       case 0:
+               renew_lease(server, data->timestamp);
+               break;
+       case -NFS4ERR_STALE_CLIENTID:
+       case -NFS4ERR_EXPIRED:
+               nfs4_schedule_lease_recovery(server->nfs_client);
+               break;
+       case -NFS4ERR_LEASE_MOVED:
+       case -NFS4ERR_DELAY:
+               if (nfs4_async_handle_error(task, server,
+                                           NULL, NULL) == -EAGAIN)
+                       rpc_restart_call_prepare(task);
+       }
+}
+
+static void nfs4_release_lockowner_release(void *calldata)
+{
+       struct nfs_release_lockowner_data *data = calldata;
+       nfs4_free_lock_state(data->server, data->lsp);
+       kfree(calldata);
+}
+
+static const struct rpc_call_ops nfs4_release_lockowner_ops = {
+       .rpc_call_prepare = nfs4_release_lockowner_prepare,
+       .rpc_call_done = nfs4_release_lockowner_done,
+       .rpc_release = nfs4_release_lockowner_release,
+};
+
+static void
+nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_state *lsp)
+{
+       struct nfs_release_lockowner_data *data;
+       struct rpc_message msg = {
+               .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER],
+       };
+
+       if (server->nfs_client->cl_mvops->minor_version != 0)
+               return;
+
+       data = kmalloc(sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return;
+       data->lsp = lsp;
+       data->server = server;
+       data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
+       data->args.lock_owner.id = lsp->ls_seqid.owner_id;
+       data->args.lock_owner.s_dev = server->s_dev;
+
+       msg.rpc_argp = &data->args;
+       msg.rpc_resp = &data->res;
+       nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0, 0);
+       rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data);
+}
+
 const struct rpc_call_ops nfs40_call_sync_ops = {
        .rpc_call_prepare = nfs40_call_sync_prepare,
        .rpc_call_done = nfs40_call_sync_done,
@@ -254,3 +341,22 @@ const struct nfs4_mig_recovery_ops nfs40_mig_recovery_ops = {
        .get_locations = _nfs40_proc_get_locations,
        .fsid_present = _nfs40_proc_fsid_present,
 };
+
+const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
+       .minor_version = 0,
+       .init_caps = NFS_CAP_READDIRPLUS
+               | NFS_CAP_ATOMIC_OPEN
+               | NFS_CAP_POSIX_LOCK,
+       .init_client = nfs40_init_client,
+       .shutdown_client = nfs40_shutdown_client,
+       .match_stateid = nfs4_match_stateid,
+       .find_root_sec = nfs4_find_root_sec,
+       .free_lock_state = nfs4_release_lockowner,
+       .test_and_free_expired = nfs40_test_and_free_expired_stateid,
+       .alloc_seqid = nfs_alloc_seqid,
+       .call_sync_ops = &nfs40_call_sync_ops,
+       .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
+       .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
+       .state_renewal_ops = &nfs40_state_renewal_ops,
+       .mig_recovery_ops = &nfs40_mig_recovery_ops,
+};
index 7fcab74f01fb205d487573ad9eca65cceb3e0bad..18f04906c5fa1db3998c78548805be8ac43eb2bc 100644 (file)
@@ -310,6 +310,7 @@ extern int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
                                   struct nfs4_sequence_args *args,
                                   struct nfs4_sequence_res *res);
 extern void nfs4_init_sequence(struct nfs4_sequence_args *, struct nfs4_sequence_res *, int, int);
+extern int nfs40_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res);
 extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, const struct cred *, struct nfs4_setclientid_res *);
 extern int nfs4_proc_setclientid_confirm(struct nfs_client *, struct nfs4_setclientid_res *arg, const struct cred *);
 extern void renew_lease(const struct nfs_server *server, unsigned long timestamp);
@@ -365,6 +366,9 @@ extern void nfs_finish_clear_delegation_stateid(struct nfs4_state *state,
                                                const nfs4_stateid *stateid);
 extern void nfs_state_clear_open_state_flags(struct nfs4_state *state);
 extern void do_renew_lease(struct nfs_client *clp, unsigned long timestamp);
+extern bool nfs4_match_stateid(const nfs4_stateid *s1, const nfs4_stateid *s2);
+extern int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
+                             struct nfs_fattr *fattr);
 
 #if defined(CONFIG_NFS_V4_1)
 extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *);
index 0a8f11997ea67a0e122aaabf7b5b0438a283ac7f..136fcc71cbe46ac99728a1aaa4aa285e94f79b2e 100644 (file)
@@ -795,8 +795,8 @@ static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res)
        res->sr_slot = NULL;
 }
 
-static int nfs40_sequence_done(struct rpc_task *task,
-                              struct nfs4_sequence_res *res)
+int nfs40_sequence_done(struct rpc_task *task,
+                       struct nfs4_sequence_res *res)
 {
        if (res->sr_slot != NULL)
                nfs40_sequence_free_slot(res);
@@ -2882,12 +2882,6 @@ void nfs_finish_clear_delegation_stateid(struct nfs4_state *state,
        nfs_state_clear_delegation(state);
 }
 
-static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
-                                              nfs4_stateid *stateid, const struct cred *cred)
-{
-       return -NFS4ERR_BAD_STATEID;
-}
-
 #if defined(CONFIG_NFS_V4_1)
 static int nfs41_test_and_free_expired_stateid(struct nfs_server *server,
                                               nfs4_stateid *stateid, const struct cred *cred)
@@ -4289,7 +4283,7 @@ static int nfs4_lookup_root_sec(struct nfs_server *server,
  * Returns zero on success, or a negative NFS4ERR value, or a
  * negative errno value.
  */
-static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
+int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
                              struct nfs_fattr *fattr)
 {
        /* Per 3530bis 15.33.5 */
@@ -7868,86 +7862,6 @@ int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state,
        return nfs4_handle_delegation_recall_error(server, state, stateid, fl, err);
 }
 
-struct nfs_release_lockowner_data {
-       struct nfs4_lock_state *lsp;
-       struct nfs_server *server;
-       struct nfs_release_lockowner_args args;
-       struct nfs_release_lockowner_res res;
-       unsigned long timestamp;
-};
-
-static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata)
-{
-       struct nfs_release_lockowner_data *data = calldata;
-       struct nfs_server *server = data->server;
-       nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
-                          &data->res.seq_res, task);
-       data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
-       data->timestamp = jiffies;
-}
-
-static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata)
-{
-       struct nfs_release_lockowner_data *data = calldata;
-       struct nfs_server *server = data->server;
-
-       nfs40_sequence_done(task, &data->res.seq_res);
-
-       switch (task->tk_status) {
-       case 0:
-               renew_lease(server, data->timestamp);
-               break;
-       case -NFS4ERR_STALE_CLIENTID:
-       case -NFS4ERR_EXPIRED:
-               nfs4_schedule_lease_recovery(server->nfs_client);
-               break;
-       case -NFS4ERR_LEASE_MOVED:
-       case -NFS4ERR_DELAY:
-               if (nfs4_async_handle_error(task, server,
-                                           NULL, NULL) == -EAGAIN)
-                       rpc_restart_call_prepare(task);
-       }
-}
-
-static void nfs4_release_lockowner_release(void *calldata)
-{
-       struct nfs_release_lockowner_data *data = calldata;
-       nfs4_free_lock_state(data->server, data->lsp);
-       kfree(calldata);
-}
-
-static const struct rpc_call_ops nfs4_release_lockowner_ops = {
-       .rpc_call_prepare = nfs4_release_lockowner_prepare,
-       .rpc_call_done = nfs4_release_lockowner_done,
-       .rpc_release = nfs4_release_lockowner_release,
-};
-
-static void
-nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_state *lsp)
-{
-       struct nfs_release_lockowner_data *data;
-       struct rpc_message msg = {
-               .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER],
-       };
-
-       if (server->nfs_client->cl_mvops->minor_version != 0)
-               return;
-
-       data = kmalloc(sizeof(*data), GFP_KERNEL);
-       if (!data)
-               return;
-       data->lsp = lsp;
-       data->server = server;
-       data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
-       data->args.lock_owner.id = lsp->ls_seqid.owner_id;
-       data->args.lock_owner.s_dev = server->s_dev;
-
-       msg.rpc_argp = &data->args;
-       msg.rpc_resp = &data->res;
-       nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0, 0);
-       rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data);
-}
-
 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
 
 static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler,
@@ -10593,7 +10507,7 @@ static bool nfs41_match_stateid(const nfs4_stateid *s1,
 
 #endif /* CONFIG_NFS_V4_1 */
 
-static bool nfs4_match_stateid(const nfs4_stateid *s1,
+bool nfs4_match_stateid(const nfs4_stateid *s1,
                const nfs4_stateid *s2)
 {
        trace_nfs4_match_stateid(s1, s2);
@@ -10631,28 +10545,7 @@ static const struct nfs4_mig_recovery_ops nfs41_mig_recovery_ops = {
        .get_locations = _nfs41_proc_get_locations,
        .fsid_present = _nfs41_proc_fsid_present,
 };
-#endif /* CONFIG_NFS_V4_1 */
 
-static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
-       .minor_version = 0,
-       .init_caps = NFS_CAP_READDIRPLUS
-               | NFS_CAP_ATOMIC_OPEN
-               | NFS_CAP_POSIX_LOCK,
-       .init_client = nfs40_init_client,
-       .shutdown_client = nfs40_shutdown_client,
-       .match_stateid = nfs4_match_stateid,
-       .find_root_sec = nfs4_find_root_sec,
-       .free_lock_state = nfs4_release_lockowner,
-       .test_and_free_expired = nfs40_test_and_free_expired_stateid,
-       .alloc_seqid = nfs_alloc_seqid,
-       .call_sync_ops = &nfs40_call_sync_ops,
-       .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
-       .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
-       .state_renewal_ops = &nfs40_state_renewal_ops,
-       .mig_recovery_ops = &nfs40_mig_recovery_ops,
-};
-
-#if defined(CONFIG_NFS_V4_1)
 static struct nfs_seqid *
 nfs_alloc_no_seqid(struct nfs_seqid_counter *arg1, gfp_t arg2)
 {