bcachefs: bch2_xattr_set() now updates ctime
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 9 Jul 2023 18:18:28 +0000 (14:18 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:06 +0000 (17:10 -0400)
Fixes fstests generic/728

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs.h
fs/bcachefs/xattr.c
fs/bcachefs/xattr.h

index 2e63cb6603bd7f1da9eee3eb1c368fb7770fdc5b..6170d214d6489720791edd25a3811c2274baa64b 100644 (file)
@@ -196,6 +196,8 @@ int bch2_vfs_init(void);
 
 #else
 
+#define bch2_inode_update_after_write(_trans, _inode, _inode_u, _fields)       do {} while (0)
+
 static inline void bch2_evict_subvolume_inodes(struct bch_fs *c,
                                               snapshot_id_list *s) {}
 static inline void bch2_vfs_exit(void) {}
index 43904c0ec9ba9dd46365c423279758bcaae42895..70f78006daf20b18536059a76a87e9a5b1d76f2d 100644 (file)
@@ -167,23 +167,22 @@ err1:
 }
 
 int bch2_xattr_set(struct btree_trans *trans, subvol_inum inum,
+                  struct bch_inode_unpacked *inode_u,
                   const struct bch_hash_info *hash_info,
                   const char *name, const void *value, size_t size,
                   int type, int flags)
 {
+       struct bch_fs *c = trans->c;
        struct btree_iter inode_iter = { NULL };
-       struct bch_inode_unpacked inode_u;
        int ret;
 
-       /*
-        * We need to do an inode update so that bi_journal_sync gets updated
-        * and fsync works:
-        *
-        * Perhaps we should be updating bi_mtime too?
-        */
+       ret = bch2_inode_peek(trans, &inode_iter, inode_u, inum, BTREE_ITER_INTENT);
+       if (ret)
+               return ret;
 
-       ret   = bch2_inode_peek(trans, &inode_iter, &inode_u, inum, BTREE_ITER_INTENT) ?:
-               bch2_inode_write(trans, &inode_iter, &inode_u);
+       inode_u->bi_ctime = bch2_current_time(c);
+
+       ret = bch2_inode_write(trans, &inode_iter, inode_u);
        bch2_trans_iter_exit(trans, &inode_iter);
 
        if (ret)
@@ -373,12 +372,20 @@ static int bch2_xattr_set_handler(const struct xattr_handler *handler,
        struct bch_inode_info *inode = to_bch_ei(vinode);
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
        struct bch_hash_info hash = bch2_hash_info_init(c, &inode->ei_inode);
+       struct bch_inode_unpacked inode_u;
+       struct btree_trans trans;
        int ret;
 
-       ret = bch2_trans_do(c, NULL, NULL, 0,
-                       bch2_xattr_set(&trans, inode_inum(inode), &hash,
-                                      name, value, size,
+       bch2_trans_init(&trans, c, 0, 0);
+
+       ret = commit_do(&trans, NULL, NULL, 0,
+                       bch2_xattr_set(&trans, inode_inum(inode), &inode_u,
+                                      &hash, name, value, size,
                                       handler->flags, flags));
+       if (!ret)
+               bch2_inode_update_after_write(&trans, inode, &inode_u, ATTR_CTIME);
+       bch2_trans_exit(&trans);
+
        return bch2_err_class(ret);
 }
 
index ad568c06e1f83cc33c77cf4e5fe79a1e0d8dfe5d..f5a52e3a6016e7e67db20d01f1c78c18f1b5a228 100644 (file)
@@ -40,7 +40,7 @@ struct bch_inode_info;
 
 /* Exported for cmd_migrate.c in tools: */
 int bch2_xattr_set(struct btree_trans *, subvol_inum,
-                  const struct bch_hash_info *,
+                  struct bch_inode_unpacked *, const struct bch_hash_info *,
                   const char *, const void *, size_t, int, int);
 
 ssize_t bch2_xattr_list(struct dentry *, char *, size_t);