All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 0/4] NFS: Modularize NFS v3
@ 2011-11-22 22:57 bjschuma
  2011-11-22 22:58 ` [RFC 1/4] NFS: Export symbols needed by an NFS v3 module bjschuma
                   ` (5 more replies)
  0 siblings, 6 replies; 20+ messages in thread
From: bjschuma @ 2011-11-22 22:57 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

This set of patches removes NFS v3 from the main NFS kernel module and creates
a new module containing the proc, xdr, and acl code.  This will give us a
single directory to put NFS v3 specific code so it doesn't need to be mixed in
with the generic client stuff.

I'm sure this could still use a lot of work, but I figured I would wait to see
what everybody thinks first.  I imagine that once we get an "nfs submodule"
system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
modules.

I split the second patch into two to make it easier to see what my changes were
to get everything to compile.  Hopefully this will save some pain in having to
look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
command.  I can combine everything in a future version of the patch.

Thoughts?

- Bryan


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC 1/4] NFS: Export symbols needed by an NFS v3 module
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
@ 2011-11-22 22:58 ` bjschuma
  2011-11-22 22:58 ` [RFC 2.5/4] NFS: Move the NFS v3 code into its own subdirectory bjschuma
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 20+ messages in thread
From: bjschuma @ 2011-11-22 22:58 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

These are functions and structures used by the NFS v3 code that needs to
be available once it has been moved to its own module.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
---
 fs/nfs/client.c  |    1 +
 fs/nfs/dir.c     |   50 ++++++++++++++++++++++++++++++++------------------
 fs/nfs/inode.c   |   12 ++++++++++++
 fs/nfs/nfs2xdr.c |    2 ++
 4 files changed, 47 insertions(+), 18 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 873bf00..c32a21f 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -813,6 +813,7 @@ error:
 	dprintk("<-- nfs_init_client() = xerror %d\n", error);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_init_client);
 
 /*
  * Create a version 2 or 3 client
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index ac28990..f7cb6b6 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -19,6 +19,7 @@
 
 #include <linux/time.h>
 #include <linux/errno.h>
+#include <linux/export.h>
 #include <linux/stat.h>
 #include <linux/fcntl.h>
 #include <linux/string.h>
@@ -46,15 +47,15 @@
 static int nfs_opendir(struct inode *, struct file *);
 static int nfs_closedir(struct inode *, struct file *);
 static int nfs_readdir(struct file *, void *, filldir_t);
-static struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *);
-static int nfs_create(struct inode *, struct dentry *, int, struct nameidata *);
-static int nfs_mkdir(struct inode *, struct dentry *, int);
-static int nfs_rmdir(struct inode *, struct dentry *);
-static int nfs_unlink(struct inode *, struct dentry *);
-static int nfs_symlink(struct inode *, struct dentry *, const char *);
-static int nfs_link(struct dentry *, struct inode *, struct dentry *);
-static int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
-static int nfs_rename(struct inode *, struct dentry *,
+struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *);
+int nfs_create(struct inode *, struct dentry *, int, struct nameidata *);
+int nfs_mkdir(struct inode *, struct dentry *, int);
+int nfs_rmdir(struct inode *, struct dentry *);
+int nfs_unlink(struct inode *, struct dentry *);
+int nfs_symlink(struct inode *, struct dentry *, const char *);
+int nfs_link(struct dentry *, struct inode *, struct dentry *);
+int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
+int nfs_rename(struct inode *, struct dentry *,
 		      struct inode *, struct dentry *);
 static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
 static loff_t nfs_llseek_dir(struct file *, loff_t, int);
@@ -1262,8 +1263,9 @@ const struct dentry_operations nfs_dentry_operations = {
 	.d_automount	= nfs_d_automount,
 	.d_release	= nfs_d_release,
 };
+EXPORT_SYMBOL_GPL(nfs_dentry_operations);
 
-static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd)
+struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd)
 {
 	struct dentry *res;
 	struct dentry *parent;
@@ -1326,6 +1328,7 @@ out:
 	nfs_free_fhandle(fhandle);
 	return res;
 }
+EXPORT_SYMBOL_GPL(nfs_lookup);
 
 #ifdef CONFIG_NFS_V4
 static int nfs_open_revalidate(struct dentry *, struct nameidata *);
@@ -1668,6 +1671,7 @@ out_error:
 	dput(parent);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_instantiate);
 
 /*
  * Following a failed create operation, we drop the dentry rather
@@ -1675,7 +1679,7 @@ out_error:
  * that the operation succeeded on the server, but an error in the
  * reply path made it appear to have failed.
  */
-static int nfs_create(struct inode *dir, struct dentry *dentry, int mode,
+int nfs_create(struct inode *dir, struct dentry *dentry, int mode,
 		struct nameidata *nd)
 {
 	struct iattr attr;
@@ -1699,11 +1703,12 @@ out_err:
 	d_drop(dentry);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_create);
 
 /*
  * See comments for nfs_proc_create regarding failed operations.
  */
-static int
+int
 nfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
 {
 	struct iattr attr;
@@ -1726,11 +1731,12 @@ out_err:
 	d_drop(dentry);
 	return status;
 }
+EXPORT_SYMBOL_GPL(nfs_mknod);
 
 /*
  * See comments for nfs_proc_create regarding failed operations.
  */
-static int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 {
 	struct iattr attr;
 	int error;
@@ -1749,6 +1755,7 @@ out_err:
 	d_drop(dentry);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_mkdir);
 
 static void nfs_dentry_handle_enoent(struct dentry *dentry)
 {
@@ -1756,7 +1763,7 @@ static void nfs_dentry_handle_enoent(struct dentry *dentry)
 		d_delete(dentry);
 }
 
-static int nfs_rmdir(struct inode *dir, struct dentry *dentry)
+int nfs_rmdir(struct inode *dir, struct dentry *dentry)
 {
 	int error;
 
@@ -1772,6 +1779,7 @@ static int nfs_rmdir(struct inode *dir, struct dentry *dentry)
 
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_rmdir);
 
 /*
  * Remove a file after making sure there are no pending writes,
@@ -1815,7 +1823,7 @@ out:
  *
  *  If sillyrename() returns 0, we do nothing, otherwise we unlink.
  */
-static int nfs_unlink(struct inode *dir, struct dentry *dentry)
+int nfs_unlink(struct inode *dir, struct dentry *dentry)
 {
 	int error;
 	int need_rehash = 0;
@@ -1843,6 +1851,7 @@ static int nfs_unlink(struct inode *dir, struct dentry *dentry)
 		d_rehash(dentry);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_unlink);
 
 /*
  * To create a symbolic link, most file systems instantiate a new inode,
@@ -1859,7 +1868,7 @@ static int nfs_unlink(struct inode *dir, struct dentry *dentry)
  * now have a new file handle and can instantiate an in-core NFS inode
  * and move the raw page into its mapping.
  */
-static int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
+int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
 {
 	struct pagevec lru_pvec;
 	struct page *page;
@@ -1913,8 +1922,9 @@ static int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *sym
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(nfs_symlink);
 
-static int 
+int
 nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
 {
 	struct inode *inode = old_dentry->d_inode;
@@ -1934,6 +1944,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
 	}
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_link);
 
 /*
  * RENAME
@@ -1959,7 +1970,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
  * If these conditions are met, we can drop the dentries before doing
  * the rename.
  */
-static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 		      struct inode *new_dir, struct dentry *new_dentry)
 {
 	struct inode *old_inode = old_dentry->d_inode;
@@ -2032,6 +2043,7 @@ out:
 		dput(dentry);
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_rename);
 
 static DEFINE_SPINLOCK(nfs_access_lru_lock);
 static LIST_HEAD(nfs_access_lru_list);
@@ -2132,6 +2144,7 @@ void nfs_access_zap_cache(struct inode *inode)
 	spin_unlock(&nfs_access_lru_lock);
 	nfs_access_free_list(&head);
 }
