]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs.c
Update bcachefs sources to a8115093df bcachefs: Fix divide by zero in rebalance_work()
[bcachefs-tools-debian] / libbcachefs / fs.c
index 05f1bdee7260d21e34f4c7eec7fdfbef44e205b0..8958957b648bd7ef16f7b2a3f78e447ab7b31ca5 100644 (file)
 #include "fs-common.h"
 #include "fs-io.h"
 #include "fs-ioctl.h"
+#include "fs-io-buffered.h"
+#include "fs-io-direct.h"
+#include "fs-io-pagecache.h"
 #include "fsck.h"
 #include "inode.h"
 #include "io.h"
 #include "journal.h"
 #include "keylist.h"
 #include "quota.h"
+#include "snapshot.h"
 #include "super.h"
 #include "xattr.h"
 
@@ -89,7 +93,7 @@ retry:
 
        ret   = bch2_inode_peek(&trans, &iter, &inode_u, inode_inum(inode),
                                BTREE_ITER_INTENT) ?:
-               (set ? set(inode, &inode_u, p) : 0) ?:
+               (set ? set(&trans, inode, &inode_u, p) : 0) ?:
                bch2_inode_write(&trans, &iter, &inode_u) ?:
                bch2_trans_commit(&trans, NULL, NULL, BTREE_INSERT_NOFAIL);
 
@@ -203,7 +207,7 @@ struct inode *bch2_vfs_inode_get(struct bch_fs *c, subvol_inum inum)
 
        if (ret) {
                iget_failed(&inode->v);
-               return ERR_PTR(ret);
+               return ERR_PTR(bch2_err_class(ret));
        }
 
        mutex_lock(&c->vfs_inodes_lock);
@@ -943,6 +947,7 @@ retry:
                cur.k->k.p.offset += cur.k->k.size;
 
                if (have_extent) {
+                       bch2_trans_unlock(&trans);
                        ret = bch2_fill_extent(c, info,
                                        bkey_i_to_s_c(prev.k), 0);
                        if (ret)
@@ -961,9 +966,11 @@ err:
        if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
                goto retry;
 
-       if (!ret && have_extent)
+       if (!ret && have_extent) {
+               bch2_trans_unlock(&trans);
                ret = bch2_fill_extent(c, info, bkey_i_to_s_c(prev.k),
                                       FIEMAP_EXTENT_LAST);
+       }
 
        bch2_trans_exit(&trans);
        bch2_bkey_buf_exit(&cur, c);
@@ -997,11 +1004,16 @@ static int bch2_vfs_readdir(struct file *file, struct dir_context *ctx)
 {
        struct bch_inode_info *inode = file_bch_inode(file);
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
+       int ret;
 
        if (!dir_emit_dots(file, ctx))
                return 0;
 
-       return bch2_readdir(c, inode_inum(inode), ctx);
+       ret = bch2_readdir(c, inode_inum(inode), ctx);
+       if (ret)
+               bch_err_fn(c, ret);
+
+       return bch2_err_class(ret);
 }
 
 static const struct file_operations bch_file_operations = {
@@ -1011,7 +1023,7 @@ static const struct file_operations bch_file_operations = {
        .mmap           = bch2_mmap,
        .open           = generic_file_open,
        .fsync          = bch2_fsync,
-       .splice_read    = generic_file_splice_read,
+       .splice_read    = filemap_splice_read,
        .splice_write   = iter_file_splice_write,
        .fallocate      = bch2_fallocate_dispatch,
        .unlocked_ioctl = bch2_fs_file_ioctl,
@@ -1226,7 +1238,8 @@ static int bch2_get_name(struct dentry *parent, char *name, struct dentry *child
        struct bch_inode_unpacked inode_u;
        subvol_inum target;
        u32 snapshot;
-       unsigned name_len;
+       struct qstr dirent_name;
+       unsigned name_len = 0;
        int ret;
 
        if (!S_ISDIR(dir->v.i_mode))
@@ -1303,9 +1316,10 @@ retry:
        ret = -ENOENT;
        goto err;
 found:
-       name_len = min_t(unsigned, bch2_dirent_name_bytes(d), NAME_MAX);
+       dirent_name = bch2_dirent_get_name(d);
 
-       memcpy(name, d.v->d_name, name_len);
+       name_len = min_t(unsigned, dirent_name.len, NAME_MAX);
+       memcpy(name, dirent_name.name, name_len);
        name[name_len] = '\0';
 err:
        if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
@@ -1403,7 +1417,8 @@ static void bch2_destroy_inode(struct inode *vinode)
        call_rcu(&vinode->i_rcu, bch2_i_callback);
 }
 
-static int inode_update_times_fn(struct bch_inode_info *inode,
+static int inode_update_times_fn(struct btree_trans *trans,
+                                struct bch_inode_info *inode,
                                 struct bch_inode_unpacked *bi,
                                 void *p)
 {
@@ -1923,7 +1938,7 @@ int __init bch2_vfs_init(void)
 {
        int ret = -ENOMEM;
 
-       bch2_inode_cache = KMEM_CACHE(bch_inode_info, 0);
+       bch2_inode_cache = KMEM_CACHE(bch_inode_info, SLAB_RECLAIM_ACCOUNT);
        if (!bch2_inode_cache)
                goto err;