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>2019-04-03 12:43:29 -0400
commit026bb83a2e3a5ea9da799c5af597c87398e9e85e (patch)
tree419c618c1a206735afd3188334b872b2f2a59c8a
parentafad3a30f62f368512b0610cae3ccf55f1f83e1d (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 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