mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
bcachefs: bch2_xattr_set() now updates ctime
Fixes fstests generic/728 Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
ca630f1d37
commit
07f293c863
@ -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) {}
|
||||
|
@ -167,23 +167,22 @@ static int bch2_xattr_get_trans(struct btree_trans *trans, struct bch_inode_info
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user