]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to a8faf2472b bcachefs: Update directory timestamps during...
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 18 Dec 2019 20:28:41 +0000 (15:28 -0500)
committerKent Overstreet <kent.overstreet@gmail.com>
Wed, 18 Dec 2019 20:30:16 +0000 (15:30 -0500)
.bcachefs_revision
cmd_migrate.c
libbcachefs/fs-common.c
libbcachefs/fs-common.h
libbcachefs/fs-io.c
libbcachefs/fs.c
libbcachefs/fsck.c

index 7ea6a71d7e0f2e754be7bb24faa0b236100478b5..d8ca95c6b073cf56756d579314b2e1cb63166e5f 100644 (file)
@@ -1 +1 @@
-adfbb84c7c986f2f46f363d95bca33b4c470dad0
+a8faf2472b83bb675aceca3e43f20d232409b1cc
index 7d15a08eea5bb5782f4a72748a8248c494a2f2ac..14532b6a2e6503dd8f2e408066b219a76735cf2e 100644 (file)
@@ -134,11 +134,12 @@ static void create_link(struct bch_fs *c,
                        const char *name, u64 inum, mode_t mode)
 {
        struct qstr qstr = QSTR(name);
+       struct bch_inode_unpacked parent_u;
        struct bch_inode_unpacked inode;
 
        int ret = bch2_trans_do(c, NULL, BTREE_INSERT_ATOMIC,
-               bch2_link_trans(&trans, parent->bi_inum,
-                               inum, &inode, &qstr));
+               bch2_link_trans(&trans, parent->bi_inum, inum,
+                               &parent_u, &inode, &qstr));
        if (ret)
                die("error creating hardlink: %s", strerror(-ret));
 }
index a4497eeb1f1bb7d2747199877702089818a50739..96f7bbe0a3eddf2483e9067805743f7e73519488 100644 (file)
@@ -76,11 +76,10 @@ int bch2_create_trans(struct btree_trans *trans, u64 dir_inum,
 }
 
 int bch2_link_trans(struct btree_trans *trans, u64 dir_inum,
-                   u64 inum, struct bch_inode_unpacked *inode_u,
-                   const struct qstr *name)
+                   u64 inum, struct bch_inode_unpacked *dir_u,
+                   struct bch_inode_unpacked *inode_u, const struct qstr *name)
 {
        struct btree_iter *dir_iter, *inode_iter;
-       struct bch_inode_unpacked dir_u;
        struct bch_hash_info dir_hash;
        u64 now = bch2_current_time(trans->c);
 
@@ -91,18 +90,19 @@ int bch2_link_trans(struct btree_trans *trans, u64 dir_inum,
        inode_u->bi_ctime = now;
        bch2_inode_nlink_inc(inode_u);
 
-       dir_iter = bch2_inode_peek(trans, &dir_u, dir_inum, 0);
+       dir_iter = bch2_inode_peek(trans, dir_u, dir_inum, 0);
        if (IS_ERR(dir_iter))
                return PTR_ERR(dir_iter);
 
-       /* XXX: shouldn't we be updating mtime/ctime on the directory? */
+       dir_u->bi_mtime = dir_u->bi_ctime = now;
 
-       dir_hash = bch2_hash_info_init(trans->c, &dir_u);
+       dir_hash = bch2_hash_info_init(trans->c, dir_u);
        bch2_trans_iter_put(trans, dir_iter);
 
        return bch2_dirent_create(trans, dir_inum, &dir_hash,
                                  mode_to_type(inode_u->bi_mode),
                                  name, inum, BCH_HASH_SET_MUST_CREATE) ?:
+               bch2_inode_write(trans, dir_iter, dir_u) ?:
                bch2_inode_write(trans, inode_iter, inode_u);
 }
 
index c1621485a526b7e77a7ec802de9b850e6b69c82e..2273b7961c9be6ab2d8960fda7f86068d4e44cad 100644 (file)
@@ -14,6 +14,7 @@ int bch2_create_trans(struct btree_trans *, u64,
 
 int bch2_link_trans(struct btree_trans *, u64,
                    u64, struct bch_inode_unpacked *,
+                   struct bch_inode_unpacked *,
                    const struct qstr *);
 
 int bch2_unlink_trans(struct btree_trans *,
index 160644ccf439ac9b05696a1484f00056486dc209..7f954a5d0b96508cacfa12281a1e4c330139a0eb 100644 (file)
@@ -2284,6 +2284,15 @@ int bch2_truncate(struct bch_inode_info *inode, struct iattr *iattr)
        ret = PTR_ERR_OR_ZERO(iter);
        bch2_trans_exit(&trans);
 
+       if (ret)
+               goto err;
+
+       /*
+        * check this before next assertion; on filesystem error our normal
+        * invariants are a bit broken (truncate has to truncate the page cache
+        * before the inode).
+        */
+       ret = bch2_journal_error(&c->journal);
        if (ret)
                goto err;
 
index 6fc6d504b094f2f06a37e495f45002380fff6182..278c6d5b3c385c953482eeb7f010c957cd58f34a 100644 (file)
@@ -379,7 +379,7 @@ static int __bch2_link(struct bch_fs *c,
                       struct dentry *dentry)
 {
        struct btree_trans trans;
-       struct bch_inode_unpacked inode_u;
+       struct bch_inode_unpacked dir_u, inode_u;
        int ret;
 
        mutex_lock(&inode->ei_update_lock);
@@ -389,7 +389,7 @@ static int __bch2_link(struct bch_fs *c,
                bch2_trans_begin(&trans);
                ret   = bch2_link_trans(&trans,
                                        dir->v.i_ino,
-                                       inode->v.i_ino, &inode_u,
+                                       inode->v.i_ino, &dir_u, &inode_u,
                                        &dentry->d_name) ?:
                        bch2_trans_commit(&trans, NULL,
                                        &inode->ei_journal_seq,
@@ -397,8 +397,14 @@ static int __bch2_link(struct bch_fs *c,
                                        BTREE_INSERT_NOUNLOCK);
        } while (ret == -EINTR);
 
-       if (likely(!ret))
+       if (likely(!ret)) {
+               BUG_ON(inode_u.bi_inum != inode->v.i_ino);
+
+               journal_seq_copy(inode, dir->ei_journal_seq);
+               bch2_inode_update_after_write(c, dir, &dir_u,
+                                             ATTR_MTIME|ATTR_CTIME);
                bch2_inode_update_after_write(c, inode, &inode_u, ATTR_CTIME);
+       }
 
        bch2_trans_exit(&trans);
        mutex_unlock(&inode->ei_update_lock);
index 0f2308e53d652dfe86344f3e67c26f527b07554e..3ae545b31c7a0645488c07faec596cdcc54a08d1 100644 (file)
@@ -80,7 +80,7 @@ static int reattach_inode(struct bch_fs *c,
                          struct bch_inode_unpacked *lostfound_inode,
                          u64 inum)
 {
-       struct bch_inode_unpacked inode_u;
+       struct bch_inode_unpacked dir_u, inode_u;
        char name_buf[20];
        struct qstr name;
        int ret;
@@ -92,7 +92,7 @@ static int reattach_inode(struct bch_fs *c,
                            BTREE_INSERT_ATOMIC|
                            BTREE_INSERT_LAZY_RW,
                bch2_link_trans(&trans, lostfound_inode->bi_inum,
-                               inum, &inode_u, &name));
+                               inum, &dir_u, &inode_u, &name));
        if (ret)
                bch_err(c, "error %i reattaching inode %llu", ret, inum);