+EXPORT_SYMBOL_GPL(nfs_access_zap_cache);
 
 static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, struct rpc_cred *cred)
 {
@@ -2351,6 +2364,7 @@ out_notsup:
 		res = generic_permission(inode, mask);
 	goto out;
 }
+EXPORT_SYMBOL_GPL(nfs_permission);
 
 /*
  * Local variables:
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 50a15fa..2a4f55d 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -184,6 +184,7 @@ void nfs_zap_acl_cache(struct inode *inode)
 	NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_ACL;
 	spin_unlock(&inode->i_lock);
 }
+EXPORT_SYMBOL_GPL(nfs_zap_acl_cache);
 
 void nfs_invalidate_atime(struct inode *inode)
 {
@@ -191,6 +192,7 @@ void nfs_invalidate_atime(struct inode *inode)
 	NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
 	spin_unlock(&inode->i_lock);
 }
+EXPORT_SYMBOL_GPL(nfs_invalidate_atime);
 
 /*
  * Invalidate, but do not unhash, the inode.
@@ -444,6 +446,7 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr)
 out:
 	return error;
 }
+EXPORT_SYMBOL_GPL(nfs_setattr);
 
 /**
  * nfs_vmtruncate - unmap mappings "freed" by truncate() syscall
@@ -502,6 +505,7 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr)
 		nfs_vmtruncate(inode, attr->ia_size);
 	}
 }
+EXPORT_SYMBOL_GPL(nfs_setattr_update_inode);
 
 int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 {
@@ -540,6 +544,7 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 out:
 	return err;
 }
+EXPORT_SYMBOL_GPL(nfs_getattr);
 
 static void nfs_init_lock_context(struct nfs_lock_context *l_ctx)
 {
@@ -628,6 +633,7 @@ void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
 		return;
 	nfs_revalidate_inode(server, inode);
 }
+EXPORT_SYMBOL_GPL(nfs_close_context);
 
 struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rpc_cred *cred, fmode_t f_mode)
 {
@@ -845,6 +851,7 @@ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
 		return NFS_STALE(inode) ? -ESTALE : 0;
 	return __nfs_revalidate_inode(server, inode);
 }
+EXPORT_SYMBOL_GPL(nfs_revalidate_inode);
 
 static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
 {
@@ -1020,6 +1027,7 @@ void nfs_fattr_init(struct nfs_fattr *fattr)
 	fattr->time_start = jiffies;
 	fattr->gencount = nfs_inc_attr_generation_counter();
 }
+EXPORT_SYMBOL_GPL(nfs_fattr_init);
 
 struct nfs_fattr *nfs_alloc_fattr(void)
 {
@@ -1030,6 +1038,7 @@ struct nfs_fattr *nfs_alloc_fattr(void)
 		nfs_fattr_init(fattr);
 	return fattr;
 }
+EXPORT_SYMBOL_GPL(nfs_alloc_fattr);
 
 struct nfs_fh *nfs_alloc_fhandle(void)
 {
@@ -1099,6 +1108,7 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
 
 	return status;
 }
+EXPORT_SYMBOL_GPL(nfs_refresh_inode);
 
 static int nfs_post_op_update_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
 {
@@ -1135,6 +1145,7 @@ int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 	spin_unlock(&inode->i_lock);
 	return status;
 }
+EXPORT_SYMBOL_GPL(nfs_post_op_update_inode);
 
 /**
  * nfs_post_op_update_inode_force_wcc - try to update the inode attribute cache
@@ -1186,6 +1197,7 @@ out_noforce:
 	spin_unlock(&inode->i_lock);
 	return status;
 }
+EXPORT_SYMBOL_GPL(nfs_post_op_update_inode_force_wcc);
 
 /*
  * Many nfs protocol calls return the new file attributes after
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
index 792cb13..ce8d6c4 100644
--- a/fs/nfs/nfs2xdr.c
+++ b/fs/nfs/nfs2xdr.c
@@ -13,6 +13,7 @@
 #include <linux/time.h>
 #include <linux/mm.h>
 #include <linux/errno.h>
+#include <linux/export.h>
 #include <linux/string.h>
 #include <linux/in.h>
 #include <linux/pagemap.h>
@@ -1120,6 +1121,7 @@ int nfs_stat_to_errno(enum nfs_stat status)
 	dprintk("NFS: Unrecognized nfs status value: %u\n", status);
 	return nfs_errtbl[i].errno;
 }
+EXPORT_SYMBOL_GPL(nfs_stat_to_errno);
 
 #define PROC(proc, argtype, restype, timer)				\
 [NFSPROC_##proc] = {							\
-- 
1.7.7.4


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC 2.5/4] NFS: Move the NFS v3 code into its own subdirectory
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
  2011-11-22 22:58 ` [RFC 1/4] NFS: Export symbols needed by an NFS v3 module bjschuma
@ 2011-11-22 22:58 ` bjschuma
  2011-11-22 22:58 ` [RFC 3/4] NFS: Add functions for adding new NFS versions bjschuma
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 20+ messages in thread
From: bjschuma @ 2011-11-22 22:58 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

This finishes off the changes started in the last patch.  Note that
after applying this patch NFS v3 is still directly compiled into the
main NFS kernel module.  The changes to turn it into a module will come
in a later patch.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
---
 fs/nfs/Makefile        |    4 ++--
 fs/nfs/nfs3/nfs3acl.c  |    2 +-
 fs/nfs/nfs3/nfs3proc.c |    4 ++--
 fs/nfs/nfs3/nfs3xdr.c  |    2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
index b58613d..ac0e5df 100644
--- a/fs/nfs/Makefile
+++ b/fs/nfs/Makefile
@@ -9,8 +9,8 @@ nfs-y 			:= client.o dir.o file.o getroot.o inode.o super.o nfs2xdr.o \
 			   write.o namespace.o mount_clnt.o \
 			   dns_resolve.o cache_lib.o
 nfs-$(CONFIG_ROOT_NFS)	+= nfsroot.o
-nfs-$(CONFIG_NFS_V3)	+= nfs3proc.o nfs3xdr.o
-nfs-$(CONFIG_NFS_V3_ACL)	+= nfs3acl.o
+nfs-$(CONFIG_NFS_V3)	+= nfs3/nfs3proc.o nfs3/nfs3xdr.o
+nfs-$(CONFIG_NFS_V3_ACL)	+= nfs3/nfs3acl.o
 nfs-$(CONFIG_NFS_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \
 			   delegation.o idmap.o \
 			   callback.o callback_xdr.o callback_proc.o \
diff --git a/fs/nfs/nfs3/nfs3acl.c b/fs/nfs/nfs3/nfs3acl.c
index 7ef2397..ac589ff 100644
--- a/fs/nfs/nfs3/nfs3acl.c
+++ b/fs/nfs/nfs3/nfs3acl.c
@@ -6,7 +6,7 @@
 #include <linux/posix_acl_xattr.h>
 #include <linux/nfsacl.h>
 
-#include "internal.h"
+#include "../internal.h"
 
 #define NFSDBG_FACILITY	NFSDBG_PROC
 
diff --git a/fs/nfs/nfs3/nfs3proc.c b/fs/nfs/nfs3/nfs3proc.c
index d4bc9ed9..f37ddb9 100644
--- a/fs/nfs/nfs3/nfs3proc.c
+++ b/fs/nfs/nfs3/nfs3proc.c
@@ -18,8 +18,8 @@
 #include <linux/lockd/bind.h>
 #include <linux/nfs_mount.h>
 
-#include "iostat.h"
-#include "internal.h"
+#include "../iostat.h"
+#include "../internal.h"
 
 #define NFSDBG_FACILITY		NFSDBG_PROC
 
diff --git a/fs/nfs/nfs3/nfs3xdr.c b/fs/nfs/nfs3/nfs3xdr.c
index 183c6b1..be27fb8 100644
--- a/fs/nfs/nfs3/nfs3xdr.c
+++ b/fs/nfs/nfs3/nfs3xdr.c
@@ -20,7 +20,7 @@
 #include <linux/nfs3.h>
 #include <linux/nfs_fs.h>
 #include <linux/nfsacl.h>
-#include "internal.h"
+#include "../internal.h"
 
 #define NFSDBG_FACILITY		NFSDBG_XDR
 
-- 
1.7.7.4


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC 3/4] NFS: Add functions for adding new NFS versions
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
  2011-11-22 22:58 ` [RFC 1/4] NFS: Export symbols needed by an NFS v3 module bjschuma
  2011-11-22 22:58 ` [RFC 2.5/4] NFS: Move the NFS v3 code into its own subdirectory bjschuma
@ 2011-11-22 22:58 ` bjschuma
  2011-11-22 22:58 ` [RFC 4/4] NFS: Turn NFS v3 into a module bjschuma
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 20+ messages in thread
From: bjschuma @ 2011-11-22 22:58 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

These functions and structures allow us to add modular NFS versions at
runtime, rather than requiring them to be compiled directly into the NFS
kernel module.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
---
 fs/nfs/client.c         |   65 +++++++++++++++++++++++++++++++++++++++++++---
 fs/nfs/file.c           |    2 +
 fs/nfs/internal.h       |   15 +++++++++++
 fs/nfs/mount_clnt.c     |    1 +
 fs/nfs/nfs3/nfs3proc.c  |    2 +-
 fs/nfs/nfs4proc.c       |    2 +-
 fs/nfs/proc.c           |    2 +-
 fs/nfs/super.c          |    1 +
 include/linux/nfs_xdr.h |    6 ++--
 9 files changed, 85 insertions(+), 11 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index c32a21f..9e77056 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -87,6 +87,21 @@ retry:
 static int nfs4_disable_idmapping = 0;
 
 /*
+ * NFS versions
+ */
+static struct nfs_version_ops *nfs_version_ops[5] = {
+	[2] = NULL,
+	[3] = NULL,
+	[4] = NULL,
+};
+
+static struct nfs_rpc_ops *nfs_ops[5] = {
+	[2]	= &nfs_v2_clientops,
+	[3]	= &nfs_v3_clientops,
+	[4]	= &nfs_v4_clientops,
+};
+
+/*
  * RPC cruft for NFS
  */
 static struct rpc_version *nfs_version[5] = {
@@ -137,6 +152,45 @@ struct nfs_client_initdata {
 	u32 minorversion;
 };
 
+void nfs_register_version(unsigned int version, struct nfs_version_ops *ops)
+{
+	nfs_version_ops[version] = ops;
+	nfs_version[version] = ops->nfs_rpc;
+	nfs_ops[version] = ops->nfs_ops;
+#ifdef CONFIG_NFS_V3_ACL
+	nfsacl_version[version] = ops->nfs_acl;
+#endif
+}
+EXPORT_SYMBOL_GPL(nfs_register_version);
+
+void nfs_unregister_version(unsigned int version)
+{
+	struct nfs_version_ops *ops = nfs_version_ops[version];
+	if (ops != NULL) {
+		nfs_version_ops[version] = NULL;
+		nfs_version[version] = NULL;
+		nfs_ops[version] = NULL;
+#ifdef CONFIG_NFS_V3_ACL
+		nfsacl_version[version] = NULL;
+#endif
+	}
+}
+EXPORT_SYMBOL_GPL(nfs_unregister_version);
+
+void nfs_version_ref(unsigned int version)
+{
+	struct nfs_version_ops *nfs = nfs_version_ops[version];
+	if (nfs != NULL)
+		nfs->version_ref();
+}
+
+void nfs_version_unref(unsigned int version)
+{
+	struct nfs_version_ops *nfs = nfs_version_ops[version];
+	if (nfs != NULL)
+		nfs->version_unref();
+}
+
 /*
  * Allocate a shared client record
  *
@@ -825,7 +879,7 @@ static int nfs_init_server(struct nfs_server *server,
 		.hostname = data->nfs_server.hostname,
 		.addr = (const struct sockaddr *)&data->nfs_server.address,
 		.addrlen = data->nfs_server.addrlen,
-		.rpc_ops = &nfs_v2_clientops,
+		.rpc_ops = nfs_ops[data->version],
 		.proto = data->nfs_server.protocol,
 	};
 	struct rpc_timeout timeparms;
@@ -834,10 +888,10 @@ static int nfs_init_server(struct nfs_server *server,
 
 	dprintk("--> nfs_init_server()\n");
 
-#ifdef CONFIG_NFS_V3
-	if (data->version == 3)
-		cl_init.rpc_ops = &nfs_v3_clientops;
-#endif
+	if (cl_init.rpc_ops == NULL) {
+		error = -EPROTONOSUPPORT;
+		goto out;
+	}
 
 	nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
 			data->timeo, data->retrans);
@@ -899,6 +953,7 @@ static int nfs_init_server(struct nfs_server *server,
 error:
 	server->nfs_client = NULL;
 	nfs_put_client(clp);
+out:
 	dprintk("<-- nfs_init_server() = xerror %d\n", error);
 	return error;
 }
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index eca56d4..90389ca 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -19,6 +19,7 @@
 #include <linux/time.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/export.h>
 #include <linux/fcntl.h>
 #include <linux/stat.h>
 #include <linux/nfs_fs.h>
@@ -865,6 +866,7 @@ const struct file_operations nfs_file_operations = {
 	.check_flags	= nfs_check_flags,
 	.setlease	= nfs_setlease,
 };
+EXPORT_SYMBOL_GPL(nfs_file_operations);
 
 #ifdef CONFIG_NFS_V4
 static int
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 3f4d957..93a0ba2 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -68,6 +68,21 @@ struct nfs_clone_mount {
 	rpc_authflavor_t authflavor;
 };
 
+struct nfs_version_ops {
+	struct rpc_version *nfs_rpc;
+	struct nfs_rpc_ops *nfs_ops;
+#ifdef CONFIG_NFS_V3_ACL
+	struct rpc_version *nfs_acl;
+#endif
+	void (*version_ref)(void);
+	void (*version_unref)(void);
+};
+
+void nfs_register_version(unsigned int, struct nfs_version_ops *);
+void nfs_unregister_version(unsigned int);
+void nfs_version_ref(unsigned int);
+void nfs_version_unref(unsigned int);
+
 /*
  * Note: RFC 1813 doesn't limit the number of auth flavors that
  * a server can return, so make something up.
diff --git a/fs/nfs/mount_clnt.c b/fs/nfs/mount_clnt.c
index d4c2d6b..323a105 100644
--- a/fs/nfs/mount_clnt.c
+++ b/fs/nfs/mount_clnt.c
@@ -190,6 +190,7 @@ int nfs_mount(struct nfs_mount_request *info)
 		goto out_mnt_err;
 
 	dprintk("NFS: MNT request succeeded\n");
+	nfs_version_ref(info->version);
 	status = 0;
 
 out:
diff --git a/fs/nfs/nfs3/nfs3proc.c b/fs/nfs/nfs3/nfs3proc.c
index f37ddb9..593a44c 100644
--- a/fs/nfs/nfs3/nfs3proc.c
+++ b/fs/nfs/nfs3/nfs3proc.c
@@ -848,7 +848,7 @@ nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl)
 	return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl);
 }
 
-const struct nfs_rpc_ops nfs_v3_clientops = {
+struct nfs_rpc_ops nfs_v3_clientops = {
 	.version	= 3,			/* protocol version */
 	.dentry_ops	= &nfs_dentry_operations,
 	.dir_inode_ops	= &nfs3_dir_inode_operations,
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index be2bbac..58bb8d2 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6247,7 +6247,7 @@ static const struct inode_operations nfs4_file_inode_operations = {
 	.removexattr	= generic_removexattr,
 };
 
-const struct nfs_rpc_ops nfs_v4_clientops = {
+struct nfs_rpc_ops nfs_v4_clientops = {
 	.version	= 4,			/* protocol version */
 	.dentry_ops	= &nfs4_dentry_operations,
 	.dir_inode_ops	= &nfs4_dir_inode_operations,
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index f48125d..d3eb291 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -705,7 +705,7 @@ out_einval:
 	return -EINVAL;
 }
 
-const struct nfs_rpc_ops nfs_v2_clientops = {
+struct nfs_rpc_ops nfs_v2_clientops = {
 	.version	= 2,		       /* protocol version */
 	.dentry_ops	= &nfs_dentry_operations,
 	.dir_inode_ops	= &nfs_dir_inode_operations,
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 1347774..96967ff 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2334,6 +2334,7 @@ static void nfs_kill_super(struct super_block *s)
 
 	kill_anon_super(s);
 	nfs_fscache_release_super_cookie(s);
+	nfs_version_unref(server->nfs_client->rpc_ops->version);
 	nfs_free_server(server);
 }
 
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 2a7c533..6004f5c 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1260,9 +1260,9 @@ struct nfs_rpc_ops {
 /*
  * Function vectors etc. for the NFS client
  */
-extern const struct nfs_rpc_ops	nfs_v2_clientops;
-extern const struct nfs_rpc_ops	nfs_v3_clientops;
-extern const struct nfs_rpc_ops	nfs_v4_clientops;
+extern struct nfs_rpc_ops	nfs_v2_clientops;
+extern struct nfs_rpc_ops	nfs_v3_clientops;
+extern struct nfs_rpc_ops	nfs_v4_clientops;
 extern struct rpc_version	nfs_version2;
 extern struct rpc_version	nfs_version3;
 extern struct rpc_version	nfs_version4;
-- 
1.7.7.4


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC 4/4] NFS: Turn NFS v3 into a module
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
                   ` (2 preceding siblings ...)
  2011-11-22 22:58 ` [RFC 3/4] NFS: Add functions for adding new NFS versions bjschuma
@ 2011-11-22 22:58 ` bjschuma
  2011-11-23  2:19 ` [RFC 0/4] NFS: Modularize NFS v3 Boaz Harrosh
  2011-11-23 18:27 ` J. Bruce Fields
  5 siblings, 0 replies; 20+ messages in thread
From: bjschuma @ 2011-11-22 22:58 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

This will allow users to unmap NFS v3 from the kernel memory if they
don't want to use it.  This will also give us a place to put NFS v3
specific code so it doesn't clutter the generic NFS client.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
---
 fs/nfs/Kconfig         |    8 ++++-
 fs/nfs/Makefile        |    3 +-
 fs/nfs/client.c        |    8 ++---
 fs/nfs/dir.c           |   31 --------------------
 fs/nfs/file.c          |   12 -------
 fs/nfs/internal.h      |   10 ++++++
 fs/nfs/nfs3/Makefile   |    7 ++++
 fs/nfs/nfs3/module.c   |   75 ++++++++++++++++++++++++++++++++++++++++++++++++
 fs/nfs/nfs3/nfs3.h     |    7 ++++
 fs/nfs/nfs3/nfs3proc.c |    1 +
 fs/nfs/nfs3/nfs3xdr.c  |    1 +
 11 files changed, 111 insertions(+), 52 deletions(-)
 create mode 100644 fs/nfs/nfs3/Makefile
 create mode 100644 fs/nfs/nfs3/module.c
 create mode 100644 fs/nfs/nfs3/nfs3.h

diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index dbcd821..47195e0 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -29,15 +29,19 @@ config NFS_FS
 
 	  If unsure, say N.
 
-config NFS_V3
-	bool "NFS client support for NFS version 3"
+config NFS_VERSION_3
+	tristate "NFS client support for NFS version 3"
 	depends on NFS_FS
+	select NFS_V3
 	help
 	  This option enables support for version 3 of the NFS protocol
 	  (RFC 1813) in the kernel's NFS client.
 
 	  If unsure, say Y.
 
+config NFS_V3
+	bool
+
 config NFS_V3_ACL
 	bool "NFS client support for the NFSv3 ACL protocol extension"
 	depends on NFS_V3
diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
index ac0e5df..930913d 100644
--- a/fs/nfs/Makefile
+++ b/fs/nfs/Makefile
@@ -9,8 +9,6 @@ nfs-y 			:= client.o dir.o file.o getroot.o inode.o super.o nfs2xdr.o \
 			   write.o namespace.o mount_clnt.o \
 			   dns_resolve.o cache_lib.o
 nfs-$(CONFIG_ROOT_NFS)	+= nfsroot.o
-nfs-$(CONFIG_NFS_V3)	+= nfs3/nfs3proc.o nfs3/nfs3xdr.o
-nfs-$(CONFIG_NFS_V3_ACL)	+= nfs3/nfs3acl.o
 nfs-$(CONFIG_NFS_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \
 			   delegation.o idmap.o \
 			   callback.o callback_xdr.o callback_proc.o \
@@ -22,5 +20,6 @@ nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o
 obj-$(CONFIG_PNFS_FILE_LAYOUT) += nfs_layout_nfsv41_files.o
 nfs_layout_nfsv41_files-y := nfs4filelayout.o nfs4filelayoutdev.o
 
+obj-$(CONFIG_NFS_VERSION_3) += nfs3/
 obj-$(CONFIG_PNFS_OBJLAYOUT) += objlayout/
 obj-$(CONFIG_PNFS_BLOCK) += blocklayout/
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 9e77056..e4cb43b 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -97,7 +97,7 @@ static struct nfs_version_ops *nfs_version_ops[5] = {
 
 static struct nfs_rpc_ops *nfs_ops[5] = {
 	[2]	= &nfs_v2_clientops,
-	[3]	= &nfs_v3_clientops,
+	[3]	= NULL,
 	[4]	= &nfs_v4_clientops,
 };
 
@@ -106,9 +106,7 @@ static struct nfs_rpc_ops *nfs_ops[5] = {
  */
 static struct rpc_version *nfs_version[5] = {
 	[2]			= &nfs_version2,
-#ifdef CONFIG_NFS_V3
-	[3]			= &nfs_version3,
-#endif
+	[3]			= NULL,
 #ifdef CONFIG_NFS_V4
 	[4]			= &nfs_version4,
 #endif
@@ -131,7 +129,7 @@ struct rpc_stat nfs_rpcstat = {
 #ifdef CONFIG_NFS_V3_ACL
 static struct rpc_stat		nfsacl_rpcstat = { &nfsacl_program };
 static struct rpc_version *	nfsacl_version[] = {
-	[3]			= &nfsacl_version3,
+	[3]			= NULL,
 };
 
 struct rpc_program		nfsacl_program = {
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index f7cb6b6..25dbc54 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -47,16 +47,6 @@
 static int nfs_opendir(struct inode *, struct file *);
 static int nfs_closedir(struct inode *, struct file *);
 static int nfs_readdir(struct file *, void *, filldir_t);
-struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *);
-int nfs_create(struct inode *, struct dentry *, int, struct nameidata *);
-int nfs_mkdir(struct inode *, struct dentry *, int);
-int nfs_rmdir(struct inode *, struct dentry *);
-int nfs_unlink(struct inode *, struct dentry *);
-int nfs_symlink(struct inode *, struct dentry *, const char *);
-int nfs_link(struct dentry *, struct inode *, struct dentry *);
-int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
-int nfs_rename(struct inode *, struct dentry *,
-		      struct inode *, struct dentry *);
 static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
 static loff_t nfs_llseek_dir(struct file *, loff_t, int);
 static void nfs_readdir_clear_array(struct page*);
@@ -89,27 +79,6 @@ const struct address_space_operations nfs_dir_aops = {
 	.freepage = nfs_readdir_clear_array,
 };
 
-#ifdef CONFIG_NFS_V3
-const struct inode_operations nfs3_dir_inode_operations = {
-	.create		= nfs_create,
-	.lookup		= nfs_lookup,
-	.link		= nfs_link,
-	.unlink		= nfs_unlink,
-	.symlink	= nfs_symlink,
-	.mkdir		= nfs_mkdir,
-	.rmdir		= nfs_rmdir,
-	.mknod		= nfs_mknod,
-	.rename		= nfs_rename,
-	.permission	= nfs_permission,
-	.getattr	= nfs_getattr,
-	.setattr	= nfs_setattr,
-	.listxattr	= nfs3_listxattr,
-	.getxattr	= nfs3_getxattr,
-	.setxattr	= nfs3_setxattr,
-	.removexattr	= nfs3_removexattr,
-};
-#endif  /* CONFIG_NFS_V3 */
-
 #ifdef CONFIG_NFS_V4
 
 static struct dentry *nfs_atomic_lookup(struct inode *, struct dentry *, struct nameidata *);
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 90389ca..397e5e0 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -49,18 +49,6 @@ const struct inode_operations nfs_file_inode_operations = {
 	.setattr	= nfs_setattr,
 };
 
-#ifdef CONFIG_NFS_V3
-const struct inode_operations nfs3_file_inode_operations = {
-	.permission	= nfs_permission,
-	.getattr	= nfs_getattr,
-	.setattr	= nfs_setattr,
-	.listxattr	= nfs3_listxattr,
-	.getxattr	= nfs3_getxattr,
-	.setxattr	= nfs3_setxattr,
-	.removexattr	= nfs3_removexattr,
-};
-#endif  /* CONFIG_NFS_v3 */
-
 /* Hack for future NFS swap support */
 #ifndef IS_SWAPFILE
 # define IS_SWAPFILE(inode)	(0)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 93a0ba2..e6256f9 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -83,6 +83,16 @@ void nfs_unregister_version(unsigned int);
 void nfs_version_ref(unsigned int);
 void nfs_version_unref(unsigned int);
 
+struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *);
+int nfs_create(struct inode *, struct dentry *, int, struct nameidata *);
+int nfs_mkdir(struct inode *, struct dentry *, int);
+int nfs_rmdir(struct inode *, struct dentry *);
+int nfs_unlink(struct inode *, struct dentry *);
+int nfs_symlink(struct inode *, struct dentry *, const char *);
+int nfs_link(struct dentry *, struct inode *, struct dentry *);
+int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
+int nfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
+
 /*
  * Note: RFC 1813 doesn't limit the number of auth flavors that
  * a server can return, so make something up.
diff --git a/fs/nfs/nfs3/Makefile b/fs/nfs/nfs3/Makefile
new file mode 100644
index 0000000..308123b
--- /dev/null
+++ b/fs/nfs/nfs3/Makefile
@@ -0,0 +1,7 @@
+#
+# Makefile for NFS v3
+#
+obj-$(CONFIG_NFS_VERSION_3) += nfs3.o
+
+nfs3-y := module.o nfs3proc.o nfs3xdr.o
+nfs3-$(CONFIG_NFS_V3_ACL) += nfs3acl.o
diff --git a/fs/nfs/nfs3/module.c b/fs/nfs/nfs3/module.c
new file mode 100644
index 0000000..9c67cd0
--- /dev/null
+++ b/fs/nfs/nfs3/module.c
@@ -0,0 +1,75 @@
+/*
+ * Initialize the NFS v3 module
+ */
+
+#include <linux/module.h>
+#include <linux/nfs_fs.h>
+
+#include "../internal.h"
+#include "nfs3.h"
+
+static void nfs_v3_ref(void)
+{
+	try_module_get(THIS_MODULE);
+}
+
+static void nfs_v3_unref(void)
+{
+	module_put(THIS_MODULE);
+}
+
+const struct inode_operations nfs3_file_inode_operations = {
+	.permission	= nfs_permission,
+	.getattr	= nfs_getattr,
+	.setattr	= nfs_setattr,
+	.listxattr	= nfs3_listxattr,
+	.getxattr	= nfs3_getxattr,
+	.setxattr	= nfs3_setxattr,
+	.removexattr	= nfs3_removexattr,
+};
+
+const struct inode_operations nfs3_dir_inode_operations = {
+	.create		= nfs_create,
+	.lookup		= nfs_lookup,
+	.link		= nfs_link,
+	.unlink		= nfs_unlink,
+	.symlink	= nfs_symlink,
+	.mkdir		= nfs_mkdir,
+	.rmdir		= nfs_rmdir,
+	.mknod		= nfs_mknod,
+	.rename		= nfs_rename,
+	.permission	= nfs_permission,
+	.getattr	= nfs_getattr,
+	.setattr	= nfs_setattr,
+	.listxattr	= nfs3_listxattr,
+	.getxattr	= nfs3_getxattr,
+	.setxattr	= nfs3_setxattr,
+	.removexattr	= nfs3_removexattr,
+};
+
+struct nfs_version_ops nfs_v3_ops = {
+	.nfs_rpc	= &nfs_version3,
+	.nfs_ops	= &nfs_v3_clientops,
+#ifdef CONFIG_NFS_V3_ACL
+	.nfs_acl	= &nfsacl_version3,
+#endif
+	.version_ref	= nfs_v3_ref,
+	.version_unref	= nfs_v3_unref,
+};
+
+static int __init init_nfs_v3(void)
+{
+	nfs_register_version(3, &nfs_v3_ops);
+	return 0;
+}
+
+static void __exit exit_nfs_v3(void)
+{
+	nfs_unregister_version(3);
+}
+
+MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
+MODULE_LICENSE("GPL");
+
+module_init(init_nfs_v3);
+module_exit(exit_nfs_v3);
diff --git a/fs/nfs/nfs3/nfs3.h b/fs/nfs/nfs3/nfs3.h
new file mode 100644
index 0000000..c1e7875
--- /dev/null
+++ b/fs/nfs/nfs3/nfs3.h
@@ -0,0 +1,7 @@
+#ifndef _FS_NFS_NFS3_H
+#define _FS_NFS_NFS3_H
+
+const extern struct inode_operations nfs3_file_inode_operations;
+const extern struct inode_operations nfs3_dir_inode_operations;
+
+#endif /* _FS_NFS_NFS3_H */
diff --git a/fs/nfs/nfs3/nfs3proc.c b/fs/nfs/nfs3/nfs3proc.c
index 593a44c..e574e82 100644
--- a/fs/nfs/nfs3/nfs3proc.c
+++ b/fs/nfs/nfs3/nfs3proc.c
@@ -20,6 +20,7 @@
 
 #include "../iostat.h"
 #include "../internal.h"
+#include "nfs3.h"
 
 #define NFSDBG_FACILITY		NFSDBG_PROC
 
diff --git a/fs/nfs/nfs3/nfs3xdr.c b/fs/nfs/nfs3/nfs3xdr.c
index be27fb8..d59d644 100644
--- a/fs/nfs/nfs3/nfs3xdr.c
+++ b/fs/nfs/nfs3/nfs3xdr.c
@@ -20,6 +20,7 @@
 #include <linux/nfs3.h>
 #include <linux/nfs_fs.h>
 #include <linux/nfsacl.h>
+#include <linux/nfs_xdr.h>
 #include "../internal.h"
 
 #define NFSDBG_FACILITY		NFSDBG_XDR
-- 
1.7.7.4


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
                   ` (3 preceding siblings ...)
  2011-11-22 22:58 ` [RFC 4/4] NFS: Turn NFS v3 into a module bjschuma
@ 2011-11-23  2:19 ` Boaz Harrosh
  2011-11-23  2:41   ` Jim Rees
  2011-11-23 18:27 ` J. Bruce Fields
  5 siblings, 1 reply; 20+ messages in thread
From: Boaz Harrosh @ 2011-11-23  2:19 UTC (permalink / raw)
  To: bjschuma; +Cc: Trond.Myklebust, linux-nfs

On 11/22/2011 02:57 PM, bjschuma@netapp.com wrote:
> From: Bryan Schumaker <bjschuma@netapp.com>
> 
> This set of patches removes NFS v3 from the main NFS kernel module and creates
> a new module containing the proc, xdr, and acl code.  This will give us a
> single directory to put NFS v3 specific code so it doesn't need to be mixed in
> with the generic client stuff.
> 
> I'm sure this could still use a lot of work, but I figured I would wait to see
> what everybody thinks first.  I imagine that once we get an "nfs submodule"
> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
> modules.
> 
> I split the second patch into two to make it easier to see what my changes were
> to get everything to compile.  Hopefully this will save some pain in having to
> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
> command.  I can combine everything in a future version of the patch.
> 

If you give git format-patch the -M switch it will generate a 4 line 
"file move" annotation and will not include the full remove-and-add
patch. It will not work with old versions of patch but we all use
"git am" so you are safe.

Because we never got the 2/4 patch. It was probably too big.

I set my git tree to do the -M by default it's a git config something
something check it out.

Boaz

> Thoughts?
> 
> - Bryan
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-11-23  2:19 ` [RFC 0/4] NFS: Modularize NFS v3 Boaz Harrosh
@ 2011-11-23  2:41   ` Jim Rees
  2011-11-28 14:14     ` Bryan Schumaker
  0 siblings, 1 reply; 20+ messages in thread
From: Jim Rees @ 2011-11-23  2:41 UTC (permalink / raw)
  To: Boaz Harrosh; +Cc: bjschuma, Trond.Myklebust, linux-nfs

Boaz Harrosh wrote:

  I set my git tree to do the -M by default it's a git config something
  something check it out.

Me too.  Not sure, but I think it's this one:
git config --global diff.renames copy

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
                   ` (4 preceding siblings ...)
  2011-11-23  2:19 ` [RFC 0/4] NFS: Modularize NFS v3 Boaz Harrosh
@ 2011-11-23 18:27 ` J. Bruce Fields
  5 siblings, 0 replies; 20+ messages in thread
From: J. Bruce Fields @ 2011-11-23 18:27 UTC (permalink / raw)
  To: bjschuma; +Cc: Trond.Myklebust, linux-nfs

On Tue, Nov 22, 2011 at 05:57:59PM -0500, bjschuma@netapp.com wrote:
> From: Bryan Schumaker <bjschuma@netapp.com>
> 
> This set of patches removes NFS v3 from the main NFS kernel module and creates
> a new module containing the proc, xdr, and acl code.  This will give us a
> single directory to put NFS v3 specific code so it doesn't need to be mixed in
> with the generic client stuff.
> 
> I'm sure this could still use a lot of work, but I figured I would wait to see
> what everybody thinks first.  I imagine that once we get an "nfs submodule"
> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
> modules.
> 
> I split the second patch into two to make it easier to see what my changes were
> to get everything to compile.  Hopefully this will save some pain in having to
> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
> command.  I can combine everything in a future version of the patch.
> 
> Thoughts?

Is this purely cleanup, or is there some practical reason why people
need to be able to unload v3 at runtime?

--b.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-11-23  2:41   ` Jim Rees
@ 2011-11-28 14:14     ` Bryan Schumaker
  0 siblings, 0 replies; 20+ messages in thread
From: Bryan Schumaker @ 2011-11-28 14:14 UTC (permalink / raw)
  To: Jim Rees; +Cc: Boaz Harrosh, Trond.Myklebust, linux-nfs

On 11/22/11 21:41, Jim Rees wrote:
> Boaz Harrosh wrote:
> 
>   I set my git tree to do the -M by default it's a git config something
>   something check it out.
> 
> Me too.  Not sure, but I think it's this one:
> git config --global diff.renames copy

I'll set up those options now.  Thanks for the tips!

- Bryan


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2012-01-10 17:42 ` Stanislav Kinsbursky
@ 2012-01-10 17:58   ` Bryan Schumaker
  0 siblings, 0 replies; 20+ messages in thread
From: Bryan Schumaker @ 2012-01-10 17:58 UTC (permalink / raw)
  To: Stanislav Kinsbursky; +Cc: Trond.Myklebust@netapp.com, linux-nfs

On Tue Jan 10 12:42:52 2012, Stanislav Kinsbursky wrote:
> Hi, Bryan.
> Are you still on progress with this stuff?

Yeah, I'm still working on this.  I'm taking a final pass over my 
patches now to see if I need to change anything else before posting 
them.  They should be ready soon.

- Bryan

> I'm wondering, because I have to reorganize RPC versions and programs code in the way to collect statistics per container. I actually have few patches already, which implements functionality similar to your new versions adding.
> And thus it would be great to know, do i need to take your work into account or not.
>



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 16:48 bjschuma
  2011-12-01 17:36 ` Jim Rees
  2011-12-01 21:05 ` Steve Dickson
@ 2012-01-10 17:42 ` Stanislav Kinsbursky
  2012-01-10 17:58   ` Bryan Schumaker
  2 siblings, 1 reply; 20+ messages in thread
From: Stanislav Kinsbursky @ 2012-01-10 17:42 UTC (permalink / raw)
  To: bjschuma; +Cc: Trond.Myklebust, linux-nfs

Hi, Bryan.
Are you still on progress with this stuff?
I'm wondering, because I have to reorganize RPC versions and programs code in 
the way to collect statistics per container. I actually have few patches 
already, which implements functionality similar to your new versions adding.
And thus it would be great to know, do i need to take your work into account or not.

-- 
Best regards,
Stanislav Kinsbursky

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-02  2:01     ` Steve Dickson
@ 2011-12-02 16:24       ` J. Bruce Fields
  0 siblings, 0 replies; 20+ messages in thread
From: J. Bruce Fields @ 2011-12-02 16:24 UTC (permalink / raw)
  To: Steve Dickson; +Cc: Bryan Schumaker, trond.myklebust, linux-nfs

On Thu, Dec 01, 2011 at 09:01:47PM -0500, Steve Dickson wrote:
> 
> 
> On 12/01/2011 04:55 PM, Bryan Schumaker wrote:
> > On Thu Dec  1 16:05:03 2011, Steve Dickson wrote:
> >> Now what is the motivating reason behind this re-architecture
> >> other than making the upstream kernel literally impossible to 
> >> back port to older kernels?? 
> >>
> > I wasn't thinking about backporting when I did this... is there a 
> > better way to do this that wouldn't make it a pain to backport?
> Yeah... Don't do it! 8-) Major architectural changes always destroy
> any all chances of clean back ports... That's why they are generally 
> done on major releases... the when 3.X was released... 

There was nothing special about 3.0 other than the name; it could just
as easily have been called 2.6.40.

But anyway I don't see the big problem for backports.  Probably git can
deal with the renames automatically, and even if it can't the fixup is
going to be pretty obvious.  This isn't like the xdr changes that
touched so many lines, it's mainly just a simple rename.

--b.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 21:57     ` Trond Myklebust
@ 2011-12-02  2:38       ` Steve Dickson
  0 siblings, 0 replies; 20+ messages in thread
From: Steve Dickson @ 2011-12-02  2:38 UTC (permalink / raw)
  To: Trond Myklebust; +Cc: Bryan Schumaker, linux-nfs



On 12/01/2011 04:57 PM, Trond Myklebust wrote:
> On Thu, 2011-12-01 at 16:55 -0500, Bryan Schumaker wrote: 
>> On Thu Dec  1 16:05:03 2011, Steve Dickson wrote:
>>>
>>>
>>> On 12/01/2011 11:48 AM, bjschuma@netapp.com wrote:
>>>> From: Bryan Schumaker <bjschuma@netapp.com>
>>>>
>>>> This set of patches removes NFS v3 from the main NFS kernel module and creates
>>>> a new module containing the proc, xdr, and acl code.  This will give us a
>>>> single directory to put NFS v3 specific code so it doesn't need to be mixed in
>>>> with the generic client stuff.
>>>>
>>>> I'm sure this could still use a lot of work, but I figured I would wait to see
>>>> what everybody thinks first.  I imagine that once we get an "nfs submodule"
>>>> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
>>>> modules.
>>>>
>>>> I split the second patch into two to make it easier to see what my changes were
>>>> to get everything to compile.  Hopefully this will save some pain in having to
>>>> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
>>>> command.  I can combine everything in a future version of the patch.
>>>>
>>>> v2:
>>>>   - I set the "diff.renames copy" git config option to create a smaller second
>>>>     patch.  Maybe this time it won't get me kicked off the mailing list...
>>>>     Thanks to Boaz and Jim for the tip!
>>>>
>>>> Thoughts?
>>> Now what is the motivating reason behind this re-architecture
>>> other than making the upstream kernel literally impossible to 
>>> back port to older kernels?? 
>>>
>> I wasn't thinking about backporting when I did this... is there a 
>> better way to do this that wouldn't make it a pain to backport?
>>
>> My thought was that it would help clean things up a bit by adding a bit 
>> of separation between the nfs client and each nfs protocol.  It would 
>> also allow user to decide what they need at run time rather than at 
>> compile time.
> 
> It would also be nice to do the same for NFSv2 next. Then maybe we can
> tackle NFSv4...
Why? Just for legacy reasons... why not just leave the v2/v3 support
in the nfs module and break out the v4 code in its own module. 
Have a module called nfsv4. Possibly have different modules for 
different v4 versions... even layer the modules... 

Start with a nfsv4 module. Then have a nfsv41 which is depend on 
the nfsv4 module. Then a nfsv42 module which depend on a nfsv41 
module, etc...  

I'm guessing this push to modularize the code is to make it easier
to eventually stop supporting older protocol version like v2 and
v3... which is understandable... but v2/v3 code is the legacy code..
Why not just remove the old from the new, which, at the end of the
day, would make it easier to maintain the legacy code... IMHO...

steved.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 21:55   ` Bryan Schumaker
  2011-12-01 21:57     ` Trond Myklebust
@ 2011-12-02  2:01     ` Steve Dickson
  2011-12-02 16:24       ` J. Bruce Fields
  1 sibling, 1 reply; 20+ messages in thread
From: Steve Dickson @ 2011-12-02  2:01 UTC (permalink / raw)
  To: Bryan Schumaker; +Cc: trond.myklebust, linux-nfs



On 12/01/2011 04:55 PM, Bryan Schumaker wrote:
> On Thu Dec  1 16:05:03 2011, Steve Dickson wrote:
>>
>>
>> On 12/01/2011 11:48 AM, bjschuma@netapp.com wrote:
>>> From: Bryan Schumaker <bjschuma@netapp.com>
>>>
>>> This set of patches removes NFS v3 from the main NFS kernel module and creates
>>> a new module containing the proc, xdr, and acl code.  This will give us a
>>> single directory to put NFS v3 specific code so it doesn't need to be mixed in
>>> with the generic client stuff.
>>>
>>> I'm sure this could still use a lot of work, but I figured I would wait to see
>>> what everybody thinks first.  I imagine that once we get an "nfs submodule"
>>> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
>>> modules.
>>>
>>> I split the second patch into two to make it easier to see what my changes were
>>> to get everything to compile.  Hopefully this will save some pain in having to
>>> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
>>> command.  I can combine everything in a future version of the patch.
>>>
>>> v2:
>>>   - I set the "diff.renames copy" git config option to create a smaller second
>>>     patch.  Maybe this time it won't get me kicked off the mailing list...
>>>     Thanks to Boaz and Jim for the tip!
>>>
>>> Thoughts?
>> Now what is the motivating reason behind this re-architecture
>> other than making the upstream kernel literally impossible to 
>> back port to older kernels?? 
>>
> I wasn't thinking about backporting when I did this... is there a 
> better way to do this that wouldn't make it a pain to backport?
Yeah... Don't do it! 8-) Major architectural changes always destroy
any all chances of clean back ports... That's why they are generally 
done on major releases... the when 3.X was released... 

> 
> My thought was that it would help clean things up a bit by adding a bit 
> of separation between the nfs client and each nfs protocol.  It would 
> also allow user to decide what they need at run time rather than at 
> compile time.
At the end of the day, I don't think many people care what modules are
or are not loaded as long as performance and stability are not
effected... How many system admins know or even use the lsmod 
command... not many I would guess... 

steved.
 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 21:55   ` Bryan Schumaker
@ 2011-12-01 21:57     ` Trond Myklebust
  2011-12-02  2:38       ` Steve Dickson
  2011-12-02  2:01     ` Steve Dickson
  1 sibling, 1 reply; 20+ messages in thread
From: Trond Myklebust @ 2011-12-01 21:57 UTC (permalink / raw)
  To: Bryan Schumaker; +Cc: Steve Dickson, linux-nfs

On Thu, 2011-12-01 at 16:55 -0500, Bryan Schumaker wrote: 
> On Thu Dec  1 16:05:03 2011, Steve Dickson wrote:
> >
> >
> > On 12/01/2011 11:48 AM, bjschuma@netapp.com wrote:
> >> From: Bryan Schumaker <bjschuma@netapp.com>
> >>
> >> This set of patches removes NFS v3 from the main NFS kernel module and creates
> >> a new module containing the proc, xdr, and acl code.  This will give us a
> >> single directory to put NFS v3 specific code so it doesn't need to be mixed in
> >> with the generic client stuff.
> >>
> >> I'm sure this could still use a lot of work, but I figured I would wait to see
> >> what everybody thinks first.  I imagine that once we get an "nfs submodule"
> >> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
> >> modules.
> >>
> >> I split the second patch into two to make it easier to see what my changes were
> >> to get everything to compile.  Hopefully this will save some pain in having to
> >> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
> >> command.  I can combine everything in a future version of the patch.
> >>
> >> v2:
> >>   - I set the "diff.renames copy" git config option to create a smaller second
> >>     patch.  Maybe this time it won't get me kicked off the mailing list...
> >>     Thanks to Boaz and Jim for the tip!
> >>
> >> Thoughts?
> > Now what is the motivating reason behind this re-architecture
> > other than making the upstream kernel literally impossible to 
> > back port to older kernels?? 
> >
> I wasn't thinking about backporting when I did this... is there a 
> better way to do this that wouldn't make it a pain to backport?
> 
> My thought was that it would help clean things up a bit by adding a bit 
> of separation between the nfs client and each nfs protocol.  It would 
> also allow user to decide what they need at run time rather than at 
> compile time.

It would also be nice to do the same for NFSv2 next. Then maybe we can
tackle NFSv4...

Cheers
  Trond
-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@netapp.com
www.netapp.com


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 21:05 ` Steve Dickson
@ 2011-12-01 21:55   ` Bryan Schumaker
  2011-12-01 21:57     ` Trond Myklebust
  2011-12-02  2:01     ` Steve Dickson
  0 siblings, 2 replies; 20+ messages in thread
From: Bryan Schumaker @ 2011-12-01 21:55 UTC (permalink / raw)
  To: Steve Dickson; +Cc: trond.myklebust, linux-nfs

On Thu Dec  1 16:05:03 2011, Steve Dickson wrote:
>
>
> On 12/01/2011 11:48 AM, bjschuma@netapp.com wrote:
>> From: Bryan Schumaker <bjschuma@netapp.com>
>>
>> This set of patches removes NFS v3 from the main NFS kernel module and creates
>> a new module containing the proc, xdr, and acl code.  This will give us a
>> single directory to put NFS v3 specific code so it doesn't need to be mixed in
>> with the generic client stuff.
>>
>> I'm sure this could still use a lot of work, but I figured I would wait to see
>> what everybody thinks first.  I imagine that once we get an "nfs submodule"
>> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
>> modules.
>>
>> I split the second patch into two to make it easier to see what my changes were
>> to get everything to compile.  Hopefully this will save some pain in having to
>> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
>> command.  I can combine everything in a future version of the patch.
>>
>> v2:
>>   - I set the "diff.renames copy" git config option to create a smaller second
>>     patch.  Maybe this time it won't get me kicked off the mailing list...
>>     Thanks to Boaz and Jim for the tip!
>>
>> Thoughts?
> Now what is the motivating reason behind this re-architecture
> other than making the upstream kernel literally impossible to 
> back port to older kernels?? 
>
I wasn't thinking about backporting when I did this... is there a 
better way to do this that wouldn't make it a pain to backport?

My thought was that it would help clean things up a bit by adding a bit 
of separation between the nfs client and each nfs protocol.  It would 
also allow user to decide what they need at run time rather than at 
compile time.

> steved.



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 16:48 bjschuma
  2011-12-01 17:36 ` Jim Rees
@ 2011-12-01 21:05 ` Steve Dickson
  2011-12-01 21:55   ` Bryan Schumaker
  2012-01-10 17:42 ` Stanislav Kinsbursky
  2 siblings, 1 reply; 20+ messages in thread
From: Steve Dickson @ 2011-12-01 21:05 UTC (permalink / raw)
  To: bjschuma; +Cc: Trond.Myklebust, linux-nfs



On 12/01/2011 11:48 AM, bjschuma@netapp.com wrote:
> From: Bryan Schumaker <bjschuma@netapp.com>
> 
> This set of patches removes NFS v3 from the main NFS kernel module and creates
> a new module containing the proc, xdr, and acl code.  This will give us a
> single directory to put NFS v3 specific code so it doesn't need to be mixed in
> with the generic client stuff.
> 
> I'm sure this could still use a lot of work, but I figured I would wait to see
> what everybody thinks first.  I imagine that once we get an "nfs submodule"
> system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
> modules.
> 
> I split the second patch into two to make it easier to see what my changes were
> to get everything to compile.  Hopefully this will save some pain in having to
> look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
> command.  I can combine everything in a future version of the patch.
> 
> v2:
>   - I set the "diff.renames copy" git config option to create a smaller second
>     patch.  Maybe this time it won't get me kicked off the mailing list...
>     Thanks to Boaz and Jim for the tip!
> 
> Thoughts?
Now what is the motivating reason behind this re-architecture
other than making the upstream kernel literally impossible to 
back port to older kernels?? 

steved.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 17:36 ` Jim Rees
@ 2011-12-01 19:56   ` Bryan Schumaker
  0 siblings, 0 replies; 20+ messages in thread
From: Bryan Schumaker @ 2011-12-01 19:56 UTC (permalink / raw)
  To: Jim Rees; +Cc: linux-nfs

On Thu Dec  1 12:36:42 2011, Jim Rees wrote:
> bjschuma@netapp.com wrote:
>
>   From: Bryan Schumaker <bjschuma@netapp.com>
>   
>   This set of patches removes NFS v3 from the main NFS kernel module and creates
>   a new module containing the proc, xdr, and acl code.  This will give us a
>   single directory to put NFS v3 specific code so it doesn't need to be mixed in
>   with the generic client stuff.
>
> Thanks!  Is v4 next?  This will come in handy when we implement v5.

I wonder if there would be a sane way of creating modules for minor 
versions of v4 rather than waiting for v5?
>
> But seriously...  If we take this to its logical conclusion, won't we need a
> subdirectory for nfs4?  And if we do that, will block and object layout be
> subdirectories of nfs, or of v4?

Yeah, there would be a v4 subdirectory.  I would expect that they would 
be moved to subdirectories of v4, since they shouldn't be needed for 
generic NFS, v2 or v3.
>
> And while we're at it, should file layout move to a subdir like block and
> object?

That would make sense to me.  It would be more consistent with what the 
other layout modules are doing.

>
> And what about v2?  There's only nfs2xdr.c, so a subdir seems like overkill.

v2 also has proc.c, it's just not named "nfs2proc.c".  Right now, 
turning on CONFIG_NFS_FS will always turn on v2, so unless this is 
changed it won't need a separate subdirectory.  Another thought: would 
there be any benefit to splitting nfs*proc.c and/or nfs*xdr.c into 
multiple files?



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC 0/4] NFS: Modularize NFS v3
  2011-12-01 16:48 bjschuma
@ 2011-12-01 17:36 ` Jim Rees
  2011-12-01 19:56   ` Bryan Schumaker
  2011-12-01 21:05 ` Steve Dickson
  2012-01-10 17:42 ` Stanislav Kinsbursky
  2 siblings, 1 reply; 20+ messages in thread
From: Jim Rees @ 2011-12-01 17:36 UTC (permalink / raw)
  To: bjschuma; +Cc: linux-nfs

bjschuma@netapp.com wrote:

  From: Bryan Schumaker <bjschuma@netapp.com>
  
  This set of patches removes NFS v3 from the main NFS kernel module and creates
  a new module containing the proc, xdr, and acl code.  This will give us a
  single directory to put NFS v3 specific code so it doesn't need to be mixed in
  with the generic client stuff.

Thanks!  Is v4 next?  This will come in handy when we implement v5.

But seriously...  If we take this to its logical conclusion, won't we need a
subdirectory for nfs4?  And if we do that, will block and object layout be
subdirectories of nfs, or of v4?

And while we're at it, should file layout move to a subdir like block and
object?

And what about v2?  There's only nfs2xdr.c, so a subdir seems like overkill.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC 0/4] NFS: Modularize NFS v3
@ 2011-12-01 16:48 bjschuma
  2011-12-01 17:36 ` Jim Rees
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: bjschuma @ 2011-12-01 16:48 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs, Bryan Schumaker

From: Bryan Schumaker <bjschuma@netapp.com>

This set of patches removes NFS v3 from the main NFS kernel module and creates
a new module containing the proc, xdr, and acl code.  This will give us a
single directory to put NFS v3 specific code so it doesn't need to be mixed in
with the generic client stuff.

I'm sure this could still use a lot of work, but I figured I would wait to see
what everybody thinks first.  I imagine that once we get an "nfs submodule"
system working it'll be easier to convert v2 and v4 (and possibly v4.1?) to
modules.

I split the second patch into two to make it easier to see what my changes were
to get everything to compile.  Hopefully this will save some pain in having to
look through 7000+ line patch that resulted from my `mv nfs3*.c nfs3/`
command.  I can combine everything in a future version of the patch.

v2:
  - I set the "diff.renames copy" git config option to create a smaller second
    patch.  Maybe this time it won't get me kicked off the mailing list...
    Thanks to Boaz and Jim for the tip!

Thoughts?

- Bryan


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2012-01-10 17:58 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-22 22:57 [RFC 0/4] NFS: Modularize NFS v3 bjschuma
2011-11-22 22:58 ` [RFC 1/4] NFS: Export symbols needed by an NFS v3 module bjschuma
2011-11-22 22:58 ` [RFC 2.5/4] NFS: Move the NFS v3 code into its own subdirectory bjschuma
2011-11-22 22:58 ` [RFC 3/4] NFS: Add functions for adding new NFS versions bjschuma
2011-11-22 22:58 ` [RFC 4/4] NFS: Turn NFS v3 into a module bjschuma
2011-11-23  2:19 ` [RFC 0/4] NFS: Modularize NFS v3 Boaz Harrosh
2011-11-23  2:41   ` Jim Rees
2011-11-28 14:14     ` Bryan Schumaker
2011-11-23 18:27 ` J. Bruce Fields
2011-12-01 16:48 bjschuma
2011-12-01 17:36 ` Jim Rees
2011-12-01 19:56   ` Bryan Schumaker
2011-12-01 21:05 ` Steve Dickson
2011-12-01 21:55   ` Bryan Schumaker
2011-12-01 21:57     ` Trond Myklebust
2011-12-02  2:38       ` Steve Dickson
2011-12-02  2:01     ` Steve Dickson
2011-12-02 16:24       ` J. Bruce Fields
2012-01-10 17:42 ` Stanislav Kinsbursky
2012-01-10 17:58   ` Bryan Schumaker

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.