Add function nilfs2_tmpfile to support O_TMPFILE file creation. tmpfile testcases(generic/(004,389,509,530,531) except generic/389,530 (need acl and shutdown supported) now run/pass. Signed-off-by: Hongbo Li <lihongbo22@xxxxxxxxxx> --- fs/nilfs2/namei.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index c950139db6ef..a36667d7a5e8 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c @@ -125,6 +125,36 @@ nilfs_mknod(struct mnt_idmap *idmap, struct inode *dir, return err; } +static int nilfs_tmpfile(struct mnt_idmap *idmap, struct inode *dir, + struct file *file, umode_t mode) +{ + struct inode *inode; + struct nilfs_transaction_info ti; + int err; + + err = nilfs_transaction_begin(dir->i_sb, &ti, 1); + if (err) + return err; + + inode = nilfs_new_inode(dir, mode); + err = PTR_ERR(inode); + if (!IS_ERR(inode)) { + inode->i_op = &nilfs_file_inode_operations; + inode->i_fop = &nilfs_file_operations; + inode->i_mapping->a_ops = &nilfs_aops; + nilfs_mark_inode_dirty(inode); + d_tmpfile(file, inode); + unlock_new_inode(inode); + err = 0; + } + if (!err) + err = nilfs_transaction_commit(dir->i_sb); + else + nilfs_transaction_abort(dir->i_sb); + + return finish_open_simple(file, err); +} + static int nilfs_symlink(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, const char *symname) { @@ -544,6 +574,7 @@ const struct inode_operations nilfs_dir_inode_operations = { .mkdir = nilfs_mkdir, .rmdir = nilfs_rmdir, .mknod = nilfs_mknod, + .tmpfile = nilfs_tmpfile, .rename = nilfs_rename, .setattr = nilfs_setattr, .permission = nilfs_permission, -- 2.34.1