diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-12-13 08:32:11 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-03 12:43:29 -0400 |
commit | 026bb83a2e3a5ea9da799c5af597c87398e9e85e (patch) | |
tree | 419c618c1a206735afd3188334b872b2f2a59c8a | |
parent | afad3a30f62f368512b0610cae3ccf55f1f83e1d (diff) |
bcachefs: Add flags to indicate if inode opts were inherited or explicitly set
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 11 | ||||
-rw-r--r-- | fs/bcachefs/fs-ioctl.c | 9 | ||||
-rw-r--r-- | fs/bcachefs/inode.h | 4 |
3 files changed, 22 insertions, 2 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index 552b7446d580..9245465da1fd 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -709,7 +709,8 @@ struct bch_inode_generation { x(bi_promote_target, 16) \ x(bi_foreground_target, 16) \ x(bi_background_target, 16) \ - x(bi_erasure_code, 16) + x(bi_erasure_code, 16) \ + x(bi_fields_set, 16) /* subset of BCH_INODE_FIELDS */ #define BCH_INODE_OPTS() \ @@ -723,6 +724,14 @@ struct bch_inode_generation { x(background_target, 16) \ x(erasure_code, 16) +enum inode_opt_id { +#define x(name, ...) \ + Inode_opt_##name, + BCH_INODE_OPTS() +#undef x + Inode_opt_nr, +}; + enum { /* * User flags (get/settable with FS_IOC_*FLAGS, correspond to FS_*_FL diff --git a/fs/bcachefs/fs-ioctl.c b/fs/bcachefs/fs-ioctl.c index 9b0115a8f5a6..1ff4628e2c51 100644 --- a/fs/bcachefs/fs-ioctl.c +++ b/fs/bcachefs/fs-ioctl.c @@ -121,7 +121,14 @@ static int fssetxattr_inode_update_fn(struct bch_inode_info *inode, { struct flags_set *s = p; - bi->bi_project = s->projid; + if (s->projid != bi->bi_project) { + if (s->projid) + bi->bi_fields_set |= 1U << Inode_opt_project; + else + bi->bi_fields_set &= ~(1U << Inode_opt_project); + + bi->bi_project = s->projid; + } return bch2_inode_flags_set(inode, bi, p); } diff --git a/fs/bcachefs/inode.h b/fs/bcachefs/inode.h index 92c78f6dd03c..848bdd262d2c 100644 --- a/fs/bcachefs/inode.h +++ b/fs/bcachefs/inode.h @@ -79,6 +79,10 @@ static inline void __bch2_inode_opt_set(struct bch_inode_unpacked *inode, #define x(_name, ...) \ case Opt_##_name: \ inode->bi_##_name = v; \ + if (v) \ + inode->bi_fields_set |= 1U << Inode_opt_##_name;\ + else \ + inode->bi_fields_set &= ~(1U << Inode_opt_##_name);\ break; BCH_INODE_OPTS() #undef x |