|
@@ -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,
|
|
|
|
- struct dentry *dentry, char *list,
|
|
|
|
- size_t list_len, const char *name,
|
|
|
|
- size_t name_len)
|
|
|
|
|
|
+static ssize_t
|
|
|
|
+nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
|
|
{
|
|
{
|
|
- size_t len = 0;
|
|
|
|
|
|
+ int len = 0;
|
|
|
|
|
|
- if (nfs_server_capable(d_inode(dentry), NFS_CAP_SECURITY_LABEL)) {
|
|
|
|
- len = security_inode_listsecurity(d_inode(dentry), NULL, 0);
|
|
|
|
- if (list && len <= list_len)
|
|
|
|
- security_inode_listsecurity(d_inode(dentry), list, len);
|
|
|
|
|
|
+ if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
|
|
|
|
+ len = security_inode_listsecurity(inode, list, list_len);
|
|
|
|
+ if (list_len && len > 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,
|
|
};
|
|
};
|
|
|
|
|