knfsd: exportfs: add procedural interface for NFSD
authorChristoph Hellwig <hch@infradead.org>
Tue, 17 Jul 2007 11:04:30 +0000 (04:04 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 17 Jul 2007 17:23:06 +0000 (10:23 -0700)
Currently NFSD calls directly into filesystems through the export_operations
structure.  I plan to change this interface in various ways in later patches,
and want to avoid the export of the default operations to NFSD, so this patch
adds two simple exportfs_encode_fh/exportfs_decode_fh helpers for NFSD to call
instead of poking into exportfs guts.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/exportfs/expfs.c
fs/nfsd/nfsfh.c
include/linux/exportfs.h

index dd132bb7b8f8c12917962bf503406cb3a5b48cd1..db86006956b0d683480d895cfa701a630d7a30ed 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/fs.h>
 #include <linux/file.h>
 #include <linux/module.h>
+#include <linux/mount.h>
 #include <linux/namei.h>
 
 struct export_operations export_op_default;
@@ -468,6 +469,26 @@ static struct dentry *export_decode_fh(struct super_block *sb, __u32 *fh, int fh
                                   acceptable, context);
 }
 
+int exportfs_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len,
+               int connectable)
+{
+       struct export_operations *nop = dentry->d_sb->s_export_op;
+
+       return CALL(nop, encode_fh)(dentry, fh, max_len, connectable);
+}
+EXPORT_SYMBOL_GPL(exportfs_encode_fh);
+
+struct dentry *exportfs_decode_fh(struct vfsmount *mnt, __u32 *fh, int fh_len,
+               int fileid_type, int (*acceptable)(void *, struct dentry *),
+               void *context)
+{
+       struct export_operations *nop = mnt->mnt_sb->s_export_op;
+
+       return CALL(nop, decode_fh)(mnt->mnt_sb, fh, fh_len, fileid_type,
+                       acceptable, context);
+}
+EXPORT_SYMBOL_GPL(exportfs_decode_fh);
+
 struct export_operations export_op_default = {
        .decode_fh      = export_decode_fh,
        .encode_fh      = export_encode_fh,
@@ -477,7 +498,6 @@ struct export_operations export_op_default = {
        .get_dentry     = get_dentry,
 };
 
-EXPORT_SYMBOL(export_op_default);
 EXPORT_SYMBOL(find_exported_dentry);
 
 MODULE_LICENSE("GPL");
index 0108d3ec1c27e7eed6433286bd5b3f86714539e2..ecf9c361b3f5f5eb93f0af370f6609d6837b6806 100644 (file)
 static int nfsd_nr_verified;
 static int nfsd_nr_put;
 
-extern struct export_operations export_op_default;
-
-#define        CALL(ops,fun) ((ops->fun)?(ops->fun):export_op_default.fun)
-
 /*
  * our acceptability function.
  * if NOSUBTREECHECK, accept anything
@@ -212,11 +208,9 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
                if (fileid_type == 0)
                        dentry = dget(exp->ex_dentry);
                else {
-                       struct export_operations *nop = exp->ex_mnt->mnt_sb->s_export_op;
-                       dentry = CALL(nop,decode_fh)(exp->ex_mnt->mnt_sb,
-                                                    datap, data_left,
-                                                    fileid_type,
-                                                    nfsd_acceptable, exp);
+                       dentry = exportfs_decode_fh(exp->ex_mnt, datap,
+                                       data_left, fileid_type,
+                                       nfsd_acceptable, exp);
                }
                if (dentry == NULL)
                        goto out;
@@ -287,15 +281,13 @@ out:
 static inline int _fh_update(struct dentry *dentry, struct svc_export *exp,
                             __u32 *datap, int *maxsize)
 {
-       struct export_operations *nop = exp->ex_mnt->mnt_sb->s_export_op;
-
        if (dentry == exp->ex_dentry) {
                *maxsize = 0;
                return 0;
        }
 
-       return CALL(nop,encode_fh)(dentry, datap, maxsize,
-                         !(exp->ex_flags&NFSEXP_NOSUBTREECHECK));
+       return exportfs_encode_fh(dentry, datap, maxsize,
+                         !(exp->ex_flags & NFSEXP_NOSUBTREECHECK));
 }
 
 /*
index fdc306fbba5070d34611fe5ca6557fb4255f8ba1..8872fe8392d6f367b443a8b6997ee5aac0894f0a 100644 (file)
@@ -5,6 +5,7 @@
 
 struct dentry;
 struct super_block;
+struct vfsmount;
 
 
 /**
@@ -116,4 +117,10 @@ extern struct dentry *find_exported_dentry(struct super_block *sb, void *obj,
        void *parent, int (*acceptable)(void *context, struct dentry *de),
        void *context);
 
+extern int exportfs_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len,
+       int connectable);
+extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, __u32 *fh,
+       int fh_len, int fileid_type, int (*acceptable)(void *, struct dentry *),
+       void *context);
+
 #endif /* LINUX_EXPORTFS_H */