summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-12-13 08:32:11 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-12-27 11:38:37 -0500
commitee2b42fc1017db3fe0898c70429fc84569dce4e8 (patch)
treea2b84487f00156767adbbf1ab60b891430ce0334
parent7e46481c63bfb56a0a0ab43075555f9c2bb3fdcf (diff)
bcachefs: Add flags to indicate if inode opts were inherited or explicitly set
-rw-r--r--fs/bcachefs/bcachefs_format.h11
-rw-r--r--fs/bcachefs/fs-ioctl.c9
-rw-r--r--fs/bcachefs/inode.h4
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 484787a6add3..dc900e7b81da 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 e4ac4b67223a..876083b0b930 100644
--- a/fs/bcachefs/inode.h
+++ b/fs/bcachefs/inode.h
@@ -94,6 +94,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