2012-04-26 20:56:30

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 0/9] Fix SECINFO procedure

From: Bryan Schumaker <[email protected]>

My initial SECINFO implementation was merged in 2.6.39, but accidentally
got disabled in 3.0. These patches re-enable SECINFO as part of LOOKUP
and push it down to the v4 layer, instead of existing as an rpc_op (I
create a "submount" rpc_op instead, see patch 5).

I also noticed that SECINFO_NO_NAME was never run with the current xdr
decoding logic. Patch 6 fixes this problem.

Changes in version 4:
- Reorder patches to fix the bug first and then clean up files

Changes in version 3:
- Don't define decode_secinfo_no_name() if CONFIG_NFS_V4_1 isn't set
- Move around function declerations in header files

Changes in version 2:
- Reorder the patches so I'm not doing cleanup in the beginning
- Don't pre-clone an rpc_clnt for nfs_clone_server, instead fix passing an
rpc_authflavor_t through the nfs_clone_mount data.

Comments are appreciated!

- Bryan

Bryan Schumaker (9):
NFS: Fix SECINFO_NO_NAME
NFS: Handle exceptions coming out of nfs4_proc_fs_locations()
NFS: Do secinfo as part of lookup
NFS: Fix following referral mount points with different security
NFS: Honor the authflavor set in the clone mount data
NFS: Remove unused function nfs_lookup_with_sec()
NFS: Remove secinfo knowledge out of the generic client
NFS: Create a submount rpc_op
NFS: Remove extra rpc_clnt argument to proc_lookup

fs/nfs/client.c | 5 +-
fs/nfs/dir.c | 6 +-
fs/nfs/internal.h | 22 ++------
fs/nfs/namespace.c | 140 ++++++-----------------------------------------
fs/nfs/nfs3proc.c | 3 +-
fs/nfs/nfs4_fs.h | 13 ++++-
fs/nfs/nfs4namespace.c | 107 +++++++++++++++++++++++++++++++++++-
fs/nfs/nfs4proc.c | 111 +++++++++++++++++++++++++++++--------
fs/nfs/nfs4xdr.c | 26 ++++++---
fs/nfs/proc.c | 3 +-
fs/nfs/super.c | 4 +-
include/linux/nfs_xdr.h | 5 +-
12 files changed, 261 insertions(+), 184 deletions(-)

--
1.7.10



2012-04-26 20:56:33

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 8/9] NFS: Create a submount rpc_op

From: Bryan Schumaker <[email protected]>

This simplifies the code for v2 and v3 and gives v4 a chance to decide
on referrals without needing to modify the generic client.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/internal.h | 15 +++-------
fs/nfs/namespace.c | 75 +++++++++++++----------------------------------
fs/nfs/nfs3proc.c | 1 +
fs/nfs/nfs4_fs.h | 2 ++
fs/nfs/nfs4namespace.c | 24 ++++++++++++++-
fs/nfs/nfs4proc.c | 1 +
fs/nfs/proc.c | 1 +
include/linux/nfs_xdr.h | 2 ++
8 files changed, 54 insertions(+), 67 deletions(-)

diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index a7e2497..f4e7066 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -185,17 +185,6 @@ static inline void nfs_fs_proc_exit(void)
}
#endif

-/* nfs4namespace.c */
-#ifdef CONFIG_NFS_V4
-extern struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry);
-#else
-static inline
-struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry)
-{
- return ERR_PTR(-ENOENT);
-}
-#endif
-
/* callback_xdr.c */
extern struct svc_version nfs4_callback_version1;
extern struct svc_version nfs4_callback_version4;
@@ -280,6 +269,10 @@ extern void nfs_sb_deactive(struct super_block *sb);
extern char *nfs_path(char **p, struct dentry *dentry,
char *buffer, ssize_t buflen);
extern struct vfsmount *nfs_d_automount(struct path *path);
+struct vfsmount *nfs_submount(struct nfs_server *, struct dentry *,
+ struct nfs_fh *, struct nfs_fattr *);
+struct vfsmount *nfs_do_submount(struct dentry *, struct nfs_fh *,
+ struct nfs_fattr *, rpc_authflavor_t);

/* getroot.c */
extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *,
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index 2a9591b..e36fd8a 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -26,11 +26,6 @@ static LIST_HEAD(nfs_automount_list);
static DECLARE_DELAYED_WORK(nfs_automount_task, nfs_expire_automounts);
int nfs_mountpoint_expiry_timeout = 500 * HZ;

-static struct vfsmount *nfs_do_submount(struct dentry *dentry,
- struct nfs_fh *fh,
- struct nfs_fattr *fattr,
- rpc_authflavor_t authflavor);
-
/*
* nfs_path - reconstruct the path given an arbitrary dentry
* @base - used to return pointer to the end of devname part of path
@@ -118,35 +113,6 @@ Elong:
return ERR_PTR(-ENAMETOOLONG);
}

-#ifdef CONFIG_NFS_V4
-static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
- struct qstr *name,
- struct nfs_fh *fh,
- struct nfs_fattr *fattr)
-{
- int err;
-
- if (NFS_PROTO(dir)->version == 4)
- return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
-
- err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
- if (err)
- return ERR_PTR(err);
- return rpc_clone_client(NFS_SERVER(dir)->client);
-}
-#else /* CONFIG_NFS_V4 */
-static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
- struct qstr *name,
- struct nfs_fh *fh,
- struct nfs_fattr *fattr)
-{
- int err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
- if (err)
- return ERR_PTR(err);
- return rpc_clone_client(NFS_SERVER(dir)->client);
-}
-#endif /* CONFIG_NFS_V4 */
-
/*
* nfs_d_automount - Handle crossing a mountpoint on the server
* @path - The mountpoint
@@ -162,10 +128,9 @@ static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
struct vfsmount *nfs_d_automount(struct path *path)
{
struct vfsmount *mnt;
- struct dentry *parent;
+ struct nfs_server *server = NFS_SERVER(path->dentry->d_inode);
struct nfs_fh *fh = NULL;
struct nfs_fattr *fattr = NULL;
- struct rpc_clnt *client;

dprintk("--> nfs_d_automount()\n");

@@ -181,21 +146,7 @@ struct vfsmount *nfs_d_automount(struct path *path)

dprintk("%s: enter\n", __func__);

- /* Look it up again to get its attributes */
- parent = dget_parent(path->dentry);
- client = nfs_lookup_mountpoint(parent->d_inode, &path->dentry->d_name, fh, fattr);
- dput(parent);
- if (IS_ERR(client)) {
- mnt = ERR_CAST(client);
- goto out;
- }
-
- if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
- mnt = nfs_do_refmount(client, path->dentry);
- else
- mnt = nfs_do_submount(path->dentry, fh, fattr, client->cl_auth->au_flavor);
- rpc_shutdown_client(client);
-
+ mnt = server->nfs_client->rpc_ops->submount(server, path->dentry, fh, fattr);
if (IS_ERR(mnt))
goto out;

