nfs: only reset desc->pg_mirror_idx when mirroring is supported
authorPeng Tao <tao.peng@primarydata.com>
Mon, 10 Nov 2014 00:35:34 +0000 (08:35 +0800)
committerTom Haynes <loghyr@primarydata.com>
Tue, 3 Feb 2015 19:06:47 +0000 (11:06 -0800)
so that we don't reset desc->pg_mirror_idx for read unnecessarily.
Remove WARN_ON_ONCE from __nfs_pageio_add_request to allow LD to
set pg_mirror_idx for read where pg_mirror_count is always 1.

Signed-off-by: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: Tom Haynes <loghyr@primarydata.com>
fs/nfs/internal.h
fs/nfs/pagelist.c

index ef1c703e487b015e3c0dcebb3f4442fb109fde82..5be06bcafa2f749bf6f476e2500cdff3ecde38e8 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/crc32.h>
+#include <linux/nfs_page.h>
 
 #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS)
 
@@ -261,6 +262,12 @@ static inline void nfs_iocounter_init(struct nfs_io_counter *c)
        atomic_set(&c->io_count, 0);
 }
 
+static inline bool nfs_pgio_has_mirroring(struct nfs_pageio_descriptor *desc)
+{
+       WARN_ON_ONCE(desc->pg_mirror_count < 1);
+       return desc->pg_mirror_count > 1;
+}
+
 /* nfs2xdr.c */
 extern struct rpc_procinfo nfs_procedures[];
 extern int nfs2_decode_dirent(struct xdr_stream *,
index eec12b75c2325fc305625fd38ec985b38fcb6b4a..f9d8c4691149709d894596ea432d213edd25ddf3 100644 (file)
@@ -1021,8 +1021,6 @@ static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
        unsigned int bytes_left = 0;
        unsigned int offset, pgbase;
 
-       WARN_ON_ONCE(desc->pg_mirror_idx >= desc->pg_mirror_count);
-
        nfs_page_group_lock(req, false);
 
        subreq = req;
@@ -1162,7 +1160,8 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
                } else
                        dupreq = req;
 
-               desc->pg_mirror_idx = midx;
+               if (nfs_pgio_has_mirroring(desc))
+                       desc->pg_mirror_idx = midx;
                if (!nfs_pageio_add_request_mirror(desc, dupreq))
                        return 0;
        }
@@ -1181,7 +1180,8 @@ static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc,
        struct nfs_pgio_mirror *mirror = &desc->pg_mirrors[mirror_idx];
        u32 restore_idx = desc->pg_mirror_idx;
 
-       desc->pg_mirror_idx = mirror_idx;
+       if (nfs_pgio_has_mirroring(desc))
+               desc->pg_mirror_idx = mirror_idx;
        for (;;) {
                nfs_pageio_doio(desc);
                if (!mirror->pg_recoalesce)