summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-07-10 00:29:18 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-07-15 00:14:32 -0400
commit6b36e87b7f128ba08cf781f2d7ac2cb10c36ee64 (patch)
treee229b22070c2f8a8a2fd7e73dffaf11090bb4def
parent4e8ba8f6621d5fd309d2e97a2be0768b7ca0b772 (diff)
bcachefs: Convert bch2_symlink to new transactions
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/acl.c18
-rw-r--r--fs/bcachefs/acl.h6
-rw-r--r--fs/bcachefs/fs.c170
3 files changed, 56 insertions, 138 deletions
diff --git a/fs/bcachefs/acl.c b/fs/bcachefs/acl.c
index 596053f5119d..df42fa4df0da 100644
--- a/fs/bcachefs/acl.c
+++ b/fs/bcachefs/acl.c
@@ -278,24 +278,6 @@ int bch2_set_acl_trans(struct btree_trans *trans,
return ret == -ENOENT ? 0 : ret;
}
-int __bch2_set_acl(struct inode *vinode, struct posix_acl *acl, int type)
-{
- struct bch_inode_info *inode = to_bch_ei(vinode);
- struct bch_fs *c = inode->v.i_sb->s_fs_info;
- int ret;
-
- ret = bch2_trans_do(c, &inode->ei_journal_seq, BTREE_INSERT_ATOMIC,
- bch2_set_acl_trans(&trans,
- &inode->ei_inode,
- &inode->ei_str_hash,
- acl, type));
- if (ret)
- return ret;
-
- set_cached_acl(&inode->v, type, acl);
- return 0;
-}
-
static int inode_update_for_set_acl_fn(struct bch_inode_info *inode,
struct bch_inode_unpacked *bi,
void *p)
diff --git a/fs/bcachefs/acl.h b/fs/bcachefs/acl.h
index 1e15245e8040..e06724309ff8 100644
--- a/fs/bcachefs/acl.h
+++ b/fs/bcachefs/acl.h
@@ -31,7 +31,6 @@ int bch2_set_acl_trans(struct btree_trans *,
struct bch_inode_unpacked *,
const struct bch_hash_info *,
struct posix_acl *, int);
-int __bch2_set_acl(struct inode *, struct posix_acl *, int);
int bch2_set_acl(struct inode *, struct posix_acl *, int);
int bch2_acl_chmod(struct btree_trans *, struct bch_inode_info *,
umode_t, struct posix_acl **);
@@ -46,11 +45,6 @@ static inline int bch2_set_acl_trans(struct btree_trans *trans,
return 0;
}
-static inline int __bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
-{
- return 0;
-}
-
static inline int bch2_acl_chmod(struct btree_trans *trans,
struct bch_inode_info *inode,
umode_t mode,
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index de7f44062d45..c51a65da0fb3 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -229,99 +229,6 @@ static void bch2_inode_init_owner(struct bch_inode_unpacked *inode_u,
inode_u->bi_mode = mode;
}
-static struct bch_inode_info *bch2_vfs_inode_create(struct bch_fs *c,
- struct bch_inode_info *dir,
- umode_t mode, dev_t rdev)
-{
- struct posix_acl *default_acl = NULL, *acl = NULL;
- struct bch_inode_info *inode;
- struct bch_inode_unpacked inode_u;
- int ret;
-
- inode = to_bch_ei(new_inode(c->vfs_sb));
- if (unlikely(!inode))
- return ERR_PTR(-ENOMEM);
-
- inode_init_owner(&inode->v, &dir->v, mode);
-
-#ifdef CONFIG_BCACHEFS_POSIX_ACL
- ret = posix_acl_create(&dir->v, &inode->v.i_mode, &default_acl, &acl);
- if (ret)
- goto err_make_bad;
-#endif
-
- bch2_inode_init(c, &inode_u,
- i_uid_read(&inode->v),
- i_gid_read(&inode->v),
- inode->v.i_mode, rdev,
- &dir->ei_inode);
-
- inode_u.bi_project = dir->ei_qid.q[QTYP_PRJ];
-
- ret = bch2_quota_acct(c, bch_qid(&inode_u), Q_INO, 1, BCH_QUOTA_PREALLOC);
- if (ret)
- goto err_make_bad;
-
- ret = bch2_inode_create(c, &inode_u,
- BLOCKDEV_INODE_MAX, 0,
- &c->unused_inode_hint);
- if (unlikely(ret))
- goto err_acct_quota;
-
- bch2_vfs_inode_init(c, inode, &inode_u);
- atomic_long_inc(&c->nr_inodes);
-
- if (default_acl) {
- ret = __bch2_set_acl(&inode->v, default_acl, ACL_TYPE_DEFAULT);
- if (unlikely(ret))
- goto err;
- }
-
- if (acl) {
- ret = __bch2_set_acl(&inode->v, acl, ACL_TYPE_ACCESS);
- if (unlikely(ret))
- goto err;
- }
-
- insert_inode_hash(&inode->v);
-out:
- posix_acl_release(default_acl);
- posix_acl_release(acl);
- return inode;
-err_acct_quota:
- bch2_quota_acct(c, bch_qid(&inode_u), Q_INO, -1, BCH_QUOTA_WARN);
-err_make_bad:
- /*
- * indicate to bch_evict_inode that the inode was never actually
- * created:
- */
- make_bad_inode(&inode->v);
-err:
- clear_nlink(&inode->v);
- iput(&inode->v);
- inode = ERR_PTR(ret);
- goto out;
-}
-
-static int bch2_vfs_dirent_create(struct bch_fs *c,
- struct bch_inode_info *dir,
- u8 type, const struct qstr *name,
- u64 dst)
-{
- int ret;
-
- ret = bch2_dirent_create(c, dir->v.i_ino, &dir->ei_str_hash,
- type, name, dst,
- &dir->ei_journal_seq,
- BCH_HASH_SET_MUST_CREATE);
- if (unlikely(ret))
- return ret;
-
- dir->v.i_mtime = dir->v.i_ctime = current_time(&dir->v);
- mark_inode_dirty_sync(&dir->v);
- return 0;
-}
-
static int inode_update_for_create_fn(struct bch_inode_info *inode,
struct bch_inode_unpacked *bi,
void *p)
@@ -338,8 +245,9 @@ static int inode_update_for_create_fn(struct bch_inode_info *inode,
return 0;
}
-static int __bch2_create(struct bch_inode_info *dir, struct dentry *dentry,
- umode_t mode, dev_t rdev, bool tmpfile)
+static struct bch_inode_info *
+__bch2_create(struct bch_inode_info *dir, struct dentry *dentry,
+ umode_t mode, dev_t rdev, bool tmpfile)
{
struct bch_fs *c = dir->v.i_sb->s_fs_info;
struct btree_trans trans;
@@ -362,7 +270,7 @@ static int __bch2_create(struct bch_inode_info *dir, struct dentry *dentry,
ret = bch2_quota_acct(c, bch_qid(&inode_u), Q_INO, 1, BCH_QUOTA_PREALLOC);
if (ret)
- return ret;
+ return ERR_PTR(ret);
#ifdef CONFIG_BCACHEFS_POSIX_ACL
ret = posix_acl_create(&dir->v, &inode_u.bi_mode, &default_acl, &acl);
@@ -456,20 +364,17 @@ retry:
}
bch2_trans_exit(&trans);
-
- if (tmpfile)
- d_mark_tmpfile(dentry, &inode->v);
- d_instantiate(dentry, &inode->v);
out:
posix_acl_release(default_acl);
posix_acl_release(acl);
- return ret;
+ return inode;
err_trans:
bch2_trans_exit(&trans);
make_bad_inode(&inode->v);
iput(&inode->v);
err:
bch2_quota_acct(c, bch_qid(&inode_u), Q_INO, -1, BCH_QUOTA_WARN);
+ inode = ERR_PTR(ret);
goto out;
}
@@ -496,7 +401,14 @@ static struct dentry *bch2_lookup(struct inode *vdir, struct dentry *dentry,
static int bch2_create(struct inode *vdir, struct dentry *dentry,
umode_t mode, bool excl)
{
- return __bch2_create(to_bch_ei(vdir), dentry, mode|S_IFREG, 0, false);
+ struct bch_inode_info *inode =
+ __bch2_create(to_bch_ei(vdir), dentry, mode|S_IFREG, 0, false);
+
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+
+ d_instantiate(dentry, &inode->v);
+ return 0;
}
static int inode_update_for_link_fn(struct bch_inode_info *inode,
@@ -516,12 +428,11 @@ static int inode_update_for_link_fn(struct bch_inode_info *inode,
return 0;
}
-static int bch2_link(struct dentry *old_dentry, struct inode *vdir,
- struct dentry *dentry)
+static int __bch2_link(struct bch_fs *c,
+ struct bch_inode_info *inode,
+ struct bch_inode_info *dir,
+ struct dentry *dentry)
{
- struct bch_fs *c = vdir->i_sb->s_fs_info;
- struct bch_inode_info *dir = to_bch_ei(vdir);
- struct bch_inode_info *inode = to_bch_ei(old_dentry->d_inode);
struct btree_trans trans;
struct bch_inode_unpacked inode_u;
int ret;
@@ -553,7 +464,18 @@ retry:
bch2_inode_update_after_write(c, inode, &inode_u, ATTR_CTIME);
bch2_trans_exit(&trans);
+ return ret;
+}
+
+static int bch2_link(struct dentry *old_dentry, struct inode *vdir,
+ struct dentry *dentry)
+{
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir = to_bch_ei(vdir);
+ struct bch_inode_info *inode = to_bch_ei(old_dentry->d_inode);
+ int ret;
+ ret = __bch2_link(c, inode, dir, dentry);
if (unlikely(ret))
return ret;
@@ -645,7 +567,7 @@ static int bch2_symlink(struct inode *vdir, struct dentry *dentry,
struct bch_inode_info *dir = to_bch_ei(vdir), *inode;
int ret;
- inode = bch2_vfs_inode_create(c, dir, S_IFLNK|S_IRWXUGO, 0);
+ inode = __bch2_create(dir, dentry, S_IFLNK|S_IRWXUGO, 0, true);
if (unlikely(IS_ERR(inode)))
return PTR_ERR(inode);
@@ -662,22 +584,27 @@ static int bch2_symlink(struct inode *vdir, struct dentry *dentry,
journal_seq_copy(dir, inode->ei_journal_seq);
- ret = bch2_vfs_dirent_create(c, dir, DT_LNK, &dentry->d_name,
- inode->v.i_ino);
+ ret = __bch2_link(c, inode, dir, dentry);
if (unlikely(ret))
goto err;
d_instantiate(dentry, &inode->v);
return 0;
err:
- clear_nlink(&inode->v);
iput(&inode->v);
return ret;
}
static int bch2_mkdir(struct inode *vdir, struct dentry *dentry, umode_t mode)
{
- return __bch2_create(to_bch_ei(vdir), dentry, mode|S_IFDIR, 0, false);
+ struct bch_inode_info *inode =
+ __bch2_create(to_bch_ei(vdir), dentry, mode|S_IFDIR, 0, false);
+
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+
+ d_instantiate(dentry, &inode->v);
+ return 0;
}
static int bch2_rmdir(struct inode *vdir, struct dentry *dentry)
@@ -693,7 +620,14 @@ static int bch2_rmdir(struct inode *vdir, struct dentry *dentry)
static int bch2_mknod(struct inode *vdir, struct dentry *dentry,
umode_t mode, dev_t rdev)
{
- return __bch2_create(to_bch_ei(vdir), dentry, mode, rdev, false);
+ struct bch_inode_info *inode =
+ __bch2_create(to_bch_ei(vdir), dentry, mode, rdev, false);
+
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+
+ d_instantiate(dentry, &inode->v);
+ return 0;
}
struct rename_info {
@@ -990,7 +924,15 @@ static int bch2_setattr(struct dentry *dentry, struct iattr *iattr)
static int bch2_tmpfile(struct inode *vdir, struct dentry *dentry, umode_t mode)
{
- return __bch2_create(to_bch_ei(vdir), dentry, mode, 0, true);
+ struct bch_inode_info *inode =
+ __bch2_create(to_bch_ei(vdir), dentry, mode, 0, true);
+
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+
+ d_mark_tmpfile(dentry, &inode->v);
+ d_instantiate(dentry, &inode->v);
+ return 0;
}
static int bch2_fill_extent(struct fiemap_extent_info *info,