@@ -268,10 +219,8 @@ static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server,
* @authflavor - security flavor to use when performing the mount
*
*/
-static struct vfsmount *nfs_do_submount(struct dentry *dentry,
- struct nfs_fh *fh,
- struct nfs_fattr *fattr,
- rpc_authflavor_t authflavor)
+struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh,
+ struct nfs_fattr *fattr, rpc_authflavor_t authflavor)
{
struct nfs_clone_mount mountdata = {
.sb = dentry->d_sb,
@@ -304,3 +253,19 @@ out:
dprintk("<-- nfs_do_submount() = %p\n", mnt);
return mnt;
}
+
+struct vfsmount *nfs_submount(struct nfs_server *server, struct dentry *dentry,
+ struct nfs_fh *fh, struct nfs_fattr *fattr)
+{
+ int err;
+ struct dentry *parent = dget_parent(dentry);
+
+ /* Look it up again to get its attributes */
+ err = server->nfs_client->rpc_ops->lookup(server->client, parent->d_inode,
+ &dentry->d_name, fh, fattr);
+ dput(parent);
+ if (err != 0)
+ return ERR_PTR(err);
+
+ return nfs_do_submount(dentry, fh, fattr, server->client->cl_auth->au_flavor);
+}
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index 5242eae..d39d1d7 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -876,6 +876,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.file_inode_ops = &nfs3_file_inode_operations,
.file_ops = &nfs_file_operations,
.getroot = nfs3_proc_get_root,
+ .submount = nfs_submount,
.getattr = nfs3_proc_getattr,
.setattr = nfs3_proc_setattr,
.lookup = nfs3_proc_lookup,
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 53a487e..97365b0 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -208,6 +208,8 @@ extern const struct inode_operations nfs4_dir_inode_operations;
/* nfs4namespace.c */
rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *);
struct rpc_clnt *nfs4_create_sec_client(struct rpc_clnt *, struct inode *, struct qstr *);
+struct vfsmount *nfs4_submount(struct nfs_server *, struct dentry *,
+ struct nfs_fh *, struct nfs_fattr *);

/* nfs4proc.c */
extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, struct rpc_cred *, struct nfs4_setclientid_res *);
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
index 56427f1..01f56bb 100644
--- a/fs/nfs/nfs4namespace.c
+++ b/fs/nfs/nfs4namespace.c
@@ -305,7 +305,7 @@ out:
* @dentry - dentry of referral
*
*/
-struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry)
+static struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry)
{
struct vfsmount *mnt = ERR_PTR(-ENOMEM);
struct dentry *parent;
@@ -346,3 +346,25 @@ out:
dprintk("%s: done\n", __func__);
return mnt;
}
+
+struct vfsmount *nfs4_submount(struct nfs_server *server, struct dentry *dentry,
+ struct nfs_fh *fh, struct nfs_fattr *fattr)
+{
+ struct dentry *parent = dget_parent(dentry);
+ struct rpc_clnt *client;
+ struct vfsmount *mnt;
+
+ /* Look it up again to get its attributes and sec flavor */
+ client = nfs4_proc_lookup_mountpoint(parent->d_inode, &dentry->d_name, fh, fattr);
+ dput(parent);
+ if (IS_ERR(client))
+ return ERR_CAST(client);
+
+ if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
+ mnt = nfs_do_refmount(client, dentry);
+ else
+ mnt = nfs_do_submount(dentry, fh, fattr, client->cl_auth->au_flavor);
+
+ rpc_shutdown_client(client);
+ return mnt;
+}
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index ecbbf36..279bbd9 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6557,6 +6557,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.file_inode_ops = &nfs4_file_inode_operations,
.file_ops = &nfs4_file_operations,
.getroot = nfs4_proc_get_root,
+ .submount = nfs4_submount,
.getattr = nfs4_proc_getattr,
.setattr = nfs4_proc_setattr,
.lookup = nfs4_proc_lookup,
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index b63b6f4..8dfe960 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -733,6 +733,7 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.file_inode_ops = &nfs_file_inode_operations,
.file_ops = &nfs_file_operations,
.getroot = nfs_proc_get_root,
+ .submount = nfs_submount,
.getattr = nfs_proc_getattr,
.setattr = nfs_proc_setattr,
.lookup = nfs_proc_lookup,
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 6cba0a1..ada3acd 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1234,6 +1234,8 @@ struct nfs_rpc_ops {

int (*getroot) (struct nfs_server *, struct nfs_fh *,
struct nfs_fsinfo *);
+ struct vfsmount *(*submount) (struct nfs_server *, struct dentry *,
+ struct nfs_fh *, struct nfs_fattr *);
int (*getattr) (struct nfs_server *, struct nfs_fh *,
struct nfs_fattr *);
int (*setattr) (struct dentry *, struct nfs_fattr *,
--
1.7.10


2012-04-26 20:56:32

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 4/9] NFS: Fix following referral mount points with different security

From: Bryan Schumaker <[email protected]>

I create a new proc_lookup_mountpoint() to use when submounting an NFS
v4 share. This function returns an rpc_clnt to use for performing an
fs_locations() call on a referral's mountpoint.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/internal.h | 4 ++--
fs/nfs/namespace.c | 35 +++++++++++++++++++++++++----------
fs/nfs/nfs4_fs.h | 6 ++++--
fs/nfs/nfs4namespace.c | 4 ++--
fs/nfs/nfs4proc.c | 40 ++++++++++++++++++++++++++++++----------
5 files changed, 63 insertions(+), 26 deletions(-)

diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 45966d9..49c09b4 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -186,10 +186,10 @@ static inline void nfs_fs_proc_exit(void)

/* nfs4namespace.c */
#ifdef CONFIG_NFS_V4
-extern struct vfsmount *nfs_do_refmount(struct dentry *dentry);
+extern struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry);
#else
static inline
-struct vfsmount *nfs_do_refmount(struct dentry *dentry)
+struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry)
{
return ERR_PTR(-ENOENT);
}
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index 1807866..779f06a 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -200,6 +200,16 @@ out_shutdown:
out:
return err;
}
+
+static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
+ struct qstr *name,
+ struct nfs_fh *fh,
+ struct nfs_fattr *fattr)
+{
+ if (NFS_PROTO(dir)->version != 4)
+ return rpc_clone_client(NFS_SERVER(dir)->client);
+ return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
+}
#else /* CONFIG_NFS_V4 */
static inline int nfs_lookup_with_sec(struct nfs_server *server,
struct dentry *parent, struct dentry *dentry,
@@ -209,6 +219,14 @@ static inline int nfs_lookup_with_sec(struct nfs_server *server,
{
return -EPERM;
}
+
+static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *inode,
+ struct qstr *name,
+ struct nfs_fh *fh,
+ struct nfs_fattr *fattr)
+{
+ return rpc_clone_client(NFS_SERVER(inode)->client);
+}
#endif /* CONFIG_NFS_V4 */

/*
@@ -226,11 +244,10 @@ static inline int nfs_lookup_with_sec(struct nfs_server *server,
struct vfsmount *nfs_d_automount(struct path *path)
{
struct vfsmount *mnt;
- struct nfs_server *server = NFS_SERVER(path->dentry->d_inode);
struct dentry *parent;
struct nfs_fh *fh = NULL;
struct nfs_fattr *fattr = NULL;
- int err;
+ struct rpc_clnt *client;
rpc_authflavor_t flavor = RPC_AUTH_UNIX;

dprintk("--> nfs_d_automount()\n");
@@ -249,21 +266,19 @@ struct vfsmount *nfs_d_automount(struct path *path)

/* Look it up again to get its attributes */
parent = dget_parent(path->dentry);
- err = server->nfs_client->rpc_ops->lookup(server->client, parent->d_inode,
- &path->dentry->d_name,
- fh, fattr);
- if (err == -EPERM && NFS_PROTO(parent->d_inode)->secinfo != NULL)
- err = nfs_lookup_with_sec(server, parent, path->dentry, path, fh, fattr, &flavor);
+ client = nfs_lookup_mountpoint(parent->d_inode, &path->dentry->d_name, fh, fattr);
dput(parent);
- if (err != 0) {
- mnt = ERR_PTR(err);
+ if (IS_ERR(client)) {
+ mnt = ERR_CAST(client);
goto out;
}

if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
- mnt = nfs_do_refmount(path->dentry);
+ mnt = nfs_do_refmount(client, path->dentry);
else
mnt = nfs_do_submount(path->dentry, fh, fattr, flavor);
+ rpc_shutdown_client(client);
+
if (IS_ERR(mnt))
goto out;

diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index c82c2cd..8d75021 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -216,8 +216,10 @@ extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *);
extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *);
extern int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc);
extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
-extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
- struct nfs4_fs_locations *fs_locations, struct page *page);
+extern int nfs4_proc_fs_locations(struct rpc_clnt *, struct inode *, const struct qstr *,
+ struct nfs4_fs_locations *, struct page *);
+extern struct rpc_clnt *nfs4_proc_lookup_mountpoint(struct inode *, struct qstr *,
+ struct nfs_fh *, struct nfs_fattr *);
extern int nfs4_proc_secinfo(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
extern int nfs4_release_lockowner(struct nfs4_lock_state *);
extern const struct xattr_handler *nfs4_xattr_handlers[];
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
index 199eec5..69ebe03 100644
--- a/fs/nfs/nfs4namespace.c
+++ b/fs/nfs/nfs4namespace.c
@@ -276,7 +276,7 @@ out:
* @dentry - dentry of referral
*
*/
-struct vfsmount *nfs_do_refmount(struct dentry *dentry)
+struct vfsmount *nfs_do_refmount(struct rpc_clnt *client, struct dentry *dentry)
{
struct vfsmount *mnt = ERR_PTR(-ENOMEM);
struct dentry *parent;
@@ -302,7 +302,7 @@ struct vfsmount *nfs_do_refmount(struct dentry *dentry)
dprintk("%s: getting locations for %s/%s\n",
__func__, parent->d_name.name, dentry->d_name.name);

- err = nfs4_proc_fs_locations(parent->d_inode, &dentry->d_name, fs_locations, page);
+ err = nfs4_proc_fs_locations(client, parent->d_inode, &dentry->d_name, fs_locations, page);
dput(parent);
if (err != 0 ||
fs_locations->nlocations <= 0 ||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index d6b1cd0..19c0c8d 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2377,8 +2377,9 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
* Note that we'll actually follow the referral later when
* we detect fsid mismatch in inode revalidation
*/
-static int nfs4_get_referral(struct inode *dir, const struct qstr *name,
- struct nfs_fattr *fattr, struct nfs_fh *fhandle)
+static int nfs4_get_referral(struct rpc_clnt *client, struct inode *dir,
+ const struct qstr *name, struct nfs_fattr *fattr,
+ struct nfs_fh *fhandle)
{
int status = -ENOMEM;
struct page *page = NULL;
@@ -2391,7 +2392,7 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name,
if (locations == NULL)
goto out;

- status = nfs4_proc_fs_locations(dir, name, locations, page);
+ status = nfs4_proc_fs_locations(client, dir, name, locations, page);
if (status != 0)
goto out;
/* Make sure server returned a different fsid for the referral */
@@ -2550,7 +2551,7 @@ static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
err = -ENOENT;
goto out;
case -NFS4ERR_MOVED:
- err = nfs4_get_referral(dir, name, fattr, fhandle);
+ err = nfs4_get_referral(client, dir, name, fattr, fhandle);
goto out;
case -NFS4ERR_WRONGSEC:
err = -EPERM;
@@ -2591,6 +2592,21 @@ static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qst
return status;
}

+struct rpc_clnt *
+nfs4_proc_lookup_mountpoint(struct inode *dir, struct qstr *name,
+ struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+{
+ int status;
+ struct rpc_clnt *client = rpc_clone_client(NFS_CLIENT(dir));
+
+ status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr);
+ if (status < 0) {
+ rpc_shutdown_client(client);
+ return ERR_PTR(status);
+ }
+ return client;
+}
+
static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
{
struct nfs_server *server = NFS_SERVER(inode);
@@ -4949,8 +4965,10 @@ static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
fattr->nlink = 2;
}

-static int _nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
- struct nfs4_fs_locations *fs_locations, struct page *page)
+static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
+ const struct qstr *name,
+ struct nfs4_fs_locations *fs_locations,
+ struct page *page)
{
struct nfs_server *server = NFS_SERVER(dir);
u32 bitmask[2] = {
@@ -4984,19 +5002,21 @@ static int _nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
nfs_fattr_init(&fs_locations->fattr);
fs_locations->server = server;
fs_locations->nlocations = 0;
- status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
+ status = nfs4_call_sync(client, server, &msg, &args.seq_args, &res.seq_res, 0);
dprintk("%s: returned status = %d\n", __func__, status);
return status;
}

-int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
- struct nfs4_fs_locations *fs_locations, struct page *page)
+int nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
+ const struct qstr *name,
+ struct nfs4_fs_locations *fs_locations,
+ struct page *page)
{
struct nfs4_exception exception = { };
int err;
do {
err = nfs4_handle_exception(NFS_SERVER(dir),
- _nfs4_proc_fs_locations(dir, name, fs_locations, page),
+ _nfs4_proc_fs_locations(client, dir, name, fs_locations, page),
&exception);
} while (exception.retry);
return err;
--
1.7.10


2012-04-26 20:56:31

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 1/9] NFS: Fix SECINFO_NO_NAME

