* [PATCH] nfsv4: Switch to generic xattr handling code
@ 2010-12-09 11:35 Aneesh Kumar K.V
2010-12-14 0:33 ` J. Bruce Fields
0 siblings, 1 reply; 3+ messages in thread
From: Aneesh Kumar K.V @ 2010-12-09 11:35 UTC (permalink / raw)
To: trond.myklebust, bfields; +Cc: linux-nfs, Aneesh Kumar K.V
This patch make nfsv4 use the generic xattr handling code
to get the nfsv4 acl. This will help us to add richacl
support to nfsv4 in later patches
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
fs/nfs/dir.c | 8 ++++--
fs/nfs/nfs4_fs.h | 7 +-----
fs/nfs/nfs4proc.c | 62 +++++++++++++++++++++++++++++-----------------------
fs/nfs/super.c | 4 ++-
4 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 070f368..7e0c0be 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -35,6 +35,7 @@
#include <linux/sched.h>
#include <linux/vmalloc.h>
#include <linux/kmemleak.h>
+#include <linux/xattr.h>
#include "delegation.h"
#include "iostat.h"
@@ -125,9 +126,10 @@ const struct inode_operations nfs4_dir_inode_operations = {
.permission = nfs_permission,
.getattr = nfs_getattr,
.setattr = nfs_setattr,
- .getxattr = nfs4_getxattr,
- .setxattr = nfs4_setxattr,
- .listxattr = nfs4_listxattr,
+ .getxattr = generic_getxattr,
+ .setxattr = generic_setxattr,
+ .listxattr = generic_listxattr,
+ .removexattr = generic_removexattr,
};
#endif /* CONFIG_NFS_V4 */
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 9fa4963..441fbcd 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -227,12 +227,6 @@ struct nfs4_state_maintenance_ops {
extern const struct dentry_operations nfs4_dentry_operations;
extern const struct inode_operations nfs4_dir_inode_operations;
-/* inode.c */
-extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t);
-extern int nfs4_setxattr(struct dentry *, const char *, const void *, size_t, int);
-extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t);
-
-
/* 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 *);
@@ -246,6 +240,7 @@ extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fh
extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
struct nfs4_fs_locations *fs_locations, struct page *page);
extern void nfs4_release_lockowner(const struct nfs4_lock_state *);
+extern const struct xattr_handler *nfs4_xattr_handlers[];
#if defined(CONFIG_NFS_V4_1)
static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index c57b4e0..9d4839b 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -49,6 +49,7 @@
#include <linux/mount.h>
#include <linux/module.h>
#include <linux/sunrpc/bc_xprt.h>
+#include <linux/xattr.h>
#include "nfs4_fs.h"
#include "delegation.h"
@@ -4394,42 +4395,36 @@ void nfs4_release_lockowner(const struct nfs4_lock_state *lsp)
#define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
-int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
- size_t buflen, int flags)
+static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key,
+ const void *buf, size_t buflen,
+ int flags, int type)
{
- struct inode *inode = dentry->d_inode;
-
- if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
- return -EOPNOTSUPP;
+ if (strcmp(key, "") != 0)
+ return -EINVAL;
- return nfs4_proc_set_acl(inode, buf, buflen);
+ return nfs4_proc_set_acl(dentry->d_inode, buf, buflen);
}
-/* The getxattr man page suggests returning -ENODATA for unknown attributes,
- * and that's what we'll do for e.g. user attributes that haven't been set.
- * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
- * attributes in kernel-managed attribute namespaces. */
-ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
- size_t buflen)
+static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key,
+ void *buf, size_t buflen, int type)
{
- struct inode *inode = dentry->d_inode;
-
- if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
- return -EOPNOTSUPP;
+ if (strcmp(key, "") != 0)
+ return -EINVAL;
- return nfs4_proc_get_acl(inode, buf, buflen);
+ return nfs4_proc_get_acl(dentry->d_inode, buf, buflen);
}
-ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
+static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list,
+ size_t list_len, const char *name,
+ size_t name_len, int type)
{
- size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
+ size_t len = sizeof(XATTR_NAME_NFSV4_ACL);
if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
return 0;
- if (buf && buflen < len)
- return -ERANGE;
- if (buf)
- memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
+
+ if (list && len <= list_len)
+ memcpy(list, XATTR_NAME_NFSV4_ACL, len);
return len;
}
@@ -5500,9 +5495,10 @@ static const struct inode_operations nfs4_file_inode_operations = {
.permission = nfs_permission,
.getattr = nfs_getattr,
.setattr = nfs_setattr,
- .getxattr = nfs4_getxattr,
- .setxattr = nfs4_setxattr,
- .listxattr = nfs4_listxattr,
+ .getxattr = generic_getxattr,
+ .setxattr = generic_setxattr,
+ .listxattr = generic_listxattr,
+ .removexattr = generic_removexattr,
};
const struct nfs_rpc_ops nfs_v4_clientops = {
@@ -5547,6 +5543,18 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.open_context = nfs4_atomic_open,
};
+static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
+ .prefix = XATTR_NAME_NFSV4_ACL,
+ .list = nfs4_xattr_list_nfs4_acl,
+ .get = nfs4_xattr_get_nfs4_acl,
+ .set = nfs4_xattr_set_nfs4_acl,
+};
+
+const struct xattr_handler *nfs4_xattr_handlers[] = {
+ &nfs4_xattr_nfs4_acl_handler,
+ NULL
+};
+
/*
* Local variables:
* c-basic-offset: 8
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index e57e670..e0f4a9e 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2503,7 +2503,8 @@ static void nfs4_clone_super(struct super_block *sb,
* so ourselves when necessary.
*/
sb->s_flags |= MS_POSIXACL;
- nfs_initialise_sb(sb);
+ sb->s_xattr = old_sb->s_xattr;
+ nfs_initialise_sb(sb);
}
/*
@@ -2518,6 +2519,7 @@ static void nfs4_fill_super(struct super_block *sb)
* so ourselves when necessary.
*/
sb->s_flags |= MS_POSIXACL;
+ sb->s_xattr = nfs4_xattr_handlers;
nfs_initialise_sb(sb);
}
--
1.7.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] nfsv4: Switch to generic xattr handling code
2010-12-09 11:35 [PATCH] nfsv4: Switch to generic xattr handling code Aneesh Kumar K.V
@ 2010-12-14 0:33 ` J. Bruce Fields
2011-01-03 16:04 ` Aneesh Kumar K. V
0 siblings, 1 reply; 3+ messages in thread
From: J. Bruce Fields @ 2010-12-14 0:33 UTC (permalink / raw)
To: Aneesh Kumar K.V; +Cc: trond.myklebust, linux-nfs
On Thu, Dec 09, 2010 at 05:05:25PM +0530, Aneesh Kumar K.V wrote:
> This patch make nfsv4 use the generic xattr handling code
> to get the nfsv4 acl. This will help us to add richacl
> support to nfsv4 in later patches
Look OK to me.--b.
>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
> fs/nfs/dir.c | 8 ++++--
> fs/nfs/nfs4_fs.h | 7 +-----
> fs/nfs/nfs4proc.c | 62 +++++++++++++++++++++++++++++-----------------------
> fs/nfs/super.c | 4 ++-
> 4 files changed, 44 insertions(+), 37 deletions(-)
>
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index 070f368..7e0c0be 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -35,6 +35,7 @@
> #include <linux/sched.h>
> #include <linux/vmalloc.h>
> #include <linux/kmemleak.h>
> +#include <linux/xattr.h>
>
> #include "delegation.h"
> #include "iostat.h"
> @@ -125,9 +126,10 @@ const struct inode_operations nfs4_dir_inode_operations = {
> .permission = nfs_permission,
> .getattr = nfs_getattr,
> .setattr = nfs_setattr,
> - .getxattr = nfs4_getxattr,
> - .setxattr = nfs4_setxattr,
> - .listxattr = nfs4_listxattr,
> + .getxattr = generic_getxattr,
> + .setxattr = generic_setxattr,
> + .listxattr = generic_listxattr,
> + .removexattr = generic_removexattr,
> };
>
> #endif /* CONFIG_NFS_V4 */
> diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
> index 9fa4963..441fbcd 100644
> --- a/fs/nfs/nfs4_fs.h
> +++ b/fs/nfs/nfs4_fs.h
> @@ -227,12 +227,6 @@ struct nfs4_state_maintenance_ops {
> extern const struct dentry_operations nfs4_dentry_operations;
> extern const struct inode_operations nfs4_dir_inode_operations;
>
> -/* inode.c */
> -extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t);
> -extern int nfs4_setxattr(struct dentry *, const char *, const void *, size_t, int);
> -extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t);
> -
> -
> /* 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 *);
> @@ -246,6 +240,7 @@ extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fh
> extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
> struct nfs4_fs_locations *fs_locations, struct page *page);
> extern void nfs4_release_lockowner(const struct nfs4_lock_state *);
> +extern const struct xattr_handler *nfs4_xattr_handlers[];
>
> #if defined(CONFIG_NFS_V4_1)
> static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server)
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index c57b4e0..9d4839b 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -49,6 +49,7 @@
> #include <linux/mount.h>
> #include <linux/module.h>
> #include <linux/sunrpc/bc_xprt.h>
> +#include <linux/xattr.h>
>
> #include "nfs4_fs.h"
> #include "delegation.h"
> @@ -4394,42 +4395,36 @@ void nfs4_release_lockowner(const struct nfs4_lock_state *lsp)
>
> #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
>
> -int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
> - size_t buflen, int flags)
> +static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key,
> + const void *buf, size_t buflen,
> + int flags, int type)
> {
> - struct inode *inode = dentry->d_inode;
> -
> - if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
> - return -EOPNOTSUPP;
> + if (strcmp(key, "") != 0)
> + return -EINVAL;
>
> - return nfs4_proc_set_acl(inode, buf, buflen);
> + return nfs4_proc_set_acl(dentry->d_inode, buf, buflen);
> }
>
> -/* The getxattr man page suggests returning -ENODATA for unknown attributes,
> - * and that's what we'll do for e.g. user attributes that haven't been set.
> - * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
> - * attributes in kernel-managed attribute namespaces. */
> -ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
> - size_t buflen)
> +static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key,
> + void *buf, size_t buflen, int type)
> {
> - struct inode *inode = dentry->d_inode;
> -
> - if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
> - return -EOPNOTSUPP;
> + if (strcmp(key, "") != 0)
> + return -EINVAL;
>
> - return nfs4_proc_get_acl(inode, buf, buflen);
> + return nfs4_proc_get_acl(dentry->d_inode, buf, buflen);
> }
>
> -ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
> +static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list,
> + size_t list_len, const char *name,
> + size_t name_len, int type)
> {
> - size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
> + size_t len = sizeof(XATTR_NAME_NFSV4_ACL);
>
> if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
> return 0;
> - if (buf && buflen < len)
> - return -ERANGE;
> - if (buf)
> - memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
> +
> + if (list && len <= list_len)
> + memcpy(list, XATTR_NAME_NFSV4_ACL, len);
> return len;
> }
>
> @@ -5500,9 +5495,10 @@ static const struct inode_operations nfs4_file_inode_operations = {
> .permission = nfs_permission,
> .getattr = nfs_getattr,
> .setattr = nfs_setattr,
> - .getxattr = nfs4_getxattr,
> - .setxattr = nfs4_setxattr,
> - .listxattr = nfs4_listxattr,
> + .getxattr = generic_getxattr,
> + .setxattr = generic_setxattr,
> + .listxattr = generic_listxattr,
> + .removexattr = generic_removexattr,
> };
>
> const struct nfs_rpc_ops nfs_v4_clientops = {
> @@ -5547,6 +5543,18 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
> .open_context = nfs4_atomic_open,
> };
>
> +static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
> + .prefix = XATTR_NAME_NFSV4_ACL,
> + .list = nfs4_xattr_list_nfs4_acl,
> + .get = nfs4_xattr_get_nfs4_acl,
> + .set = nfs4_xattr_set_nfs4_acl,
> +};
> +
> +const struct xattr_handler *nfs4_xattr_handlers[] = {
> + &nfs4_xattr_nfs4_acl_handler,
> + NULL
> +};
> +
> /*
> * Local variables:
> * c-basic-offset: 8
> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> index e57e670..e0f4a9e 100644
> --- a/fs/nfs/super.c
> +++ b/fs/nfs/super.c
> @@ -2503,7 +2503,8 @@ static void nfs4_clone_super(struct super_block *sb,
> * so ourselves when necessary.
> */
> sb->s_flags |= MS_POSIXACL;
> - nfs_initialise_sb(sb);
> + sb->s_xattr = old_sb->s_xattr;
> + nfs_initialise_sb(sb);
> }
>
> /*
> @@ -2518,6 +2519,7 @@ static void nfs4_fill_super(struct super_block *sb)
> * so ourselves when necessary.
> */
> sb->s_flags |= MS_POSIXACL;
> + sb->s_xattr = nfs4_xattr_handlers;
> nfs_initialise_sb(sb);
> }
>
> --
> 1.7.1
>
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] nfsv4: Switch to generic xattr handling code
2010-12-14 0:33 ` J. Bruce Fields
@ 2011-01-03 16:04 ` Aneesh Kumar K. V
0 siblings, 0 replies; 3+ messages in thread
From: Aneesh Kumar K. V @ 2011-01-03 16:04 UTC (permalink / raw)
To: J. Bruce Fields; +Cc: trond.myklebust, linux-nfs
On Mon, 13 Dec 2010 19:33:28 -0500, "J. Bruce Fields" <bfields@fieldses.org> wrote:
> On Thu, Dec 09, 2010 at 05:05:25PM +0530, Aneesh Kumar K.V wrote:
> > This patch make nfsv4 use the generic xattr handling code
> > to get the nfsv4 acl. This will help us to add richacl
> > support to nfsv4 in later patches
>
> Look OK to me.--b.
>
> >
> > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> > ---
> > fs/nfs/dir.c | 8 ++++--
> > fs/nfs/nfs4_fs.h | 7 +-----
> > fs/nfs/nfs4proc.c | 62 +++++++++++++++++++++++++++++-----------------------
> > fs/nfs/super.c | 4 ++-
> > 4 files changed, 44 insertions(+), 37 deletions(-)
> >
> > diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> > index 070f368..7e0c0be 100644
> > --- a/fs/nfs/dir.c
> > +++ b/fs/nfs/dir.c
> > @@ -35,6 +35,7 @@
> > #include <linux/sched.h>
> > #include <linux/vmalloc.h>
> > #include <linux/kmemleak.h>
> > +#include <linux/xattr.h>
> >
> > #include "delegation.h"
> > #include "iostat.h"
> > @@ -125,9 +126,10 @@ const struct inode_operations nfs4_dir_inode_operations = {
> > .permission = nfs_permission,
> > .getattr = nfs_getattr,
> > .setattr = nfs_setattr,
> > - .getxattr = nfs4_getxattr,
> > - .setxattr = nfs4_setxattr,
> > - .listxattr = nfs4_listxattr,
> > + .getxattr = generic_getxattr,
> > + .setxattr = generic_setxattr,
> > + .listxattr = generic_listxattr,
> > + .removexattr = generic_removexattr,
> > };
> >
> > #endif /* CONFIG_NFS_V4 */
> > diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
> > index 9fa4963..441fbcd 100644
> > --- a/fs/nfs/nfs4_fs.h
> > +++ b/fs/nfs/nfs4_fs.h
> > @@ -227,12 +227,6 @@ struct nfs4_state_maintenance_ops {
> > extern const struct dentry_operations nfs4_dentry_operations;
> > extern const struct inode_operations nfs4_dir_inode_operations;
> >
> > -/* inode.c */
> > -extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t);
> > -extern int nfs4_setxattr(struct dentry *, const char *, const void *, size_t, int);
> > -extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t);
> > -
> > -
> > /* 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 *);
> > @@ -246,6 +240,7 @@ extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fh
> > extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
> > struct nfs4_fs_locations *fs_locations, struct page *page);
> > extern void nfs4_release_lockowner(const struct nfs4_lock_state *);
> > +extern const struct xattr_handler *nfs4_xattr_handlers[];
> >
> > #if defined(CONFIG_NFS_V4_1)
> > static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server)
> > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > index c57b4e0..9d4839b 100644
> > --- a/fs/nfs/nfs4proc.c
> > +++ b/fs/nfs/nfs4proc.c
> > @@ -49,6 +49,7 @@
> > #include <linux/mount.h>
> > #include <linux/module.h>
> > #include <linux/sunrpc/bc_xprt.h>
> > +#include <linux/xattr.h>
> >
> > #include "nfs4_fs.h"
> > #include "delegation.h"
> > @@ -4394,42 +4395,36 @@ void nfs4_release_lockowner(const struct nfs4_lock_state *lsp)
> >
> > #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
> >
> > -int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
> > - size_t buflen, int flags)
> > +static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key,
> > + const void *buf, size_t buflen,
> > + int flags, int type)
> > {
> > - struct inode *inode = dentry->d_inode;
> > -
> > - if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
> > - return -EOPNOTSUPP;
> > + if (strcmp(key, "") != 0)
> > + return -EINVAL;
> >
> > - return nfs4_proc_set_acl(inode, buf, buflen);
> > + return nfs4_proc_set_acl(dentry->d_inode, buf, buflen);
> > }
> >
> > -/* The getxattr man page suggests returning -ENODATA for unknown attributes,
> > - * and that's what we'll do for e.g. user attributes that haven't been set.
> > - * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
> > - * attributes in kernel-managed attribute namespaces. */
> > -ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
> > - size_t buflen)
> > +static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key,
> > + void *buf, size_t buflen, int type)
> > {
> > - struct inode *inode = dentry->d_inode;
> > -
> > - if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
> > - return -EOPNOTSUPP;
> > + if (strcmp(key, "") != 0)
> > + return -EINVAL;
> >
> > - return nfs4_proc_get_acl(inode, buf, buflen);
> > + return nfs4_proc_get_acl(dentry->d_inode, buf, buflen);
> > }
> >
> > -ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
> > +static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list,
> > + size_t list_len, const char *name,
> > + size_t name_len, int type)
> > {
> > - size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
> > + size_t len = sizeof(XATTR_NAME_NFSV4_ACL);
> >
> > if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
> > return 0;
> > - if (buf && buflen < len)
> > - return -ERANGE;
> > - if (buf)
> > - memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
> > +
> > + if (list && len <= list_len)
> > + memcpy(list, XATTR_NAME_NFSV4_ACL, len);
> > return len;
> > }
> >
> > @@ -5500,9 +5495,10 @@ static const struct inode_operations nfs4_file_inode_operations = {
> > .permission = nfs_permission,
> > .getattr = nfs_getattr,
> > .setattr = nfs_setattr,
> > - .getxattr = nfs4_getxattr,
> > - .setxattr = nfs4_setxattr,
> > - .listxattr = nfs4_listxattr,
> > + .getxattr = generic_getxattr,
> > + .setxattr = generic_setxattr,
> > + .listxattr = generic_listxattr,
> > + .removexattr = generic_removexattr,
> > };
> >
> > const struct nfs_rpc_ops nfs_v4_clientops = {
> > @@ -5547,6 +5543,18 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
> > .open_context = nfs4_atomic_open,
> > };
> >
> > +static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
> > + .prefix = XATTR_NAME_NFSV4_ACL,
> > + .list = nfs4_xattr_list_nfs4_acl,
> > + .get = nfs4_xattr_get_nfs4_acl,
> > + .set = nfs4_xattr_set_nfs4_acl,
> > +};
> > +
> > +const struct xattr_handler *nfs4_xattr_handlers[] = {
> > + &nfs4_xattr_nfs4_acl_handler,
> > + NULL
> > +};
> > +
> > /*
> > * Local variables:
> > * c-basic-offset: 8
> > diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> > index e57e670..e0f4a9e 100644
> > --- a/fs/nfs/super.c
> > +++ b/fs/nfs/super.c
> > @@ -2503,7 +2503,8 @@ static void nfs4_clone_super(struct super_block *sb,
> > * so ourselves when necessary.
> > */
> > sb->s_flags |= MS_POSIXACL;
> > - nfs_initialise_sb(sb);
> > + sb->s_xattr = old_sb->s_xattr;
> > + nfs_initialise_sb(sb);
> > }
> >
> > /*
> > @@ -2518,6 +2519,7 @@ static void nfs4_fill_super(struct super_block *sb)
> > * so ourselves when necessary.
> > */
> > sb->s_flags |= MS_POSIXACL;
> > + sb->s_xattr = nfs4_xattr_handlers;
> > nfs_initialise_sb(sb);
> > }
> >
> > --
> > 1.7.1
> >
Any update ?
-aneesh
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-01-03 16:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-09 11:35 [PATCH] nfsv4: Switch to generic xattr handling code Aneesh Kumar K.V
2010-12-14 0:33 ` J. Bruce Fields
2011-01-03 16:04 ` Aneesh Kumar K. V
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).