3.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Peng Tao <tao.p...@primarydata.com>

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.p...@primarydata.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 fs/nfs/pnfs.c |   41 ++++++++++++++++++++---------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1445,19 +1445,19 @@ pnfs_generic_pg_init_read(struct nfs_pag
 {
        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);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to