From: Bryan Schumaker <[email protected]>

I was using the same decoder function for SECINFO and SECINFO_NO_NAME,
so it was returning an error when it tried to decode an OP_SECINFO_NO_NAME
header as OP_SECINFO.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/nfs4xdr.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 77fc5f9..043c010 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -5090,16 +5090,13 @@ out_err:
return -EINVAL;
}

-static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
+static int decode_secinfo_common(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
{
struct nfs4_secinfo_flavor *sec_flavor;
int status;
__be32 *p;
int i, num_flavors;

- status = decode_op_hdr(xdr, OP_SECINFO);
- if (status)
- goto out;
p = xdr_inline_decode(xdr, 4);
if (unlikely(!p))
goto out_overflow;
@@ -5125,6 +5122,7 @@ static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
res->flavors->num_flavors++;
}

+ status = 0;
out:
return status;
out_overflow:
@@ -5132,7 +5130,23 @@ out_overflow:
return -EIO;
}

+static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
+{
+ int status = decode_op_hdr(xdr, OP_SECINFO);
+ if (status)
+ return status;
+ return decode_secinfo_common(xdr, res);
+}
+
#if defined(CONFIG_NFS_V4_1)
+static int decode_secinfo_no_name(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
+{
+ int status = decode_op_hdr(xdr, OP_SECINFO_NO_NAME);
+ if (status)
+ return status;
+ return decode_secinfo_common(xdr, res);
+}
+
static int decode_exchange_id(struct xdr_stream *xdr,
struct nfs41_exchange_id_res *res)
{
@@ -6817,7 +6831,7 @@ static int nfs4_xdr_dec_secinfo_no_name(struct rpc_rqst *rqstp,
status = decode_putrootfh(xdr);
if (status)
goto out;
- status = decode_secinfo(xdr, res);
+ status = decode_secinfo_no_name(xdr, res);
out:
return status;
}
--
1.7.10


2012-04-27 16:12:18

by Anna Schumaker

[permalink] [raw]
Subject: Re: [PATCH v4 6/9] NFS: Remove unused function nfs_lookup_with_sec()

On 04/27/12 12:06, Myklebust, Trond wrote:

> On Thu, 2012-04-26 at 16:56 -0400, [email protected] wrote:
>> From: Bryan Schumaker <[email protected]>
>>
>> This fixes a compiler warning.
>>
>> Signed-off-by: Bryan Schumaker <[email protected]>
>> ---
>> fs/nfs/namespace.c | 84 ++++++++++------------------------------------------
>> 1 file changed, 15 insertions(+), 69 deletions(-)
>>
>> diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
>> index 779f06a..d51868e 100644
>> --- a/fs/nfs/namespace.c
>> +++ b/fs/nfs/namespace.c
>> @@ -148,84 +148,31 @@ rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
>> return pseudoflavor;
>> }
>>
>> -static int nfs_negotiate_security(const struct dentry *parent,
>> - const struct dentry *dentry,
>> - rpc_authflavor_t *flavor)
>> -{
>> - struct page *page;
>> - struct nfs4_secinfo_flavors *flavors;
>> - int (*secinfo)(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
>> - int ret = -EPERM;
>> -
>> - secinfo = NFS_PROTO(parent->d_inode)->secinfo;
>> - if (secinfo != NULL) {
>> - page = alloc_page(GFP_KERNEL);
>> - if (!page) {
>> - ret = -ENOMEM;
>> - goto out;
>> - }
>> - flavors = page_address(page);
>> - ret = secinfo(parent->d_inode, &dentry->d_name, flavors);
>> - *flavor = nfs_find_best_sec(flavors);
>> - put_page(page);
>> - }
>> -
>> -out:
>> - return ret;
>> -}
>> -
>> -static int nfs_lookup_with_sec(struct nfs_server *server, struct dentry *parent,
>> - struct dentry *dentry, struct path *path,
>> - struct nfs_fh *fh, struct nfs_fattr *fattr,
>> - rpc_authflavor_t *flavor)
>> -{
>> - struct rpc_clnt *clone;
>> - struct rpc_auth *auth;
>> - int err;
>> -
>> - err = nfs_negotiate_security(parent, path->dentry, flavor);
>> - if (err < 0)
>> - goto out;
>> - clone = rpc_clone_client(server->client);
>> - auth = rpcauth_create(*flavor, clone);
>> - if (!auth) {
>> - err = -EIO;
>> - goto out_shutdown;
>> - }
>> - err = server->nfs_client->rpc_ops->lookup(clone, parent->d_inode,
>> - &path->dentry->d_name,
>> - fh, fattr);
>> -out_shutdown:
>> - rpc_shutdown_client(clone);
>> -out:
>> - return err;
>> -}
>> -
>> static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
>> struct qstr *name,
>> struct nfs_fh *fh,
>> struct nfs_fattr *fattr)
>> {
>> - if (NFS_PROTO(dir)->version != 4)
>> - return rpc_clone_client(NFS_SERVER(dir)->client);
>> - return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
>> + int err;
>> +
>> + if (NFS_PROTO(dir)->version == 4)
>> + return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
>> +
>> + err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
>> + if (err)
>> + return ERR_PTR(err);
>> + return rpc_clone_client(NFS_SERVER(dir)->client);
>
> Where does this come from, and how is it relevant to removing
> nfs_lookup_with_sec?


It made sense to me at the time... but it really should be worked into the previous patches. I'll fix that now.

- Bryan

>
>> }
>> #else /* CONFIG_NFS_V4 */
>> -static inline int nfs_lookup_with_sec(struct nfs_server *server,
>> - struct dentry *parent, struct dentry *dentry,
>> - struct path *path, struct nfs_fh *fh,
>> - struct nfs_fattr *fattr,
>> - rpc_authflavor_t *flavor)
>> -{
>> - return -EPERM;
>> -}
>> -
>> -static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *inode,
>> +static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
>> struct qstr *name,
>> struct nfs_fh *fh,
>> struct nfs_fattr *fattr)
>> {
>> - return rpc_clone_client(NFS_SERVER(inode)->client);
>> + int err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
>> + if (err)
>> + return ERR_PTR(err);
>
> Ditto. This definitely belongs in a separate patch.
>
>> + return rpc_clone_client(NFS_SERVER(dir)->client);
>> }
>> #endif /* CONFIG_NFS_V4 */
>>
>> @@ -248,7 +195,6 @@ struct vfsmount *nfs_d_automount(struct path *path)
>> struct nfs_fh *fh = NULL;
>> struct nfs_fattr *fattr = NULL;
>> struct rpc_clnt *client;
>> - rpc_authflavor_t flavor = RPC_AUTH_UNIX;
>>
>> dprintk("--> nfs_d_automount()\n");
>>
>> @@ -276,7 +222,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
>> if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
>> mnt = nfs_do_refmount(client, path->dentry);
>> else
>> - mnt = nfs_do_submount(path->dentry, fh, fattr, flavor);
>> + mnt = nfs_do_submount(path->dentry, fh, fattr, client->cl_auth->au_flavor);
>> rpc_shutdown_client(client);
>>
>> if (IS_ERR(mnt))
>



