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)
committerTom Haynes <loghyr@primarydata.com>
Tue, 3 Feb 2015 19:06:53 +0000 (11:06 -0800)
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.

Cc: stable@vger.kernel.org # 3.15+
Signed-off-by: Peng Tao <tao.peng@primarydata.com>
fs/nfs/pnfs.c

index 0fb0f19..c7be9b9 100644 (file)
@@ -1711,19 +1711,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);
@@ -1735,14 +1735,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);