diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-06-07 07:20:27 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-06-29 10:57:10 +0200 |
commit | 60545d0d4610b02e55f65d141c95b18ccf855b6e (patch) | |
tree | 252111eed41e5f54a7bd13b054420f750cb5e069 /mm/shmem.c | |
parent | allow build_open_flags() to return an error (diff) | |
download | linux-60545d0d4610b02e55f65d141c95b18ccf855b6e.tar.xz linux-60545d0d4610b02e55f65d141c95b18ccf855b6e.zip |
[O_TMPFILE] it's still short a few helpers, but infrastructure should be OK now...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'mm/shmem.c')
-rw-r--r-- | mm/shmem.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index 5e6a8422658b..f887358dabc5 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1965,6 +1965,37 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) return error; } +static int +shmem_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) +{ + struct inode *inode; + int error = -ENOSPC; + + inode = shmem_get_inode(dir->i_sb, dir, mode, 0, VM_NORESERVE); + if (inode) { + error = security_inode_init_security(inode, dir, + NULL, + shmem_initxattrs, NULL); + if (error) { + if (error != -EOPNOTSUPP) { + iput(inode); + return error; + } + } +#ifdef CONFIG_TMPFS_POSIX_ACL + error = generic_acl_init(inode, dir); + if (error) { + iput(inode); + return error; + } +#else + error = 0; +#endif + d_tmpfile(dentry, inode); + } + return error; +} + static int shmem_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { int error; @@ -2723,6 +2754,7 @@ static const struct inode_operations shmem_dir_inode_operations = { .rmdir = shmem_rmdir, .mknod = shmem_mknod, .rename = shmem_rename, + .tmpfile = shmem_tmpfile, #endif #ifdef CONFIG_TMPFS_XATTR .setxattr = shmem_setxattr, |