2012-04-26 20:56:32

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 3/9] NFS: Do secinfo as part of lookup

From: Bryan Schumaker <[email protected]>

Whenever lookup sees wrongsec do a secinfo and retry the lookup to find
attributes of the file or directory, such as "is this a referral
mountpoint?". This also allows me to remove handling -NFS4ERR_WRONSEC
as part of getattr xdr decoding.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/internal.h | 1 -
fs/nfs/nfs4_fs.h | 4 +++
fs/nfs/nfs4namespace.c | 52 +++++++++++++++++++++++++++++++++++++++
fs/nfs/nfs4proc.c | 64 +++++++++++++++++++++++++++++++++++-------------
fs/nfs/nfs4xdr.c | 2 --
5 files changed, 103 insertions(+), 20 deletions(-)

diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 2476dc6..45966d9 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -234,7 +234,6 @@ extern const u32 nfs41_maxwrite_overhead;
/* nfs4proc.c */
#ifdef CONFIG_NFS_V4
extern struct rpc_procinfo nfs4_procedures[];
-void nfs_fixup_secinfo_attributes(struct nfs_fattr *, struct nfs_fh *);
#endif

extern int nfs4_init_ds_session(struct nfs_client *clp);
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index b6db9e3..c82c2cd 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -205,6 +205,9 @@ struct nfs4_state_maintenance_ops {
extern const struct dentry_operations nfs4_dentry_operations;
extern const struct inode_operations nfs4_dir_inode_operations;

+/* nfs4namespace.c */
+struct rpc_clnt *nfs4_create_sec_client(struct rpc_clnt *, struct inode *, struct qstr *);
+
/* nfs4proc.c */
extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, struct rpc_cred *, struct nfs4_setclientid_res *);
extern int nfs4_proc_setclientid_confirm(struct nfs_client *, struct nfs4_setclientid_res *arg, struct rpc_cred *);
@@ -215,6 +218,7 @@ extern int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait, boo
extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
struct nfs4_fs_locations *fs_locations, struct page *page);
+extern int nfs4_proc_secinfo(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
extern int nfs4_release_lockowner(struct nfs4_lock_state *);
extern const struct xattr_handler *nfs4_xattr_handlers[];

diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
index 9c8eca3..199eec5 100644
--- a/fs/nfs/nfs4namespace.c
+++ b/fs/nfs/nfs4namespace.c
@@ -108,6 +108,58 @@ static size_t nfs_parse_server_name(char *string, size_t len,
return ret;
}

+static rpc_authflavor_t nfs4_negotiate_security(struct inode *inode, struct qstr *name)
+{
+ struct page *page;
+ struct nfs4_secinfo_flavors *flavors;
+ rpc_authflavor_t flavor;
+ int err;
+
+ page = alloc_page(GFP_KERNEL);
+ if (!page)
+ return -ENOMEM;
+ flavors = page_address(page);
+
+ err = nfs4_proc_secinfo(inode, name, flavors);
+ if (err < 0) {
+ flavor = err;
+ goto out;
+ }
+
+ flavor = nfs_find_best_sec(flavors);
+
+out:
+ put_page(page);
+ return flavor;
+}
+
+/*
+ * Please call rpc_shutdown_client() when you are done with this client.
+ */
+struct rpc_clnt *nfs4_create_sec_client(struct rpc_clnt *clnt, struct inode *inode,
+ struct qstr *name)
+{
+ struct rpc_clnt *clone;
+ struct rpc_auth *auth;
+ rpc_authflavor_t flavor;
+
+ flavor = nfs4_negotiate_security(inode, name);
+ if (flavor < 0)
+ return ERR_PTR(flavor);
+
+ clone = rpc_clone_client(clnt);
+ if (IS_ERR(clone))
+ return clone;
+
+ auth = rpcauth_create(flavor, clone);
+ if (!auth) {
+ rpc_shutdown_client(clone);
+ clone = ERR_PTR(-EIO);
+ }
+
+ return clone;
+}
+
static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
char *page, char *page2,
const struct nfs4_fs_location *location)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 0de2614..d6b1cd0 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2528,39 +2528,69 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
return status;
}

