nfs41: .init_read and .init_write can be called with valid pg_lseg
authorPeng Tao <tao.peng@primarydata.com>
Sat, 24 Jan 2015 14:14:52 +0000 (22:14 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Mar 2015 22:57:30 +0000 (14:57 -0800)
commit cb5d04bc39e914124e811ea55f3034d2379a5f6c upstream.

With pgio refactoring in v3.15, .init_read and .init_write can be
called with valid pgio->pg_lseg. file layout was fixed at that time
by commit c6194271f (pnfs: filelayout: support non page aligned
layouts). But the generic helper still needs to be fixed.

Signed-off-by: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfs/pnfs.c

index 0a5dda4..883ee88 100644 (file)
@@ -1445,19 +1445,19 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
 {
        u64 rd_size = req->wb_bytes;
 
-       WARN_ON_ONCE(pgio->pg_lseg != NULL);
-
-       if (pgio->pg_dreq == NULL)
-               rd_size = i_size_read(pgio->pg_inode) - req_offset(req);
-       else
-               rd_size = nfs_dreq_bytes_left(pgio->pg_dreq);
-
-       pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
-                                          req->wb_context,
-                                          req_offset(req),
-                                          rd_size,
-                                          IOMODE_READ,
-                                          GFP_KERNEL);
+       if (pgio->pg_lseg == NULL) {
+               if (pgio->pg_dreq == NULL)
+                       rd_size = i_size_read(pgio->pg_inode) - req_offset(req);
+               else
+                       rd_size = nfs_dreq_bytes_left(pgio->pg_dreq);
+
+               pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
+                                                  req->wb_context,
+                                                  req_offset(req),
+                                                  rd_size,
+                                                  IOMODE_READ,
+                                                  GFP_KERNEL);
+       }
        /* If no lseg, fall back to read through mds */
        if (pgio->pg_lseg == NULL)
                nfs_pageio_reset_read_mds(pgio);
@@ -1469,14 +1469,13 @@ void
 pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
                           struct nfs_page *req, u64 wb_size)
 {
-       WARN_ON_ONCE(pgio->pg_lseg != NULL);
-
-       pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
-                                          req->wb_context,
-                                          req_offset(req),
-                                          wb_size,
-                                          IOMODE_RW,
-                                          GFP_NOFS);
+       if (pgio->pg_lseg == NULL)
+               pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
+                                                  req->wb_context,
+                                                  req_offset(req),
+                                                  wb_size,
+                                                  IOMODE_RW,
+                                                  GFP_NOFS);
        /* If no lseg, fall back to write through mds */
        if (pgio->pg_lseg == NULL)
                nfs_pageio_reset_write_mds(pgio);