nfs: use generic posix ACL infrastructure for v3 Posix ACLs
This causes a small behaviour change in that we don't bother to set ACLs on file creation if the mode bit can express the access permissions fully, and thus behaving identical to local filesystems. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:

committed by
Al Viro

parent
e01580bf9e
commit
013cdf1088
@@ -317,8 +317,8 @@ static int
|
||||
nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
int flags)
|
||||
{
|
||||
struct posix_acl *default_acl, *acl;
|
||||
struct nfs3_createdata *data;
|
||||
umode_t mode = sattr->ia_mode;
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("NFS call create %pd\n", dentry);
|
||||
@@ -340,7 +340,9 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
data->arg.create.verifier[1] = cpu_to_be32(current->pid);
|
||||
}
|
||||
|
||||
sattr->ia_mode &= ~current_umask();
|
||||
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
for (;;) {
|
||||
status = nfs3_do_create(dir, dentry, data);
|
||||
@@ -366,7 +368,7 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
goto out;
|
||||
goto out_release_acls;
|
||||
|
||||
/* When we created the file with exclusive semantics, make
|
||||
* sure we set the attributes afterwards. */
|
||||
@@ -385,9 +387,14 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
nfs_post_op_update_inode(dentry->d_inode, data->res.fattr);
|
||||
dprintk("NFS reply setattr (post-create): %d\n", status);
|
||||
if (status != 0)
|
||||
goto out;
|
||||
goto out_release_acls;
|
||||
}
|
||||
status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
|
||||
|
||||
status = nfs3_proc_setacls(dentry->d_inode, acl, default_acl);
|
||||
|
||||
out_release_acls:
|
||||
posix_acl_release(acl);
|
||||
posix_acl_release(default_acl);
|
||||
out:
|
||||
nfs3_free_createdata(data);
|
||||
dprintk("NFS reply create: %d\n", status);
|
||||
@@ -572,18 +579,20 @@ out:
|
||||
static int
|
||||
nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
|
||||
{
|
||||
struct posix_acl *default_acl, *acl;
|
||||
struct nfs3_createdata *data;
|
||||
umode_t mode = sattr->ia_mode;
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("NFS call mkdir %pd\n", dentry);
|
||||
|
||||
sattr->ia_mode &= ~current_umask();
|
||||
|
||||
data = nfs3_alloc_createdata();
|
||||
if (data == NULL)
|
||||
goto out;
|
||||
|
||||
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR];
|
||||
data->arg.mkdir.fh = NFS_FH(dir);
|
||||
data->arg.mkdir.name = dentry->d_name.name;
|
||||
@@ -592,9 +601,13 @@ nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
|
||||
|
||||
status = nfs3_do_create(dir, dentry, data);
|
||||
if (status != 0)
|
||||
goto out;
|
||||
goto out_release_acls;
|
||||
|
||||
status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
|
||||
status = nfs3_proc_setacls(dentry->d_inode, acl, default_acl);
|
||||
|
||||
out_release_acls:
|
||||
posix_acl_release(acl);
|
||||
posix_acl_release(default_acl);
|
||||
out:
|
||||
nfs3_free_createdata(data);
|
||||
dprintk("NFS reply mkdir: %d\n", status);
|
||||
@@ -691,19 +704,21 @@ static int
|
||||
nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
dev_t rdev)
|
||||
{
|
||||
struct posix_acl *default_acl, *acl;
|
||||
struct nfs3_createdata *data;
|
||||
umode_t mode = sattr->ia_mode;
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("NFS call mknod %pd %u:%u\n", dentry,
|
||||
MAJOR(rdev), MINOR(rdev));
|
||||
|
||||
sattr->ia_mode &= ~current_umask();
|
||||
|
||||
data = nfs3_alloc_createdata();
|
||||
if (data == NULL)
|
||||
goto out;
|
||||
|
||||
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD];
|
||||
data->arg.mknod.fh = NFS_FH(dir);
|
||||
data->arg.mknod.name = dentry->d_name.name;
|
||||
@@ -731,8 +746,13 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
|
||||
status = nfs3_do_create(dir, dentry, data);
|
||||
if (status != 0)
|
||||
goto out;
|
||||
status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
|
||||
goto out_release_acls;
|
||||
|
||||
status = nfs3_proc_setacls(dentry->d_inode, acl, default_acl);
|
||||
|
||||
out_release_acls:
|
||||
posix_acl_release(acl);
|
||||
posix_acl_release(default_acl);
|
||||
out:
|
||||
nfs3_free_createdata(data);
|
||||
dprintk("NFS reply mknod: %d\n", status);
|
||||
@@ -904,20 +924,28 @@ static const struct inode_operations nfs3_dir_inode_operations = {
|
||||
.permission = nfs_permission,
|
||||
.getattr = nfs_getattr,
|
||||
.setattr = nfs_setattr,
|
||||
.listxattr = nfs3_listxattr,
|
||||
.getxattr = nfs3_getxattr,
|
||||
.setxattr = nfs3_setxattr,
|
||||
.removexattr = nfs3_removexattr,
|
||||
.listxattr = generic_listxattr,
|
||||
.getxattr = generic_getxattr,
|
||||
.setxattr = generic_setxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#ifdef CONFIG_NFS_V3_ACL
|
||||
.get_acl = nfs3_get_acl,
|
||||
.set_acl = nfs3_set_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct inode_operations nfs3_file_inode_operations = {
|
||||
.permission = nfs_permission,
|
||||
.getattr = nfs_getattr,
|
||||
.setattr = nfs_setattr,
|
||||
.listxattr = nfs3_listxattr,
|
||||
.getxattr = nfs3_getxattr,
|
||||
.setxattr = nfs3_setxattr,
|
||||
.removexattr = nfs3_removexattr,
|
||||
.listxattr = generic_listxattr,
|
||||
.getxattr = generic_getxattr,
|
||||
.setxattr = generic_setxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
#ifdef CONFIG_NFS_V3_ACL
|
||||
.get_acl = nfs3_get_acl,
|
||||
.set_acl = nfs3_set_acl,
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct nfs_rpc_ops nfs_v3_clientops = {
|
||||
@@ -965,7 +993,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
|
||||
.commit_rpc_prepare = nfs3_proc_commit_rpc_prepare,
|
||||
.commit_done = nfs3_commit_done,
|
||||
.lock = nfs3_proc_lock,
|
||||
.clear_acl_cache = nfs3_forget_cached_acls,
|
||||
.clear_acl_cache = forget_all_cached_acls,
|
||||
.close_context = nfs_close_context,
|
||||
.have_delegation = nfs3_have_delegation,
|
||||
.return_delegation = nfs3_return_delegation,
|
||||
|
Reference in New Issue
Block a user