-void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr, struct nfs_fh *fh)
+static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr)
{
- memset(fh, 0, sizeof(struct nfs_fh));
- fattr->fsid.major = 1;
fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
- NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_FSID | NFS_ATTR_FATTR_MOUNTPOINT;
+ NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_MOUNTPOINT;
fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
fattr->nlink = 2;
}

-static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
- struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
+ struct qstr *name, struct nfs_fh *fhandle,
+ struct nfs_fattr *fattr)
{
struct nfs4_exception exception = { };
+ struct rpc_clnt *client = *clnt;
int err;
do {
- int status;
-
- status = _nfs4_proc_lookup(clnt, dir, name, fhandle, fattr);
- switch (status) {
+ err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr);
+ switch (err) {
case -NFS4ERR_BADNAME:
- return -ENOENT;
+ err = -ENOENT;
+ goto out;
case -NFS4ERR_MOVED:
- return nfs4_get_referral(dir, name, fattr, fhandle);
+ err = nfs4_get_referral(dir, name, fattr, fhandle);
+ goto out;
case -NFS4ERR_WRONGSEC:
- nfs_fixup_secinfo_attributes(fattr, fhandle);
+ err = -EPERM;
+ if (client != *clnt)
+ goto out;
+
+ client = nfs4_create_sec_client(client, dir, name);
+ if (IS_ERR(client))
+ return PTR_ERR(client);
+
+ exception.retry = 1;
+ break;
+ default:
+ err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception);
}
- err = nfs4_handle_exception(NFS_SERVER(dir),
- status, &exception);
} while (exception.retry);
+
+out:
+ if (err == 0)
+ *clnt = client;
+ else if (client != *clnt)
+ rpc_shutdown_client(client);
+
return err;
}

+static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
+ struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+{
+ int status;
+ struct rpc_clnt *client = NFS_CLIENT(dir);
+
+ status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr);
+ if (client != NFS_CLIENT(dir)) {
+ rpc_shutdown_client(client);
+ nfs_fixup_secinfo_attributes(fattr);
+ }
+ return status;
+}
+
static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
{
struct nfs_server *server = NFS_SERVER(inode);
@@ -4994,8 +5024,8 @@ static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct
return status;
}

-static int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
- struct nfs4_secinfo_flavors *flavors)
+int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
+ struct nfs4_secinfo_flavors *flavors)
{
struct nfs4_exception exception = { };
int err;
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 043c010..a95bde8 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -4258,8 +4258,6 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
status = decode_attr_error(xdr, bitmap, &err);
if (status < 0)
goto xdr_error;
- if (err == -NFS4ERR_WRONGSEC)
- nfs_fixup_secinfo_attributes(fattr, fh);

status = decode_attr_filehandle(xdr, bitmap, fh);
if (status < 0)
--
1.7.10


2012-04-26 20:56:31

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 2/9] NFS: Handle exceptions coming out of nfs4_proc_fs_locations()

From: Bryan Schumaker <[email protected]>

We don't want to return -NFS4ERR_WRONGSEC to the VFS because it could
cause the kernel to oops.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/nfs4proc.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 60d5f4c..0de2614 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4919,7 +4919,7 @@ static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
fattr->nlink = 2;
}

-int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
+static int _nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
struct nfs4_fs_locations *fs_locations, struct page *page)
{
struct nfs_server *server = NFS_SERVER(dir);
@@ -4959,6 +4959,19 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
return status;
}

+int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
+ struct nfs4_fs_locations *fs_locations, struct page *page)
+{
+ struct nfs4_exception exception = { };
+ int err;
+ do {
+ err = nfs4_handle_exception(NFS_SERVER(dir),
+ _nfs4_proc_fs_locations(dir, name, fs_locations, page),
+ &exception);
+ } while (exception.retry);
+ return err;
+}
+
static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors)
{
int status;
--
1.7.10


2012-04-26 20:56:32

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 5/9] NFS: Honor the authflavor set in the clone mount data

From: Bryan Schumaker <[email protected]>

The authflavor is set in an nfs_clone_mount structure and passed to the
xdev_mount() functions where it was promptly ignored. Instead, use it
to initialize an rpc_clnt for the cloned server.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/client.c | 5 +++--
fs/nfs/internal.h | 3 ++-
fs/nfs/super.c | 4 ++--
3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index da7b5e4..60f7e4e 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -1729,7 +1729,8 @@ error:
*/
struct nfs_server *nfs_clone_server(struct nfs_server *source,
struct nfs_fh *fh,
- struct nfs_fattr *fattr)
+ struct nfs_fattr *fattr,
+ rpc_authflavor_t flavor)
{
struct nfs_server *server;
struct nfs_fattr *fattr_fsinfo;
@@ -1758,7 +1759,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,

error = nfs_init_server_rpcclient(server,
source->client->cl_timeout,
- source->client->cl_auth->au_flavor);
+ flavor);
if (error < 0)
goto out_free_server;
if (!IS_ERR(source->client_acl))
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 49c09b4..b777bda 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -165,7 +165,8 @@ extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *,
extern void nfs_free_server(struct nfs_server *server);
extern struct nfs_server *nfs_clone_server(struct nfs_server *,
struct nfs_fh *,
- struct nfs_fattr *);
+ struct nfs_fattr *,
+ rpc_authflavor_t);
extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
extern int nfs4_check_client_ready(struct nfs_client *clp);
extern struct nfs_client *nfs4_set_ds_client(struct nfs_client* mds_clp,
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 1e6715f..4ac7fca 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2428,7 +2428,7 @@ nfs_xdev_mount(struct file_system_type *fs_type, int flags,
dprintk("--> nfs_xdev_mount()\n");

/* create a new volume representation */
- server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
+ server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr, data->authflavor);
if (IS_ERR(server)) {
error = PTR_ERR(server);
goto out_err_noserver;
@@ -2955,7 +2955,7 @@ nfs4_xdev_mount(struct file_system_type *fs_type, int flags,
dprintk("--> nfs4_xdev_mount()\n");

/* create a new volume representation */
- server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
+ server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr, data->authflavor);
if (IS_ERR(server)) {
error = PTR_ERR(server);
goto out_err_noserver;
--
1.7.10


2012-04-26 20:56:33

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 6/9] NFS: Remove unused function nfs_lookup_with_sec()

From: Bryan Schumaker <[email protected]>

This fixes a compiler warning.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/namespace.c | 84 ++++++++++------------------------------------------
1 file changed, 15 insertions(+), 69 deletions(-)

diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index 779f06a..d51868e 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -148,84 +148,31 @@ rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
return pseudoflavor;
}

-static int nfs_negotiate_security(const struct dentry *parent,
- const struct dentry *dentry,
- rpc_authflavor_t *flavor)
-{
- struct page *page;
- struct nfs4_secinfo_flavors *flavors;
- int (*secinfo)(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
- int ret = -EPERM;
-
- secinfo = NFS_PROTO(parent->d_inode)->secinfo;
- if (secinfo != NULL) {
- page = alloc_page(GFP_KERNEL);
- if (!page) {
- ret = -ENOMEM;
- goto out;
- }
- flavors = page_address(page);
- ret = secinfo(parent->d_inode, &dentry->d_name, flavors);
- *flavor = nfs_find_best_sec(flavors);
- put_page(page);
- }
-
-out:
- return ret;
-}
-
-static int nfs_lookup_with_sec(struct nfs_server *server, struct dentry *parent,
- struct dentry *dentry, struct path *path,
- struct nfs_fh *fh, struct nfs_fattr *fattr,
- rpc_authflavor_t *flavor)
-{
- struct rpc_clnt *clone;
- struct rpc_auth *auth;
- int err;
-
- err = nfs_negotiate_security(parent, path->dentry, flavor);
- if (err < 0)
- goto out;
- clone = rpc_clone_client(server->client);
- auth = rpcauth_create(*flavor, clone);
- if (!auth) {
- err = -EIO;
- goto out_shutdown;
- }
- err = server->nfs_client->rpc_ops->lookup(clone, parent->d_inode,
- &path->dentry->d_name,
- fh, fattr);
-out_shutdown:
- rpc_shutdown_client(clone);
-out:
- return err;
-}
-
static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
struct qstr *name,
struct nfs_fh *fh,
struct nfs_fattr *fattr)
{
- if (NFS_PROTO(dir)->version != 4)
- return rpc_clone_client(NFS_SERVER(dir)->client);
- return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
+ int err;
+
+ if (NFS_PROTO(dir)->version == 4)
+ return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr);
+
+ err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
+ if (err)
+ return ERR_PTR(err);
+ return rpc_clone_client(NFS_SERVER(dir)->client);
}
#else /* CONFIG_NFS_V4 */
-static inline int nfs_lookup_with_sec(struct nfs_server *server,
- struct dentry *parent, struct dentry *dentry,
- struct path *path, struct nfs_fh *fh,
- struct nfs_fattr *fattr,
- rpc_authflavor_t *flavor)
-{
- return -EPERM;
-}
-
-static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *inode,
+static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
struct qstr *name,
struct nfs_fh *fh,
struct nfs_fattr *fattr)
{
- return rpc_clone_client(NFS_SERVER(inode)->client);
+ int err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr);
+ if (err)
+ return ERR_PTR(err);
+ return rpc_clone_client(NFS_SERVER(dir)->client);
}
#endif /* CONFIG_NFS_V4 */

