pNFS: rework pnfs_generic_pg_check_layout to check IO range
authorOlga Kornievskaia <kolga@netapp.com>
Fri, 10 May 2024 19:07:43 +0000 (15:07 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 21 May 2024 12:34:15 +0000 (08:34 -0400)
All callers of pnfs_generic_pg_check_layout() also want to do a call to
check that the layout's range covers the IO range. Merge the functionality
of the pnfs_generic_pg_check_range() into that of
pnfs_generic_pg_check_layout().

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/filelayout/filelayout.c
fs/nfs/flexfilelayout/flexfilelayout.c
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index bf3ba2e98f3336629bc892f07887ea61c11c99c3..29d84dc66ca391f90879ca9dd424c0d0344d5101 100644 (file)
@@ -867,8 +867,7 @@ static void
 filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio,
                        struct nfs_page *req)
 {
-       pnfs_generic_pg_check_layout(pgio);
-       pnfs_generic_pg_check_range(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        if (!pgio->pg_lseg) {
                pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode,
                                                      nfs_req_openctx(req),
@@ -892,8 +891,7 @@ static void
 filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
                         struct nfs_page *req)
 {
-       pnfs_generic_pg_check_layout(pgio);
-       pnfs_generic_pg_check_range(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        if (!pgio->pg_lseg) {
                pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode,
                                                      nfs_req_openctx(req),
index 3e724cb7ef01d87f3d49c57ab83ca81fd781c4f9..24188af56d5be69e05b5e52f1b871bcc6f737638 100644 (file)
@@ -822,14 +822,6 @@ ff_layout_pg_get_read(struct nfs_pageio_descriptor *pgio,
        }
 }
 
-static void
-ff_layout_pg_check_layout(struct nfs_pageio_descriptor *pgio,
-                         struct nfs_page *req)
-{
-       pnfs_generic_pg_check_layout(pgio);
-       pnfs_generic_pg_check_range(pgio, req);
-}
-
 static void
 ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
                        struct nfs_page *req)
@@ -840,7 +832,7 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
        u32 ds_idx;
 
 retry:
-       ff_layout_pg_check_layout(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        /* Use full layout for now */
        if (!pgio->pg_lseg) {
                ff_layout_pg_get_read(pgio, req, false);
@@ -895,7 +887,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
        u32 i;
 
 retry:
-       ff_layout_pg_check_layout(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        if (!pgio->pg_lseg) {
                pgio->pg_lseg =
                        pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
index a5cc6199127f5876faae1c27e36c128d9eab9996..b5834728f31b3208d69e162423d5f4489fffb00a 100644 (file)
@@ -2705,38 +2705,28 @@ pnfs_layout_return_unused_byclid(struct nfs_client *clp,
                        &range);
 }
 
+/* Check if we have we have a valid layout but if there isn't an intersection
+ * between the request and the pgio->pg_lseg, put this pgio->pg_lseg away.
+ */
 void
-pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio)
+pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio,
+                            struct nfs_page *req)
 {
        if (pgio->pg_lseg == NULL ||
-           test_bit(NFS_LSEG_VALID, &pgio->pg_lseg->pls_flags))
+           (test_bit(NFS_LSEG_VALID, &pgio->pg_lseg->pls_flags) &&
+           pnfs_lseg_request_intersecting(pgio->pg_lseg, req)))
                return;
        pnfs_put_lseg(pgio->pg_lseg);
        pgio->pg_lseg = NULL;
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_pg_check_layout);
 
-/*
- * Check for any intersection between the request and the pgio->pg_lseg,
- * and if none, put this pgio->pg_lseg away.
- */
-void
-pnfs_generic_pg_check_range(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
-{
-       if (pgio->pg_lseg && !pnfs_lseg_request_intersecting(pgio->pg_lseg, req)) {
-               pnfs_put_lseg(pgio->pg_lseg);
-               pgio->pg_lseg = NULL;
-       }
-}
-EXPORT_SYMBOL_GPL(pnfs_generic_pg_check_range);
-
 void
 pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
 {
        u64 rd_size;
 
-       pnfs_generic_pg_check_layout(pgio);
-       pnfs_generic_pg_check_range(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        if (pgio->pg_lseg == NULL) {
                if (pgio->pg_dreq == NULL)
                        rd_size = i_size_read(pgio->pg_inode) - req_offset(req);
@@ -2766,8 +2756,7 @@ void
 pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
                           struct nfs_page *req, u64 wb_size)
 {
-       pnfs_generic_pg_check_layout(pgio);
-       pnfs_generic_pg_check_range(pgio, req);
+       pnfs_generic_pg_check_layout(pgio, req);
        if (pgio->pg_lseg == NULL) {
                pgio->pg_lseg =
                        pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
index db57a85500ee70f07347f8de647ddca341f4b1ac..fa5beeaaf5daa334946d8b4b775feed028192e8d 100644 (file)
@@ -257,8 +257,7 @@ void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
 
 void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);
 void unset_pnfs_layoutdriver(struct nfs_server *);
-void pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio);
-void pnfs_generic_pg_check_range(struct nfs_pageio_descriptor *pgio, struct nfs_page *req);
+void pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio, struct nfs_page *req);
 void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *);
 int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc);
 void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,