[pnfs] [PATCH] pnfs: initialize ds_[rw]size only after the layout driver has registered

Benny Halevy bhalevy at panasas.com
Wed Jan 2 11:03:30 EST 2008


Currently, nfs_server_set_fsinfo, which sets the DS I/O sizes, is being called
before pnfs has been initialized.

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/client.c |   15 ---------------
 fs/nfs/pnfs.c   |   22 ++++++++++++++++++++++
 fs/nfs/pnfs.h   |    1 +
 fs/nfs/super.c  |    1 +
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index f96aa40..6db3b83 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -620,9 +620,6 @@ error:
 static void nfs_server_set_fsinfo(struct nfs_server *server, struct nfs_fsinfo *fsinfo)
 {
 	unsigned long max_rpc_payload;
-#ifdef CONFIG_PNFS
-	unsigned long dssize;
-#endif
 
 	/* Work out a lot of parameters */
 	if (server->rsize == 0)
@@ -652,18 +649,6 @@ static void nfs_server_set_fsinfo(struct nfs_server *server, struct nfs_fsinfo *
 #ifdef CONFIG_PNFS
 	/* Save the layout type for use during init of layout driver */
 	server->pnfs_fs_ltype = fsinfo->layoutclass;
-
-	/* Set buffer size for data servers */
-	dssize = pnfs_getiosize(server);
-	if (dssize > 0) {
-		server->ds_rsize = server->ds_wsize = nfs_block_size(dssize, NULL);
-		server->ds_rpages = server->ds_wpages = (server->ds_rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
-	} else {
-		server->ds_wsize = server->wsize;
-		server->ds_rsize = server->rsize;
-		server->ds_rpages = server->rpages;
-		server->ds_wpages = server->wpages;
-	}
 #endif /* CONFIG_PNFS */
 
 	server->wtmult = nfs_block_bits(fsinfo->wtmult, NULL);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index ca99c44..d49f9ce 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -46,6 +46,8 @@
 #include <linux/pnfs_xdr.h>
 #include <linux/nfs4_pnfs.h>
 
+#include "internal.h"
+
 #include "nfs4_fs.h"
 #include "pnfs.h"
 
@@ -859,6 +861,26 @@ pnfs_getiosize(struct nfs_server *server)
 	return ld->ld_policy_ops->get_blocksize(mounttype);
 }
 
+void
+pnfs_set_ds_iosize(struct nfs_server *server)
+{
+	unsigned dssize = pnfs_getiosize(server);
+
+	/* Set buffer size for data servers */
+	if (dssize > 0) {
+		server->ds_rsize = server->ds_wsize =
+			nfs_block_size(dssize, NULL);
+		server->ds_rpages = server->ds_wpages =
+			(server->ds_rsize + PAGE_CACHE_SIZE - 1) >>
+			PAGE_CACHE_SHIFT;
+	} else {
+		server->ds_wsize = server->wsize;
+		server->ds_rsize = server->rsize;
+		server->ds_rpages = server->rpages;
+		server->ds_wpages = server->wpages;
+	}
+}
+
 /* Invoked by all non-NFSv4 I/O layout drivers to mark pages for commit
  */
 static void
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 50e3797..bb7b091 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -46,6 +46,7 @@ int pnfs_enabled_sb(struct nfs_server *nfss);
 int pnfs_use_nfsv4_wproto(struct inode *inode, ssize_t count);
 int pnfs_use_nfsv4_rproto(struct inode *inode, ssize_t count);
 unsigned int pnfs_getiosize(struct nfs_server *server);
+void pnfs_set_ds_iosize(struct nfs_server *server);
 int pnfs_commit(struct inode *inode, struct list_head *head, int sync, struct nfs_write_data *data);
 int pnfs_try_to_commit(struct inode *, struct nfs_write_data *, struct list_head *, int);
 int pnfs_wsize(struct inode *, unsigned int, struct nfs_write_data *);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index b4aecb1..bb6ffa2 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1705,6 +1705,7 @@ int nfs4_init_pnfs(struct super_block *sb, struct nfs_server *server,
 	switch (clp->cl_minorversion) {
 	case 1:
 		set_pnfs_layoutdriver(sb, fh, server->pnfs_fs_ltype);
+		pnfs_set_ds_iosize(server);
 		break;
 	case 0:
 		break;
-- 
1.5.3.3



More information about the pNFS mailing list