@@ -248,7 +195,6 @@ struct vfsmount *nfs_d_automount(struct path *path)
struct nfs_fh *fh = NULL;
struct nfs_fattr *fattr = NULL;
struct rpc_clnt *client;
- rpc_authflavor_t flavor = RPC_AUTH_UNIX;

dprintk("--> nfs_d_automount()\n");

@@ -276,7 +222,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
mnt = nfs_do_refmount(client, path->dentry);
else
- mnt = nfs_do_submount(path->dentry, fh, fattr, flavor);
+ mnt = nfs_do_submount(path->dentry, fh, fattr, client->cl_auth->au_flavor);
rpc_shutdown_client(client);

if (IS_ERR(mnt))
--
1.7.10


2012-04-26 20:56:33

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 7/9] NFS: Remove secinfo knowledge out of the generic client

From: Bryan Schumaker <[email protected]>

And also remove the unneeded rpc_op.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/internal.h | 3 ---
fs/nfs/namespace.c | 29 -----------------------------
fs/nfs/nfs4_fs.h | 1 +
fs/nfs/nfs4namespace.c | 29 +++++++++++++++++++++++++++++
fs/nfs/nfs4proc.c | 1 -
include/linux/nfs_xdr.h | 1 -
6 files changed, 30 insertions(+), 34 deletions(-)

diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index b777bda..a7e2497 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -280,9 +280,6 @@ extern void nfs_sb_deactive(struct super_block *sb);
extern char *nfs_path(char **p, struct dentry *dentry,
char *buffer, ssize_t buflen);
extern struct vfsmount *nfs_d_automount(struct path *path);
-#ifdef CONFIG_NFS_V4
-rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *);
-#endif

/* getroot.c */
extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *,
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index d51868e..2a9591b 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -119,35 +119,6 @@ Elong:
}

#ifdef CONFIG_NFS_V4
-rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
-{
- struct gss_api_mech *mech;
- struct xdr_netobj oid;
- int i;
- rpc_authflavor_t pseudoflavor = RPC_AUTH_UNIX;
-
- for (i = 0; i < flavors->num_flavors; i++) {
- struct nfs4_secinfo_flavor *flavor;
- flavor = &flavors->flavors[i];
-
- if (flavor->flavor == RPC_AUTH_NULL || flavor->flavor == RPC_AUTH_UNIX) {
- pseudoflavor = flavor->flavor;
- break;
- } else if (flavor->flavor == RPC_AUTH_GSS) {
- oid.len = flavor->gss.sec_oid4.len;
- oid.data = flavor->gss.sec_oid4.data;
- mech = gss_mech_get_by_OID(&oid);
- if (!mech)
- continue;
- pseudoflavor = gss_svc_to_pseudoflavor(mech, flavor->gss.service);
- gss_mech_put(mech);
- break;
- }
- }
-
- return pseudoflavor;
-}
-
static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,
struct qstr *name,
struct nfs_fh *fh,
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 8d75021..53a487e 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -206,6 +206,7 @@ extern const struct dentry_operations nfs4_dentry_operations;
extern const struct inode_operations nfs4_dir_inode_operations;

/* nfs4namespace.c */
+rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *);
struct rpc_clnt *nfs4_create_sec_client(struct rpc_clnt *, struct inode *, struct qstr *);

/* nfs4proc.c */
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
index 69ebe03..56427f1 100644
--- a/fs/nfs/nfs4namespace.c
+++ b/fs/nfs/nfs4namespace.c
@@ -108,6 +108,35 @@ static size_t nfs_parse_server_name(char *string, size_t len,
return ret;
}

+rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
+{
+ struct gss_api_mech *mech;
+ struct xdr_netobj oid;
+ int i;
+ rpc_authflavor_t pseudoflavor = RPC_AUTH_UNIX;
+
+ for (i = 0; i < flavors->num_flavors; i++) {
+ struct nfs4_secinfo_flavor *flavor;
+ flavor = &flavors->flavors[i];
+
+ if (flavor->flavor == RPC_AUTH_NULL || flavor->flavor == RPC_AUTH_UNIX) {
+ pseudoflavor = flavor->flavor;
+ break;
+ } else if (flavor->flavor == RPC_AUTH_GSS) {
+ oid.len = flavor->gss.sec_oid4.len;
+ oid.data = flavor->gss.sec_oid4.data;
+ mech = gss_mech_get_by_OID(&oid);
+ if (!mech)
+ continue;
+ pseudoflavor = gss_svc_to_pseudoflavor(mech, flavor->gss.service);
+ gss_mech_put(mech);
+ break;
+ }
+ }
+
+ return pseudoflavor;
+}
+
static rpc_authflavor_t nfs4_negotiate_security(struct inode *inode, struct qstr *name)
{
struct page *page;
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 19c0c8d..ecbbf36 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6595,7 +6595,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.close_context = nfs4_close_context,
.open_context = nfs4_atomic_open,
.init_client = nfs4_init_client,
- .secinfo = nfs4_proc_secinfo,
};

static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 7ba3551..6cba0a1 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1289,7 +1289,6 @@ struct nfs_rpc_ops {
struct iattr *iattr);
int (*init_client) (struct nfs_client *, const struct rpc_timeout *,
const char *, rpc_authflavor_t, int);
- int (*secinfo)(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
};

