Skip to content

Commit

Permalink
xfs: initialize default acls for ->tmpfile()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Brian Foster authored and Dave Chinner committed May 5, 2014
1 parent c99d609 commit d540e43
Showing 1 changed file with 29 additions and 26 deletions.
55 changes: 29 additions & 26 deletions fs/xfs/xfs_iops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -353,6 +373,7 @@ xfs_vn_symlink(

out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry);
iput(inode);
out:
return -error;
}
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit d540e43

Please sign in to comment.