forked from luck/tmp_suning_uos_patched
xfs: initialize default acls for ->tmpfile()
The current tmpfile handler does not initialize default ACLs. Doing so within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), which is already used as a common create handler. xfs_vn_mknod() does not currently have a mechanism to determine whether to link the file into the namespace. Therefore, further abstract xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile parameter. This new handler calls xfs_create_tmpfile() and d_tmpfile() on the dentry when called via ->tmpfile(). Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
c99d609a16
commit
d540e43b0a
|
@ -124,15 +124,15 @@ xfs_cleanup_inode(
|
|||
xfs_dentry_to_name(&teardown, dentry, 0);
|
||||
|
||||
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
|
||||
iput(inode);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vn_mknod(
|
||||
xfs_generic_create(
|
||||
struct inode *dir,
|
||||
struct dentry *dentry,
|
||||
umode_t mode,
|
||||
dev_t rdev)
|
||||
dev_t rdev,
|
||||
bool tmpfile) /* unnamed file */
|
||||
{
|
||||
struct inode *inode;
|
||||
struct xfs_inode *ip = NULL;
|
||||
|
@ -156,8 +156,12 @@ xfs_vn_mknod(
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
xfs_dentry_to_name(&name, dentry, mode);
|
||||
error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
|
||||
if (!tmpfile) {
|
||||
xfs_dentry_to_name(&name, dentry, mode);
|
||||
error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
|
||||
} else {
|
||||
error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip);
|
||||
}
|
||||
if (unlikely(error))
|
||||
goto out_free_acl;
|
||||
|
||||
|
@ -180,7 +184,11 @@ xfs_vn_mknod(
|
|||
}
|
||||
#endif
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
if (tmpfile)
|
||||
d_tmpfile(dentry, inode);
|
||||
else
|
||||
d_instantiate(dentry, inode);
|
||||
|
||||
out_free_acl:
|
||||
if (default_acl)
|
||||
posix_acl_release(default_acl);
|
||||
|
@ -189,10 +197,22 @@ xfs_vn_mknod(
|
|||
return -error;
|
||||
|
||||
out_cleanup_inode:
|
||||
xfs_cleanup_inode(dir, inode, dentry);
|
||||
if (!tmpfile)
|
||||
xfs_cleanup_inode(dir, inode, dentry);
|
||||
iput(inode);
|
||||
goto out_free_acl;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vn_mknod(
|
||||
struct inode *dir,
|
||||
struct dentry *dentry,
|
||||
umode_t mode,
|
||||
dev_t rdev)
|
||||
{
|
||||
return xfs_generic_create(dir, dentry, mode, rdev, false);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vn_create(
|
||||
struct inode *dir,
|
||||
|
@ -353,6 +373,7 @@ xfs_vn_symlink(
|
|||
|
||||
out_cleanup_inode:
|
||||
xfs_cleanup_inode(dir, inode, dentry);
|
||||
iput(inode);
|
||||
out:
|
||||
return -error;
|
||||
}
|
||||
|
@ -1053,25 +1074,7 @@ xfs_vn_tmpfile(
|
|||
struct dentry *dentry,
|
||||
umode_t mode)
|
||||
{
|
||||
int error;
|
||||
struct xfs_inode *ip;
|
||||
struct inode *inode;
|
||||
|
||||
error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip);
|
||||
if (unlikely(error))
|
||||
return -error;
|
||||
|
||||
inode = VFS_I(ip);
|
||||
|
||||
error = xfs_init_security(inode, dir, &dentry->d_name);
|
||||
if (unlikely(error)) {
|
||||
iput(inode);
|
||||
return -error;
|
||||
}
|
||||
|
||||
d_tmpfile(dentry, inode);
|
||||
|
||||
return 0;
|
||||
return xfs_generic_create(dir, dentry, mode, 0, true);
|
||||
}
|
||||
|
||||
static const struct inode_operations xfs_inode_operations = {
|
||||
|
|
Loading…
Reference in New Issue
Block a user