NFSv4/pnfs: Give nfs4_proc_layoutreturn() a flags argument
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 13 Jun 2024 05:00:53 +0000 (01:00 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 17:47:26 +0000 (13:47 -0400)
Replace the boolean in nfs4_proc_layoutreturn() with a set of flags that
will allow us to craft a version that is appropriate for reboot
recovery.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index e5103fa9d4103a98145519d6d6a41a299b316cc5..8e89b5e0ce3193f65d4303e22a203902a11c341f 100644 (file)
@@ -10048,7 +10048,7 @@ static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
        .rpc_release = nfs4_layoutreturn_release,
 };
 
-int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
+int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, unsigned int flags)
 {
        struct rpc_task *task;
        struct rpc_message msg = {
@@ -10071,7 +10071,7 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
                        &task_setup_data.rpc_client, &msg);
 
        lrp->inode = nfs_igrab_and_active(lrp->args.inode);
-       if (!sync) {
+       if (flags & PNFS_FL_LAYOUTRETURN_ASYNC) {
                if (!lrp->inode) {
                        nfs4_layoutreturn_release(lrp);
                        return -EAGAIN;
@@ -10079,6 +10079,8 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
                task_setup_data.flags |= RPC_TASK_ASYNC;
        }
        if (!lrp->inode)
+               flags |= PNFS_FL_LAYOUTRETURN_PRIVILEGED;
+       if (flags & PNFS_FL_LAYOUTRETURN_PRIVILEGED)
                nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
                                   1);
        else
@@ -10087,7 +10089,7 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
        task = rpc_run_task(&task_setup_data);
        if (IS_ERR(task))
                return PTR_ERR(task);
-       if (sync)
+       if (!(flags & PNFS_FL_LAYOUTRETURN_ASYNC))
                status = task->tk_status;
        trace_nfs4_layoutreturn(lrp->args.inode, &lrp->args.stateid, status);
        dprintk("<-- %s status=%d\n", __func__, status);
index 04a52fa3d28cd9aabe86261e4a6ee5938672f303..c482088cb485ccbe3648c7a5a6aa7c4f0c6d432f 100644 (file)
@@ -1279,7 +1279,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
                       const nfs4_stateid *stateid,
                       const struct cred **pcred,
                       enum pnfs_iomode iomode,
-                      bool sync)
+                      unsigned int flags)
 {
        struct inode *ino = lo->plh_inode;
        struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
@@ -1306,7 +1306,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
        if (ld->prepare_layoutreturn)
                ld->prepare_layoutreturn(&lrp->args);
 
-       status = nfs4_proc_layoutreturn(lrp, sync);
+       status = nfs4_proc_layoutreturn(lrp, flags);
 out:
        dprintk("<-- %s status: %d\n", __func__, status);
        return status;
@@ -1340,7 +1340,8 @@ static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
                spin_unlock(&inode->i_lock);
                if (send) {
                        /* Send an async layoutreturn so we dont deadlock */
-                       pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
+                       pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
+                                              PNFS_FL_LAYOUTRETURN_ASYNC);
                }
        } else
                spin_unlock(&inode->i_lock);
@@ -1407,7 +1408,8 @@ _pnfs_return_layout(struct inode *ino)
        send = pnfs_prepare_layoutreturn(lo, &stateid, &cred, NULL);
        spin_unlock(&ino->i_lock);
        if (send)
-               status = pnfs_send_layoutreturn(lo, &stateid, &cred, IOMODE_ANY, true);
+               status = pnfs_send_layoutreturn(lo, &stateid, &cred, IOMODE_ANY,
+                                               0);
 out_wait_layoutreturn:
        wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN, TASK_UNINTERRUPTIBLE);
 out_put_layout_hdr:
@@ -1548,7 +1550,7 @@ out_noroc:
                return true;
        }
        if (layoutreturn)
-               pnfs_send_layoutreturn(lo, &stateid, &lc_cred, iomode, true);
+               pnfs_send_layoutreturn(lo, &stateid, &lc_cred, iomode, 0);
        pnfs_put_layout_hdr(lo);
        return false;
 }
@@ -2595,7 +2597,8 @@ pnfs_mark_layout_for_return(struct inode *inode,
                return_now = pnfs_prepare_layoutreturn(lo, &stateid, &cred, &iomode);
                spin_unlock(&inode->i_lock);
                if (return_now)
-                       pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
+                       pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
+                                              PNFS_FL_LAYOUTRETURN_ASYNC);
        } else {
                spin_unlock(&inode->i_lock);
                nfs_commit_inode(inode, 0);
@@ -2711,7 +2714,8 @@ restart:
                }
                spin_unlock(&inode->i_lock);
                rcu_read_unlock();
-               pnfs_send_layoutreturn(lo, &stateid, &cred, iomode, false);
+               pnfs_send_layoutreturn(lo, &stateid, &cred, iomode,
+                                      PNFS_FL_LAYOUTRETURN_ASYNC);
                pnfs_put_layout_hdr(lo);
                cond_resched();
                goto restart;
index cd23a38eac75421f76c071a58fe72e7a64986931..d192feb346b4e4d8aff6d5285c3c4eec0efda670 100644 (file)
@@ -248,6 +248,9 @@ extern const struct pnfs_layoutdriver_type *pnfs_find_layoutdriver(u32 id);
 extern void pnfs_put_layoutdriver(const struct pnfs_layoutdriver_type *ld);
 
 /* nfs4proc.c */
+#define PNFS_FL_LAYOUTRETURN_ASYNC (1U << 0)
+#define PNFS_FL_LAYOUTRETURN_PRIVILEGED (1U << 1)
+
 extern size_t max_response_pages(struct nfs_server *server);
 extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
                                   struct pnfs_device *dev,
@@ -255,7 +258,8 @@ extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
 extern struct pnfs_layout_segment *
 nfs4_proc_layoutget(struct nfs4_layoutget *lgp,
                    struct nfs4_exception *exception);
-extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
+extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp,
+                                 unsigned int flags);
 
 /* pnfs.c */
 void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);