]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs.c
Update bcachefs sources to f38382c574 bcachefs: Improve key marking interface
[bcachefs-tools-debian] / libbcachefs / fs.c
index 55fc88d33d94dbd8f5a3ccd2e9ff89a14964b887..a324278b6f43d1df3dcf0d67664c2b52d0458ec3 100644 (file)
@@ -106,7 +106,7 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans,
                                void *p)
 {
        struct bch_fs *c = trans->c;
-       struct btree_iter *iter;
+       struct btree_iter *iter = NULL;
        struct bkey_inode_buf *inode_p;
        int ret;
 
@@ -164,7 +164,7 @@ int __must_check bch2_write_inode(struct bch_fs *c,
        struct bch_inode_unpacked inode_u;
        int ret;
 
-       bch2_trans_init(&trans, c);
+       bch2_trans_init(&trans, c, 0, 0);
 retry:
        bch2_trans_begin(&trans);
 
@@ -355,7 +355,7 @@ __bch2_create(struct bch_inode_info *dir, struct dentry *dentry,
        if (!tmpfile)
                mutex_lock(&dir->ei_update_lock);
 
-       bch2_trans_init(&trans, c);
+       bch2_trans_init(&trans, c, 8, 1024);
 retry:
        bch2_trans_begin(&trans);
 
@@ -395,7 +395,7 @@ retry:
        if (!tmpfile) {
                bch2_inode_update_after_write(c, dir, &dir_u,
                                              ATTR_MTIME|ATTR_CTIME);
-               journal_seq_copy(dir, inode->ei_journal_seq);
+               journal_seq_copy(dir, journal_seq);
                mutex_unlock(&dir->ei_update_lock);
        }
 
@@ -507,7 +507,7 @@ static int __bch2_link(struct bch_fs *c,
        int ret;
 
        mutex_lock(&inode->ei_update_lock);
-       bch2_trans_init(&trans, c);
+       bch2_trans_init(&trans, c, 4, 1024);
 retry:
        bch2_trans_begin(&trans);
 
@@ -594,7 +594,7 @@ static int bch2_unlink(struct inode *vdir, struct dentry *dentry)
        int ret;
 
        bch2_lock_inodes(dir, inode);
-       bch2_trans_init(&trans, c);
+       bch2_trans_init(&trans, c, 4, 1024);
 retry:
        bch2_trans_begin(&trans);
 
@@ -801,13 +801,13 @@ static int bch2_rename2(struct inode *src_vdir, struct dentry *src_dentry,
                        return ret;
        }
 
+       bch2_trans_init(&trans, c, 8, 2048);
+
        bch2_lock_inodes(i.src_dir,
                         i.dst_dir,
                         i.src_inode,
                         i.dst_inode);
 
-       bch2_trans_init(&trans, c);
-
        if (S_ISDIR(i.src_inode->v.i_mode) &&
            inode_attrs_changing(i.dst_dir, i.src_inode)) {
                ret = -EXDEV;
@@ -968,7 +968,7 @@ static int bch2_setattr_nonsize(struct bch_inode_info *inode, struct iattr *iatt
        if (ret)
                goto err;
 
-       bch2_trans_init(&trans, c);
+       bch2_trans_init(&trans, c, 0, 0);
 retry:
        bch2_trans_begin(&trans);
        kfree(acl);
@@ -1113,7 +1113,8 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
 {
        struct bch_fs *c = vinode->i_sb->s_fs_info;
        struct bch_inode_info *ei = to_bch_ei(vinode);
-       struct btree_iter iter;
+       struct btree_trans trans;
+       struct btree_iter *iter;
        struct bkey_s_c k;
        BKEY_PADDED(k) tmp;
        bool have_extent = false;
@@ -1122,8 +1123,10 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
        if (start + len < start)
                return -EINVAL;
 
-       for_each_btree_key(&iter, c, BTREE_ID_EXTENTS,
-                          POS(ei->v.i_ino, start >> 9), 0, k)
+       bch2_trans_init(&trans, c, 0, 0);
+
+       for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS,
+                          POS(ei->v.i_ino, start >> 9), 0, k, ret)
                if (bkey_extent_is_data(k.k) ||
                    k.k->type == KEY_TYPE_reservation) {
                        if (bkey_cmp(bkey_start_pos(k.k),
@@ -1133,17 +1136,17 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
                        if (have_extent) {
                                ret = bch2_fill_extent(info, &tmp.k, 0);
                                if (ret)
-                                       goto out;
+                                       break;
                        }
 
                        bkey_reassemble(&tmp.k, k);
                        have_extent = true;
                }
 
-       if (have_extent)
+       if (!ret && have_extent)
                ret = bch2_fill_extent(info, &tmp.k, FIEMAP_EXTENT_LAST);
-out:
-       bch2_btree_iter_unlock(&iter);
+
+       ret = bch2_trans_exit(&trans) ?: ret;
        return ret < 0 ? ret : 0;
 }
 
@@ -1508,7 +1511,7 @@ static struct bch_fs *__bch2_open_as_blockdevs(const char *dev_name, char * cons
                 */
 
                c1 = bch2_path_to_fs(devs[0]);
-               if (!c1)
+               if (IS_ERR(c1))
                        return c;
 
                for (i = 1; i < nr_devs; i++) {
@@ -1530,7 +1533,7 @@ static struct bch_fs *__bch2_open_as_blockdevs(const char *dev_name, char * cons
 
        mutex_lock(&c->state_lock);
 
-       if (!bch2_fs_running(c)) {
+       if (!test_bit(BCH_FS_STARTED, &c->flags)) {
                mutex_unlock(&c->state_lock);
                closure_put(&c->cl);
                pr_err("err mounting %s: incomplete filesystem", dev_name);
@@ -1579,29 +1582,28 @@ static int bch2_remount(struct super_block *sb, int *flags, char *data)
        struct bch_opts opts = bch2_opts_empty();
        int ret;
 
-       opt_set(opts, read_only, (*flags & MS_RDONLY) != 0);
+       opt_set(opts, read_only, (*flags & SB_RDONLY) != 0);
 
        ret = bch2_parse_mount_opts(&opts, data);
        if (ret)
                return ret;
 
        if (opts.read_only != c->opts.read_only) {
-               const char *err = NULL;
-
                mutex_lock(&c->state_lock);
 
                if (opts.read_only) {
                        bch2_fs_read_only(c);
 
-                       sb->s_flags |= MS_RDONLY;
+                       sb->s_flags |= SB_RDONLY;
                } else {
-                       err = bch2_fs_read_write(c);
-                       if (err) {
-                               bch_err(c, "error going rw: %s", err);
+                       ret = bch2_fs_read_write(c);
+                       if (ret) {
+                               bch_err(c, "error going rw: %i", ret);
+                               mutex_unlock(&c->state_lock);
                                return -EINVAL;
                        }
 
-                       sb->s_flags &= ~MS_RDONLY;
+                       sb->s_flags &= ~SB_RDONLY;
                }
 
                c->opts.read_only = opts.read_only;
@@ -1679,7 +1681,7 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
        unsigned i;
        int ret;
 
-       opt_set(opts, read_only, (flags & MS_RDONLY) != 0);
+       opt_set(opts, read_only, (flags & SB_RDONLY) != 0);
 
        ret = bch2_parse_mount_opts(&opts, data);
        if (ret)
@@ -1689,7 +1691,7 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
        if (IS_ERR(c))
                return ERR_CAST(c);
 
-       sb = sget(fs_type, bch2_test_super, bch2_set_super, flags|MS_NOSEC, c);
+       sb = sget(fs_type, bch2_test_super, bch2_set_super, flags|SB_NOSEC, c);
        if (IS_ERR(sb)) {
                closure_put(&c->cl);
                return ERR_CAST(sb);
@@ -1700,7 +1702,7 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
        if (sb->s_root) {
                closure_put(&c->cl);
 
-               if ((flags ^ sb->s_flags) & MS_RDONLY) {
+               if ((flags ^ sb->s_flags) & SB_RDONLY) {
                        ret = -EBUSY;
                        goto err_put_super;
                }
@@ -1743,22 +1745,25 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
 
 #ifdef CONFIG_BCACHEFS_POSIX_ACL
        if (c->opts.acl)
-               sb->s_flags     |= MS_POSIXACL;
+               sb->s_flags     |= SB_POSIXACL;
 #endif
 
        vinode = bch2_vfs_inode_get(c, BCACHEFS_ROOT_INO);
        if (IS_ERR(vinode)) {
+               bch_err(c, "error mounting: error getting root inode %i",
+                       (int) PTR_ERR(vinode));
                ret = PTR_ERR(vinode);
                goto err_put_super;
        }
 
        sb->s_root = d_make_root(vinode);
        if (!sb->s_root) {
+               bch_err(c, "error mounting: error allocating root dentry");
                ret = -ENOMEM;
                goto err_put_super;
        }
 
-       sb->s_flags |= MS_ACTIVE;
+       sb->s_flags |= SB_ACTIVE;
 out:
        return dget(sb->s_root);