/*
--
1.7.10


2012-04-27 16:06:34

by Myklebust, Trond

[permalink] [raw]
Subject: Re: [PATCH v4 6/9] NFS: Remove unused function nfs_lookup_with_sec()

T24gVGh1LCAyMDEyLTA0LTI2IGF0IDE2OjU2IC0wNDAwLCBianNjaHVtYUBuZXRhcHAuY29tIHdy
b3RlOg0KPiBGcm9tOiBCcnlhbiBTY2h1bWFrZXIgPGJqc2NodW1hQG5ldGFwcC5jb20+DQo+IA0K
PiBUaGlzIGZpeGVzIGEgY29tcGlsZXIgd2FybmluZy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IEJy
eWFuIFNjaHVtYWtlciA8YmpzY2h1bWFAbmV0YXBwLmNvbT4NCj4gLS0tDQo+ICBmcy9uZnMvbmFt
ZXNwYWNlLmMgfCAgIDg0ICsrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0NCj4gIDEgZmlsZSBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCA2OSBkZWxl
dGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9mcy9uZnMvbmFtZXNwYWNlLmMgYi9mcy9uZnMv
bmFtZXNwYWNlLmMNCj4gaW5kZXggNzc5ZjA2YS4uZDUxODY4ZSAxMDA2NDQNCj4gLS0tIGEvZnMv
bmZzL25hbWVzcGFjZS5jDQo+ICsrKyBiL2ZzL25mcy9uYW1lc3BhY2UuYw0KPiBAQCAtMTQ4LDg0
ICsxNDgsMzEgQEAgcnBjX2F1dGhmbGF2b3JfdCBuZnNfZmluZF9iZXN0X3NlYyhzdHJ1Y3QgbmZz
NF9zZWNpbmZvX2ZsYXZvcnMgKmZsYXZvcnMpDQo+ICAJcmV0dXJuIHBzZXVkb2ZsYXZvcjsNCj4g
IH0NCj4gIA0KPiAtc3RhdGljIGludCBuZnNfbmVnb3RpYXRlX3NlY3VyaXR5KGNvbnN0IHN0cnVj
dCBkZW50cnkgKnBhcmVudCwNCj4gLQkJCQkgIGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwN
Cj4gLQkJCQkgIHJwY19hdXRoZmxhdm9yX3QgKmZsYXZvcikNCj4gLXsNCj4gLQlzdHJ1Y3QgcGFn
ZSAqcGFnZTsNCj4gLQlzdHJ1Y3QgbmZzNF9zZWNpbmZvX2ZsYXZvcnMgKmZsYXZvcnM7DQo+IC0J
aW50ICgqc2VjaW5mbykoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVj
dCBuZnM0X3NlY2luZm9fZmxhdm9ycyAqKTsNCj4gLQlpbnQgcmV0ID0gLUVQRVJNOw0KPiAtDQo+
IC0Jc2VjaW5mbyA9IE5GU19QUk9UTyhwYXJlbnQtPmRfaW5vZGUpLT5zZWNpbmZvOw0KPiAtCWlm
IChzZWNpbmZvICE9IE5VTEwpIHsNCj4gLQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7
DQo+IC0JCWlmICghcGFnZSkgew0KPiAtCQkJcmV0ID0gLUVOT01FTTsNCj4gLQkJCWdvdG8gb3V0
Ow0KPiAtCQl9DQo+IC0JCWZsYXZvcnMgPSBwYWdlX2FkZHJlc3MocGFnZSk7DQo+IC0JCXJldCA9
IHNlY2luZm8ocGFyZW50LT5kX2lub2RlLCAmZGVudHJ5LT5kX25hbWUsIGZsYXZvcnMpOw0KPiAt
CQkqZmxhdm9yID0gbmZzX2ZpbmRfYmVzdF9zZWMoZmxhdm9ycyk7DQo+IC0JCXB1dF9wYWdlKHBh
Z2UpOw0KPiAtCX0NCj4gLQ0KPiAtb3V0Og0KPiAtCXJldHVybiByZXQ7DQo+IC19DQo+IC0NCj4g
LXN0YXRpYyBpbnQgbmZzX2xvb2t1cF93aXRoX3NlYyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVy
LCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsDQo+IC0JCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVu
dHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCwNCj4gLQkJCSAgICAgICBzdHJ1Y3QgbmZzX2ZoICpmaCwg
c3RydWN0IG5mc19mYXR0ciAqZmF0dHIsDQo+IC0JCQkgICAgICAgcnBjX2F1dGhmbGF2b3JfdCAq
Zmxhdm9yKQ0KPiAtew0KPiAtCXN0cnVjdCBycGNfY2xudCAqY2xvbmU7DQo+IC0Jc3RydWN0IHJw
Y19hdXRoICphdXRoOw0KPiAtCWludCBlcnI7DQo+IC0NCj4gLQllcnIgPSBuZnNfbmVnb3RpYXRl
X3NlY3VyaXR5KHBhcmVudCwgcGF0aC0+ZGVudHJ5LCBmbGF2b3IpOw0KPiAtCWlmIChlcnIgPCAw
KQ0KPiAtCQlnb3RvIG91dDsNCj4gLQljbG9uZSAgPSBycGNfY2xvbmVfY2xpZW50KHNlcnZlci0+
Y2xpZW50KTsNCj4gLQlhdXRoICAgPSBycGNhdXRoX2NyZWF0ZSgqZmxhdm9yLCBjbG9uZSk7DQo+
IC0JaWYgKCFhdXRoKSB7DQo+IC0JCWVyciA9IC1FSU87DQo+IC0JCWdvdG8gb3V0X3NodXRkb3du
Ow0KPiAtCX0NCj4gLQllcnIgPSBzZXJ2ZXItPm5mc19jbGllbnQtPnJwY19vcHMtPmxvb2t1cChj
bG9uZSwgcGFyZW50LT5kX2lub2RlLA0KPiAtCQkJCQkJICAmcGF0aC0+ZGVudHJ5LT5kX25hbWUs
DQo+IC0JCQkJCQkgIGZoLCBmYXR0cik7DQo+IC1vdXRfc2h1dGRvd246DQo+IC0JcnBjX3NodXRk
b3duX2NsaWVudChjbG9uZSk7DQo+IC1vdXQ6DQo+IC0JcmV0dXJuIGVycjsNCj4gLX0NCj4gLQ0K
PiAgc3RhdGljIHN0cnVjdCBycGNfY2xudCAqbmZzX2xvb2t1cF9tb3VudHBvaW50KHN0cnVjdCBp
bm9kZSAqZGlyLA0KPiAgCQkJCQkgICAgICBzdHJ1Y3QgcXN0ciAqbmFtZSwNCj4gIAkJCQkJICAg
ICAgc3RydWN0IG5mc19maCAqZmgsDQo+ICAJCQkJCSAgICAgIHN0cnVjdCBuZnNfZmF0dHIgKmZh
dHRyKQ0KPiAgew0KPiAtCWlmIChORlNfUFJPVE8oZGlyKS0+dmVyc2lvbiAhPSA0KQ0KPiAtCQly
ZXR1cm4gcnBjX2Nsb25lX2NsaWVudChORlNfU0VSVkVSKGRpciktPmNsaWVudCk7DQo+IC0JcmV0
dXJuIG5mczRfcHJvY19sb29rdXBfbW91bnRwb2ludChkaXIsIG5hbWUsIGZoLCBmYXR0cik7DQo+
ICsJaW50IGVycjsNCj4gKw0KPiArCWlmIChORlNfUFJPVE8oZGlyKS0+dmVyc2lvbiA9PSA0KQ0K
PiArCQlyZXR1cm4gbmZzNF9wcm9jX2xvb2t1cF9tb3VudHBvaW50KGRpciwgbmFtZSwgZmgsIGZh
dHRyKTsNCj4gKw0KPiArCWVyciA9IE5GU19QUk9UTyhkaXIpLT5sb29rdXAoTkZTX1NFUlZFUihk
aXIpLT5jbGllbnQsIGRpciwgbmFtZSwgZmgsIGZhdHRyKTsNCj4gKwlpZiAoZXJyKQ0KPiArCQly
ZXR1cm4gRVJSX1BUUihlcnIpOw0KPiArCXJldHVybiBycGNfY2xvbmVfY2xpZW50KE5GU19TRVJW
RVIoZGlyKS0+Y2xpZW50KTsNCg0KV2hlcmUgZG9lcyB0aGlzIGNvbWUgZnJvbSwgYW5kIGhvdyBp
cyBpdCByZWxldmFudCB0byByZW1vdmluZw0KbmZzX2xvb2t1cF93aXRoX3NlYz8NCg0KPiAgfQ0K
PiAgI2Vsc2UgLyogQ09ORklHX05GU19WNCAqLw0KPiAtc3RhdGljIGlubGluZSBpbnQgbmZzX2xv
b2t1cF93aXRoX3NlYyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLA0KPiAtCQkJCSAgICAgIHN0
cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LA0KPiAtCQkJCSAgICAg
IHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzX2ZoICpmaCwNCj4gLQkJCQkgICAgICBzdHJ1
Y3QgbmZzX2ZhdHRyICpmYXR0ciwNCj4gLQkJCQkgICAgICBycGNfYXV0aGZsYXZvcl90ICpmbGF2
b3IpDQo+IC17DQo+IC0JcmV0dXJuIC1FUEVSTTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlubGlu
ZSBzdHJ1Y3QgcnBjX2NsbnQgKm5mc19sb29rdXBfbW91bnRwb2ludChzdHJ1Y3QgaW5vZGUgKmlu
b2RlLA0KPiArc3RhdGljIGlubGluZSBzdHJ1Y3QgcnBjX2NsbnQgKm5mc19sb29rdXBfbW91bnRw
b2ludChzdHJ1Y3QgaW5vZGUgKmRpciwNCj4gIAkJCQkJCSAgICAgc3RydWN0IHFzdHIgKm5hbWUs
DQo+ICAJCQkJCQkgICAgIHN0cnVjdCBuZnNfZmggKmZoLA0KPiAgCQkJCQkJICAgICBzdHJ1Y3Qg
bmZzX2ZhdHRyICpmYXR0cikNCj4gIHsNCj4gLQlyZXR1cm4gcnBjX2Nsb25lX2NsaWVudChORlNf
U0VSVkVSKGlub2RlKS0+Y2xpZW50KTsNCj4gKwlpbnQgZXJyID0gTkZTX1BST1RPKGRpciktPmxv
b2t1cChORlNfU0VSVkVSKGRpciktPmNsaWVudCwgZGlyLCBuYW1lLCBmaCwgZmF0dHIpOw0KPiAr
CWlmIChlcnIpDQo+ICsJCXJldHVybiBFUlJfUFRSKGVycik7DQoNCkRpdHRvLiBUaGlzIGRlZmlu
aXRlbHkgYmVsb25ncyBpbiBhIHNlcGFyYXRlIHBhdGNoLg0KDQo+ICsJcmV0dXJuIHJwY19jbG9u
ZV9jbGllbnQoTkZTX1NFUlZFUihkaXIpLT5jbGllbnQpOw0KPiAgfQ0KPiAgI2VuZGlmIC8qIENP
TkZJR19ORlNfVjQgKi8NCj4gIA0KPiBAQCAtMjQ4LDcgKzE5NSw2IEBAIHN0cnVjdCB2ZnNtb3Vu
dCAqbmZzX2RfYXV0b21vdW50KHN0cnVjdCBwYXRoICpwYXRoKQ0KPiAgCXN0cnVjdCBuZnNfZmgg
KmZoID0gTlVMTDsNCj4gIAlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IE5VTEw7DQo+ICAJc3Ry
dWN0IHJwY19jbG50ICpjbGllbnQ7DQo+IC0JcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3IgPSBSUENf
QVVUSF9VTklYOw0KPiAgDQo+ICAJZHByaW50aygiLS0+IG5mc19kX2F1dG9tb3VudCgpXG4iKTsN
Cj4gIA0KPiBAQCAtMjc2LDcgKzIyMiw3IEBAIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2RfYXV0b21v
dW50KHN0cnVjdCBwYXRoICpwYXRoKQ0KPiAgCWlmIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9G
QVRUUl9WNF9SRUZFUlJBTCkNCj4gIAkJbW50ID0gbmZzX2RvX3JlZm1vdW50KGNsaWVudCwgcGF0
aC0+ZGVudHJ5KTsNCj4gIAllbHNlDQo+IC0JCW1udCA9IG5mc19kb19zdWJtb3VudChwYXRoLT5k
ZW50cnksIGZoLCBmYXR0ciwgZmxhdm9yKTsNCj4gKwkJbW50ID0gbmZzX2RvX3N1Ym1vdW50KHBh
dGgtPmRlbnRyeSwgZmgsIGZhdHRyLCBjbGllbnQtPmNsX2F1dGgtPmF1X2ZsYXZvcik7DQo+ICAJ
cnBjX3NodXRkb3duX2NsaWVudChjbGllbnQpOw0KPiAgDQo+ICAJaWYgKElTX0VSUihtbnQpKQ0K
DQotLSANClRyb25kIE15a2xlYnVzdA0KTGludXggTkZTIGNsaWVudCBtYWludGFpbmVyDQoNCk5l
dEFwcA0KVHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20NCnd3dy5uZXRhcHAuY29tDQoNCg==

2012-04-26 20:56:33

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 9/9] NFS: Remove extra rpc_clnt argument to proc_lookup

From: Bryan Schumaker <[email protected]>

Now that I'm doing secinfo automatically in the v4 code this extra
argument isn't needed.

Signed-off-by: Bryan Schumaker <[email protected]>
---
fs/nfs/dir.c | 6 +++---
fs/nfs/namespace.c | 3 +--
fs/nfs/nfs3proc.c | 2 +-
fs/nfs/nfs4proc.c | 2 +-
fs/nfs/proc.c | 2 +-
include/linux/nfs_xdr.h | 2 +-
6 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 8789210..82b42e2 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1143,7 +1143,7 @@ static int nfs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd)
if (fhandle == NULL || fattr == NULL)
goto out_error;

- error = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, &dentry->d_name, fhandle, fattr);
+ error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
if (error)
goto out_bad;
if (nfs_compare_fh(NFS_FH(inode), fhandle))
@@ -1299,7 +1299,7 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru
parent = dentry->d_parent;
/* Protect against concurrent sillydeletes */
nfs_block_sillyrename(parent);
- error = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, &dentry->d_name, fhandle, fattr);
+ error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
if (error == -ENOENT)
goto no_entry;
if (error < 0) {
@@ -1646,7 +1646,7 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
if (dentry->d_inode)
goto out;
if (fhandle->size == 0) {
- error = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, &dentry->d_name, fhandle, fattr);
+ error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
if (error)
goto out_error;
}
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index e36fd8a..08b9c93 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -261,8 +261,7 @@ struct vfsmount *nfs_submount(struct nfs_server *server, struct dentry *dentry,
struct dentry *parent = dget_parent(dentry);

/* Look it up again to get its attributes */
- err = server->nfs_client->rpc_ops->lookup(server->client, parent->d_inode,
- &dentry->d_name, fh, fattr);
+ err = server->nfs_client->rpc_ops->lookup(parent->d_inode, &dentry->d_name, fh, fattr);
dput(parent);
if (err != 0)
return ERR_PTR(err);
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index d39d1d7..f03ab63 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -142,7 +142,7 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
}

static int
-nfs3_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
+nfs3_proc_lookup(struct inode *dir, struct qstr *name,
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
{
struct nfs3_diropargs arg = {
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 279bbd9..1f46bae 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2578,7 +2578,7 @@ out:
return err;
}

-static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
+static int nfs4_proc_lookup(struct inode *dir, struct qstr *name,
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
{
int status;
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index 8dfe960..11645a2 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -178,7 +178,7 @@ nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
}

static int
-nfs_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
+nfs_proc_lookup(struct inode *dir, struct qstr *name,
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
{
struct nfs_diropargs arg = {
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index ada3acd..3636fb6 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1240,7 +1240,7 @@ struct nfs_rpc_ops {
struct nfs_fattr *);
int (*setattr) (struct dentry *, struct nfs_fattr *,
struct iattr *);
- int (*lookup) (struct rpc_clnt *clnt, struct inode *, struct qstr *,
+ int (*lookup) (struct inode *, struct qstr *,
struct nfs_fh *, struct nfs_fattr *);
int (*access) (struct inode *, struct nfs_access_entry *);
int (*readlink)(struct inode *, struct page *, unsigned int,
--
1.7.10