]> Git Repo - linux.git/blobdiff - fs/nfs/pnfs.c
x86/debug: Change thread.debugreg6 to thread.virtual_dr6
[linux.git] / fs / nfs / pnfs.c
index dd2e14f5875d852cefaf4dab5887b01b2f5cbbd9..71f7741126b6dcc5f247d8fd799e9cd488ac382e 100644 (file)
@@ -1226,31 +1226,27 @@ out:
        return status;
 }
 
+static bool
+pnfs_layout_segments_returnable(struct pnfs_layout_hdr *lo,
+                               enum pnfs_iomode iomode,
+                               u32 seq)
+{
+       struct pnfs_layout_range recall_range = {
+               .length = NFS4_MAX_UINT64,
+               .iomode = iomode,
+       };
+       return pnfs_mark_matching_lsegs_return(lo, &lo->plh_return_segs,
+                                              &recall_range, seq) != -EBUSY;
+}
+
 /* Return true if layoutreturn is needed */
 static bool
 pnfs_layout_need_return(struct pnfs_layout_hdr *lo)
 {
-       struct pnfs_layout_segment *s;
-       enum pnfs_iomode iomode;
-       u32 seq;
-
        if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
                return false;
-
-       seq = lo->plh_return_seq;
-       iomode = lo->plh_return_iomode;
-
-       /* Defer layoutreturn until all recalled lsegs are done */
-       list_for_each_entry(s, &lo->plh_segs, pls_list) {
-               if (seq && pnfs_seqid_is_newer(s->pls_seq, seq))
-                       continue;
-               if (iomode != IOMODE_ANY && s->pls_range.iomode != iomode)
-                       continue;
-               if (test_bit(NFS_LSEG_LAYOUTRETURN, &s->pls_flags))
-                       return false;
-       }
-
-       return true;
+       return pnfs_layout_segments_returnable(lo, lo->plh_return_iomode,
+                                              lo->plh_return_seq);
 }
 
 static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
@@ -1545,16 +1541,16 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
        case 0:
                if (res->lrs_present)
                        res_stateid = &res->stateid;
-               /* Fallthrough */
+               fallthrough;
        default:
                arg_stateid = &args->stateid;
        }
+       trace_nfs4_layoutreturn_on_close(args->inode, &args->stateid, ret);
        pnfs_layoutreturn_free_lsegs(lo, arg_stateid, &args->range,
                        res_stateid);
        if (ld_private && ld_private->ops && ld_private->ops->free)
                ld_private->ops->free(ld_private);
        pnfs_put_layout_hdr(lo);
-       trace_nfs4_layoutreturn_on_close(args->inode, 0);
 }
 
 bool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task)
@@ -2392,16 +2388,6 @@ out_forget:
        return ERR_PTR(-EAGAIN);
 }
 
-static int
-mark_lseg_invalid_or_return(struct pnfs_layout_segment *lseg,
-               struct list_head *tmp_list)
-{
-       if (!mark_lseg_invalid(lseg, tmp_list))
-               return 0;
-       pnfs_cache_lseg_for_layoutreturn(lseg->pls_layout, lseg);
-       return 1;
-}
-
 /**
  * pnfs_mark_matching_lsegs_return - Free or return matching layout segments
  * @lo: pointer to layout header
@@ -2438,7 +2424,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
                                lseg, lseg->pls_range.iomode,
                                lseg->pls_range.offset,
                                lseg->pls_range.length);
-                       if (mark_lseg_invalid_or_return(lseg, tmp_list))
+                       if (mark_lseg_invalid(lseg, tmp_list))
                                continue;
                        remaining++;
                        set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
@@ -2953,7 +2939,8 @@ pnfs_try_to_read_data(struct nfs_pgio_header *hdr,
 }
 
 /* Resend all requests through pnfs. */
-void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
+void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr,
+                          unsigned int mirror_idx)
 {
        struct nfs_pageio_descriptor pgio;
 
@@ -2964,6 +2951,7 @@ void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
 
                nfs_pageio_init_read(&pgio, hdr->inode, false,
                                        hdr->completion_ops);
+               pgio.pg_mirror_idx = mirror_idx;
                hdr->task.tk_status = nfs_pageio_resend(&pgio, hdr);
        }
 }
This page took 0.055272 seconds and 4 git commands to generate.