提交 d540e43b 编写于 作者: B Brian Foster 提交者: Dave Chinner

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: NBrian Foster <bfoster@redhat.com>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Signed-off-by: NDave Chinner <david@fromorbit.com>
上级 c99d609a
...@@ -124,15 +124,15 @@ xfs_cleanup_inode( ...@@ -124,15 +124,15 @@ xfs_cleanup_inode(
xfs_dentry_to_name(&teardown, dentry, 0); xfs_dentry_to_name(&teardown, dentry, 0);
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
iput(inode);
} }
STATIC int STATIC int
xfs_vn_mknod( xfs_generic_create(
struct inode *dir, struct inode *dir,
struct dentry *dentry, struct dentry *dentry,
umode_t mode, umode_t mode,
dev_t rdev) dev_t rdev,
bool tmpfile) /* unnamed file */
{ {
struct inode *inode; struct inode *inode;
struct xfs_inode *ip = NULL; struct xfs_inode *ip = NULL;
...@@ -156,8 +156,12 @@ xfs_vn_mknod( ...@@ -156,8 +156,12 @@ xfs_vn_mknod(
if (error) if (error)
return error; return error;
xfs_dentry_to_name(&name, dentry, mode); if (!tmpfile) {
error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip); 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)) if (unlikely(error))
goto out_free_acl; goto out_free_acl;
...@@ -180,7 +184,11 @@ xfs_vn_mknod( ...@@ -180,7 +184,11 @@ xfs_vn_mknod(
} }
#endif #endif
d_instantiate(dentry, inode); if (tmpfile)
d_tmpfile(dentry, inode);
else
d_instantiate(dentry, inode);
out_free_acl: out_free_acl:
if (default_acl) if (default_acl)
posix_acl_release(default_acl); posix_acl_release(default_acl);
...@@ -189,10 +197,22 @@ xfs_vn_mknod( ...@@ -189,10 +197,22 @@ xfs_vn_mknod(
return -error; return -error;
out_cleanup_inode: out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry); if (!tmpfile)
xfs_cleanup_inode(dir, inode, dentry);
iput(inode);
goto out_free_acl; 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 STATIC int
xfs_vn_create( xfs_vn_create(
struct inode *dir, struct inode *dir,
...@@ -353,6 +373,7 @@ xfs_vn_symlink( ...@@ -353,6 +373,7 @@ xfs_vn_symlink(
out_cleanup_inode: out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry); xfs_cleanup_inode(dir, inode, dentry);
iput(inode);
out: out:
return -error; return -error;
} }
...@@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( ...@@ -1053,25 +1074,7 @@ xfs_vn_tmpfile(
struct dentry *dentry, struct dentry *dentry,
umode_t mode) umode_t mode)
{ {
int error; return xfs_generic_create(dir, dentry, mode, 0, true);
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;
} }
static const struct inode_operations xfs_inode_operations = { static const struct inode_operations xfs_inode_operations = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册