|
@@ -49,6 +49,7 @@
|
|
#include <linux/mount.h>
|
|
#include <linux/mount.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/sunrpc/bc_xprt.h>
|
|
#include <linux/sunrpc/bc_xprt.h>
|
|
|
|
+#include <linux/xattr.h>
|
|
|
|
|
|
#include "nfs4_fs.h"
|
|
#include "nfs4_fs.h"
|
|
#include "delegation.h"
|
|
#include "delegation.h"
|
|
@@ -4403,42 +4404,36 @@ void nfs4_release_lockowner(const struct nfs4_lock_state *lsp)
|
|
|
|
|
|
#define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
|
|
#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)))
|
|
if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
|
|
return 0;
|
|
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;
|
|
return len;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -5509,9 +5504,10 @@ static const struct inode_operations nfs4_file_inode_operations = {
|
|
.permission = nfs_permission,
|
|
.permission = nfs_permission,
|
|
.getattr = nfs_getattr,
|
|
.getattr = nfs_getattr,
|
|
.setattr = nfs_setattr,
|
|
.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 = {
|
|
const struct nfs_rpc_ops nfs_v4_clientops = {
|
|
@@ -5556,6 +5552,18 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
|
|
.open_context = nfs4_atomic_open,
|
|
.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:
|
|
* Local variables:
|
|
* c-basic-offset: 8
|
|
* c-basic-offset: 8
|