[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