bcachefs: Add flags to indicate if inode opts were inherited or explicitly set
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 13 Dec 2018 13:32:11 +0000 (08:32 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:13 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/fs-ioctl.c
fs/bcachefs/inode.h

index 19d05a1a0224487bbbdd5e0a5d20906bfec4acdc..f6cf4ccedcb1080c82296ccecc38e7d3697d8b15 100644 (file)
@@ -714,7 +714,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()                       \
@@ -728,6 +729,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
index 701882ce602450e8c2643df0f89be893193ddb56..d6563370bec4974c92e00c32d369f792aca51951 100644 (file)
@@ -122,7 +122,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);
 }
index 74fa6ff84111bb6243547f8083853fe832452a83..7bf95f889d35ce78f5716fe58ccac592e40e8511 100644 (file)
@@ -80,6 +80,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