]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs.c
Update bcachefs sources to c7defb5793 bcachefs: Split btree_iter_traverse and bch2_bt...
[bcachefs-tools-debian] / libbcachefs / fs.c
index e3edca4d265b60fe094905e3f74b0d415d4fd6a0..8034d48c62bb0a9feb273ff4f5bbbf35e8795709 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "bcachefs.h"
 #include "acl.h"
-#include "bkey_on_stack.h"
+#include "bkey_buf.h"
 #include "btree_update.h"
 #include "buckets.h"
 #include "chardev.h"
@@ -368,11 +368,11 @@ static struct dentry *bch2_lookup(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_hash_info hash = bch2_hash_info_init(c, &dir->ei_inode);
        struct inode *vinode = NULL;
        u64 inum;
 
-       inum = bch2_dirent_lookup(c, dir->v.i_ino,
-                                 &dir->ei_str_hash,
+       inum = bch2_dirent_lookup(c, dir->v.i_ino, &hash,
                                  &dentry->d_name);
 
        if (inum)
@@ -412,16 +412,12 @@ static int __bch2_link(struct bch_fs *c,
        mutex_lock(&inode->ei_update_lock);
        bch2_trans_init(&trans, c, 4, 1024);
 
-       do {
-               bch2_trans_begin(&trans);
-               ret   = bch2_link_trans(&trans,
+       ret = __bch2_trans_do(&trans, NULL, &inode->ei_journal_seq,
+                             BTREE_INSERT_NOUNLOCK,
+                       bch2_link_trans(&trans,
                                        dir->v.i_ino,
                                        inode->v.i_ino, &dir_u, &inode_u,
-                                       &dentry->d_name) ?:
-                       bch2_trans_commit(&trans, NULL,
-                                       &inode->ei_journal_seq,
-                                       BTREE_INSERT_NOUNLOCK);
-       } while (ret == -EINTR);
+                                       &dentry->d_name));
 
        if (likely(!ret)) {
                BUG_ON(inode_u.bi_inum != inode->v.i_ino);
@@ -468,17 +464,12 @@ static int bch2_unlink(struct inode *vdir, struct dentry *dentry)
        bch2_lock_inodes(INODE_UPDATE_LOCK, dir, inode);
        bch2_trans_init(&trans, c, 4, 1024);
 
-       do {
-               bch2_trans_begin(&trans);
-
-               ret   = bch2_unlink_trans(&trans,
+       ret = __bch2_trans_do(&trans, NULL, &dir->ei_journal_seq,
+                             BTREE_INSERT_NOUNLOCK|
+                             BTREE_INSERT_NOFAIL,
+                       bch2_unlink_trans(&trans,
                                          dir->v.i_ino, &dir_u,
-                                         &inode_u, &dentry->d_name) ?:
-                       bch2_trans_commit(&trans, NULL,
-                                         &dir->ei_journal_seq,
-                                         BTREE_INSERT_NOUNLOCK|
-                                         BTREE_INSERT_NOFAIL);
-       } while (ret == -EINTR);
+                                         &inode_u, &dentry->d_name));
 
        if (likely(!ret)) {
                BUG_ON(inode_u.bi_inum != inode->v.i_ino);
@@ -592,21 +583,16 @@ static int bch2_rename2(struct inode *src_vdir, struct dentry *src_dentry,
                        goto err;
        }
 
-retry:
-       bch2_trans_begin(&trans);
-       ret   = bch2_rename_trans(&trans,
-                                 src_dir->v.i_ino, &src_dir_u,
-                                 dst_dir->v.i_ino, &dst_dir_u,
-                                 &src_inode_u,
-                                 &dst_inode_u,
-                                 &src_dentry->d_name,
-                                 &dst_dentry->d_name,
-                                 mode) ?:
-               bch2_trans_commit(&trans, NULL,
-                                 &journal_seq,
-                                 BTREE_INSERT_NOUNLOCK);
-       if (ret == -EINTR)
-               goto retry;
+       ret = __bch2_trans_do(&trans, NULL, &journal_seq,
+                             BTREE_INSERT_NOUNLOCK,
+                       bch2_rename_trans(&trans,
+                                         src_dir->v.i_ino, &src_dir_u,
+                                         dst_dir->v.i_ino, &dst_dir_u,
+                                         &src_inode_u,
+                                         &dst_inode_u,
+                                         &src_dentry->d_name,
+                                         &dst_dentry->d_name,
+                                         mode));
        if (unlikely(ret))
                goto err;
 
@@ -728,7 +714,7 @@ retry:
        bch2_setattr_copy(inode, &inode_u, attr);
 
        if (attr->ia_valid & ATTR_MODE) {
-               ret = bch2_acl_chmod(&trans, inode, inode_u.bi_mode, &acl);
+               ret = bch2_acl_chmod(&trans, &inode_u, inode_u.bi_mode, &acl);
                if (ret)
                        goto btree_err;
        }
@@ -739,6 +725,8 @@ retry:
                                  BTREE_INSERT_NOUNLOCK|
                                  BTREE_INSERT_NOFAIL);
 btree_err:
+       bch2_trans_iter_put(&trans, inode_iter);
+
        if (ret == -EINTR)
                goto retry;
        if (unlikely(ret))
@@ -886,7 +874,7 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
        struct btree_trans trans;
        struct btree_iter *iter;
        struct bkey_s_c k;
-       struct bkey_on_stack cur, prev;
+       struct bkey_buf cur, prev;
        struct bpos end = POS(ei->v.i_ino, (start + len) >> 9);
        unsigned offset_into_extent, sectors;
        bool have_extent = false;
@@ -899,19 +887,21 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
        if (start + len < start)
                return -EINVAL;
 
-       bkey_on_stack_init(&cur);
-       bkey_on_stack_init(&prev);
+       bch2_bkey_buf_init(&cur);
+       bch2_bkey_buf_init(&prev);
        bch2_trans_init(&trans, c, 0, 0);
 
-       iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS,
+       iter = bch2_trans_get_iter(&trans, BTREE_ID_extents,
                                   POS(ei->v.i_ino, start >> 9), 0);
 retry:
        while ((k = bch2_btree_iter_peek(iter)).k &&
               !(ret = bkey_err(k)) &&
               bkey_cmp(iter->pos, end) < 0) {
+               enum btree_id data_btree = BTREE_ID_extents;
+
                if (!bkey_extent_is_data(k.k) &&
                    k.k->type != KEY_TYPE_reservation) {
-                       bch2_btree_iter_next(iter);
+                       bch2_btree_iter_advance(iter);
                        continue;
                }
 
@@ -919,15 +909,15 @@ retry:
                        bkey_start_offset(k.k);
                sectors                 = k.k->size - offset_into_extent;
 
-               bkey_on_stack_reassemble(&cur, c, k);
+               bch2_bkey_buf_reassemble(&cur, c, k);
 
-               ret = bch2_read_indirect_extent(&trans,
+               ret = bch2_read_indirect_extent(&trans, &data_btree,
                                        &offset_into_extent, &cur);
                if (ret)
                        break;
 
                k = bkey_i_to_s_c(cur.k);
-               bkey_on_stack_realloc(&prev, c, k.k->u64s);
+               bch2_bkey_buf_realloc(&prev, c, k.k->u64s);
 
                sectors = min(sectors, k.k->size - offset_into_extent);
 
@@ -960,9 +950,10 @@ retry:
                ret = bch2_fill_extent(c, info, bkey_i_to_s_c(prev.k),
                                       FIEMAP_EXTENT_LAST);
 
+       bch2_trans_iter_put(&trans, iter);
        ret = bch2_trans_exit(&trans) ?: ret;
-       bkey_on_stack_exit(&cur, c);
-       bkey_on_stack_exit(&prev, c);
+       bch2_bkey_buf_exit(&cur, c);
+       bch2_bkey_buf_exit(&prev, c);
        return ret < 0 ? ret : 0;
 }
 
@@ -1007,10 +998,10 @@ static const struct file_operations bch_file_operations = {
        .open           = generic_file_open,
        .fsync          = bch2_fsync,
        .splice_read    = generic_file_splice_read,
-       /*
-        * Broken, on v5.3:
+#if 0
+       /* Busted: */
        .splice_write   = iter_file_splice_write,
-       */
+#endif
        .fallocate      = bch2_fallocate_dispatch,
        .unlocked_ioctl = bch2_fs_file_ioctl,
 #ifdef CONFIG_COMPAT
@@ -1154,7 +1145,6 @@ static void bch2_vfs_inode_init(struct bch_fs *c,
        inode->ei_flags         = 0;
        inode->ei_journal_seq   = 0;
        inode->ei_quota_reserved = 0;
-       inode->ei_str_hash      = bch2_hash_info_init(c, bi);
        inode->ei_qid           = bch_qid(bi);
 
        inode->v.i_mapping->a_ops = &bch_address_space_operations;