mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
nfs: Move call to security_inode_listsecurity into nfs_listxattr
Add a nfs_listxattr operation. Move the call to security_inode_listsecurity from list operation of the "security.*" xattr handler to nfs_listxattr. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Cc: Trond Myklebust <trond.myklebust@primarydata.com> Cc: Anna Schumaker <anna.schumaker@netapp.com> Cc: linux-nfs@vger.kernel.org Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5d92b75c75
commit
c4803c497f
@ -6279,10 +6279,6 @@ static size_t nfs4_xattr_list_nfs4_acl(const struct xattr_handler *handler,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NFS_V4_SECURITY_LABEL
|
#ifdef CONFIG_NFS_V4_SECURITY_LABEL
|
||||||
static inline int nfs4_server_supports_labels(struct nfs_server *server)
|
|
||||||
{
|
|
||||||
return server->caps & NFS_CAP_SECURITY_LABEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler,
|
static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler,
|
||||||
struct dentry *dentry, const char *key,
|
struct dentry *dentry, const char *key,
|
||||||
@ -6304,29 +6300,34 @@ static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t nfs4_xattr_list_nfs4_label(const struct xattr_handler *handler,
|
static ssize_t
|
||||||
struct dentry *dentry, char *list,
|
nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
|
||||||
size_t list_len, const char *name,
|
|
||||||
size_t name_len)
|
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (nfs_server_capable(d_inode(dentry), NFS_CAP_SECURITY_LABEL)) {
|
if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
|
||||||
len = security_inode_listsecurity(d_inode(dentry), NULL, 0);
|
len = security_inode_listsecurity(inode, list, list_len);
|
||||||
if (list && len <= list_len)
|
if (list_len && len > list_len)
|
||||||
security_inode_listsecurity(d_inode(dentry), list, len);
|
return -ERANGE;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct xattr_handler nfs4_xattr_nfs4_label_handler = {
|
static const struct xattr_handler nfs4_xattr_nfs4_label_handler = {
|
||||||
.prefix = XATTR_SECURITY_PREFIX,
|
.prefix = XATTR_SECURITY_PREFIX,
|
||||||
.list = nfs4_xattr_list_nfs4_label,
|
|
||||||
.get = nfs4_xattr_get_nfs4_label,
|
.get = nfs4_xattr_get_nfs4_label,
|
||||||
.set = nfs4_xattr_set_nfs4_label,
|
.set = nfs4_xattr_set_nfs4_label,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nfs_fhget will use either the mounted_on_fileid or the fileid
|
* nfs_fhget will use either the mounted_on_fileid or the fileid
|
||||||
@ -8743,6 +8744,24 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
|
||||||
|
{
|
||||||
|
ssize_t error, error2;
|
||||||
|
|
||||||
|
error = generic_listxattr(dentry, list, size);
|
||||||
|
if (error < 0)
|
||||||
|
return error;
|
||||||
|
if (list) {
|
||||||
|
list += error;
|
||||||
|
size -= error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
|
||||||
|
if (error2 < 0)
|
||||||
|
return error2;
|
||||||
|
return error + error2;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct inode_operations nfs4_dir_inode_operations = {
|
static const struct inode_operations nfs4_dir_inode_operations = {
|
||||||
.create = nfs_create,
|
.create = nfs_create,
|
||||||
.lookup = nfs_lookup,
|
.lookup = nfs_lookup,
|
||||||
@ -8759,7 +8778,7 @@ static const struct inode_operations nfs4_dir_inode_operations = {
|
|||||||
.setattr = nfs_setattr,
|
.setattr = nfs_setattr,
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.listxattr = generic_listxattr,
|
.listxattr = nfs4_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -8769,7 +8788,7 @@ static const struct inode_operations nfs4_file_inode_operations = {
|
|||||||
.setattr = nfs_setattr,
|
.setattr = nfs_setattr,
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.listxattr = generic_listxattr,
|
.listxattr = nfs4_listxattr,
|
||||||
.removexattr = generic_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -723,6 +723,8 @@ generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|||||||
|
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
for_each_xattr_handler(handlers, handler) {
|
for_each_xattr_handler(handlers, handler) {
|
||||||
|
if (!handler->list)
|
||||||
|
continue;
|
||||||
size += handler->list(handler, dentry, NULL, 0,
|
size += handler->list(handler, dentry, NULL, 0,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
}
|
}
|
||||||
@ -730,6 +732,8 @@ generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|||||||
char *buf = buffer;
|
char *buf = buffer;
|
||||||
|
|
||||||
for_each_xattr_handler(handlers, handler) {
|
for_each_xattr_handler(handlers, handler) {
|
||||||
|
if (!handler->list)
|
||||||
|
continue;
|
||||||
size = handler->list(handler, dentry, buf, buffer_size,
|
size = handler->list(handler, dentry, buf, buffer_size,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
if (size > buffer_size)
|
if (size > buffer_size)
|
||||||
|
@ -1519,8 +1519,6 @@ static int smack_inode_getsecurity(const struct inode *inode,
|
|||||||
* @inode: the object
|
* @inode: the object
|
||||||
* @buffer: where they go
|
* @buffer: where they go
|
||||||
* @buffer_size: size of buffer
|
* @buffer_size: size of buffer
|
||||||
*
|
|
||||||
* Returns 0 on success, -EINVAL otherwise
|
|
||||||
*/
|
*/
|
||||||
static int smack_inode_listsecurity(struct inode *inode, char *buffer,
|
static int smack_inode_listsecurity(struct inode *inode, char *buffer,
|
||||||
size_t buffer_size)
|
size_t buffer_size)
|
||||||
|
Loading…
Reference in New Issue
Block a user