opt field in structure f2fs_mount_info and opt_mask field in structure
f2fs_fs_context is 32-bits variable, now we're running out of available
bits in them, let's expand them to 64-bits for better scalability.

Signed-off-by: Chao Yu <[email protected]>
---
 fs/f2fs/f2fs.h  | 85 ++++++++++++++++++++++++++-----------------------
 fs/f2fs/super.c | 36 ++++++++++-----------
 2 files changed, 63 insertions(+), 58 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index dffe8958b580..5f104518c414 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -96,47 +96,52 @@ extern const char *f2fs_fault_name[FAULT_MAX];
 /*
  * For mount options
  */
-#define F2FS_MOUNT_DISABLE_ROLL_FORWARD        0x00000001
-#define F2FS_MOUNT_DISCARD             0x00000002
-#define F2FS_MOUNT_NOHEAP              0x00000004
-#define F2FS_MOUNT_XATTR_USER          0x00000008
-#define F2FS_MOUNT_POSIX_ACL           0x00000010
-#define F2FS_MOUNT_DISABLE_EXT_IDENTIFY        0x00000020
-#define F2FS_MOUNT_INLINE_XATTR                0x00000040
-#define F2FS_MOUNT_INLINE_DATA         0x00000080
-#define F2FS_MOUNT_INLINE_DENTRY       0x00000100
-#define F2FS_MOUNT_FLUSH_MERGE         0x00000200
-#define F2FS_MOUNT_NOBARRIER           0x00000400
-#define F2FS_MOUNT_FASTBOOT            0x00000800
-#define F2FS_MOUNT_READ_EXTENT_CACHE   0x00001000
-#define F2FS_MOUNT_DATA_FLUSH          0x00002000
-#define F2FS_MOUNT_FAULT_INJECTION     0x00004000
-#define F2FS_MOUNT_USRQUOTA            0x00008000
-#define F2FS_MOUNT_GRPQUOTA            0x00010000
-#define F2FS_MOUNT_PRJQUOTA            0x00020000
-#define F2FS_MOUNT_QUOTA               0x00040000
-#define F2FS_MOUNT_INLINE_XATTR_SIZE   0x00080000
-#define F2FS_MOUNT_RESERVE_ROOT                0x00100000
-#define F2FS_MOUNT_DISABLE_CHECKPOINT  0x00200000
-#define F2FS_MOUNT_NORECOVERY          0x00400000
-#define F2FS_MOUNT_ATGC                        0x00800000
-#define F2FS_MOUNT_MERGE_CHECKPOINT    0x01000000
-#define        F2FS_MOUNT_GC_MERGE             0x02000000
-#define F2FS_MOUNT_COMPRESS_CACHE      0x04000000
-#define F2FS_MOUNT_AGE_EXTENT_CACHE    0x08000000
-#define F2FS_MOUNT_NAT_BITS            0x10000000
-#define F2FS_MOUNT_INLINECRYPT         0x20000000
-/*
- * Some f2fs environments expect to be able to pass the "lazytime" option
- * string rather than using the MS_LAZYTIME flag, so this must remain.
- */
-#define F2FS_MOUNT_LAZYTIME            0x40000000
-#define F2FS_MOUNT_RESERVE_NODE                0x80000000
+enum f2fs_mount_opt {
+       F2FS_MOUNT_DISABLE_ROLL_FORWARD,
+       F2FS_MOUNT_DISCARD,
+       F2FS_MOUNT_NOHEAP,
+       F2FS_MOUNT_XATTR_USER,
+       F2FS_MOUNT_POSIX_ACL,
+       F2FS_MOUNT_DISABLE_EXT_IDENTIFY,
+       F2FS_MOUNT_INLINE_XATTR,
+       F2FS_MOUNT_INLINE_DATA,
+       F2FS_MOUNT_INLINE_DENTRY,
+       F2FS_MOUNT_FLUSH_MERGE,
+       F2FS_MOUNT_NOBARRIER,
+       F2FS_MOUNT_FASTBOOT,
+       F2FS_MOUNT_READ_EXTENT_CACHE,
+       F2FS_MOUNT_DATA_FLUSH,
+       F2FS_MOUNT_FAULT_INJECTION,
+       F2FS_MOUNT_USRQUOTA,
+       F2FS_MOUNT_GRPQUOTA,
+       F2FS_MOUNT_PRJQUOTA,
+       F2FS_MOUNT_QUOTA,
+       F2FS_MOUNT_INLINE_XATTR_SIZE,
+       F2FS_MOUNT_RESERVE_ROOT,
+       F2FS_MOUNT_DISABLE_CHECKPOINT,
+       F2FS_MOUNT_NORECOVERY,
+       F2FS_MOUNT_ATGC,
+       F2FS_MOUNT_MERGE_CHECKPOINT,
+       F2FS_MOUNT_GC_MERGE,
+       F2FS_MOUNT_COMPRESS_CACHE,
+       F2FS_MOUNT_AGE_EXTENT_CACHE,
+       F2FS_MOUNT_NAT_BITS,
+       F2FS_MOUNT_INLINECRYPT,
+       /*
+        * Some f2fs environments expect to be able to pass the "lazytime" 
option
+        * string rather than using the MS_LAZYTIME flag, so this must remain.
+        */
+       F2FS_MOUNT_LAZYTIME,
+       F2FS_MOUNT_RESERVE_NODE,
+};
 
 #define F2FS_OPTION(sbi)       ((sbi)->mount_opt)
-#define clear_opt(sbi, option) (F2FS_OPTION(sbi).opt &= ~F2FS_MOUNT_##option)
-#define set_opt(sbi, option)   (F2FS_OPTION(sbi).opt |= F2FS_MOUNT_##option)
-#define test_opt(sbi, option)  (F2FS_OPTION(sbi).opt & F2FS_MOUNT_##option)
+#define clear_opt(sbi, option)         \
+       (F2FS_OPTION(sbi).opt &= ~BIT(F2FS_MOUNT_##option))
+#define set_opt(sbi, option)           \
+       (F2FS_OPTION(sbi).opt |= BIT(F2FS_MOUNT_##option))
+#define test_opt(sbi, option)          \
+       (F2FS_OPTION(sbi).opt & BIT(F2FS_MOUNT_##option))
 
 #define ver_after(a, b)        (typecheck(unsigned long long, a) &&            
\
                typecheck(unsigned long long, b) &&                     \
@@ -183,7 +188,7 @@ struct f2fs_rwsem {
 };
 
 struct f2fs_mount_info {
-       unsigned int opt;
+       unsigned long long opt;
        block_t root_reserved_blocks;   /* root reserved blocks */
        block_t root_reserved_nodes;    /* root reserved nodes */
        kuid_t s_resuid;                /* reserved blocks for uid */
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index d47ec718f3be..ccb477086444 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -352,7 +352,7 @@ static match_table_t f2fs_checkpoint_tokens = {
 
 struct f2fs_fs_context {
        struct f2fs_mount_info info;
-       unsigned int    opt_mask;       /* Bits changed */
+       unsigned long long opt_mask;    /* Bits changed */
        unsigned int    spec_mask;
        unsigned short  qname_mask;
 };
@@ -360,23 +360,23 @@ struct f2fs_fs_context {
 #define F2FS_CTX_INFO(ctx)     ((ctx)->info)
 
 static inline void ctx_set_opt(struct f2fs_fs_context *ctx,
-                              unsigned int flag)
+                              enum f2fs_mount_opt flag)
 {
-       ctx->info.opt |= flag;
-       ctx->opt_mask |= flag;
+       ctx->info.opt |= BIT(flag);
+       ctx->opt_mask |= BIT(flag);
 }
 
 static inline void ctx_clear_opt(struct f2fs_fs_context *ctx,
-                                unsigned int flag)
+                                enum f2fs_mount_opt flag)
 {
-       ctx->info.opt &= ~flag;
-       ctx->opt_mask |= flag;
+       ctx->info.opt &= ~BIT(flag);
+       ctx->opt_mask |= BIT(flag);
 }
 
 static inline bool ctx_test_opt(struct f2fs_fs_context *ctx,
-                               unsigned int flag)
+                               enum f2fs_mount_opt flag)
 {
-       return ctx->info.opt & flag;
+       return ctx->info.opt & BIT(flag);
 }
 
 void f2fs_printk(struct f2fs_sb_info *sbi, bool limit_rate,
@@ -1371,7 +1371,7 @@ static int f2fs_check_compression(struct fs_context *fc,
                        ctx_test_opt(ctx, F2FS_MOUNT_COMPRESS_CACHE))
                        f2fs_info(sbi, "Image doesn't support compression");
                clear_compression_spec(ctx);
-               ctx->opt_mask &= ~F2FS_MOUNT_COMPRESS_CACHE;
+               ctx->opt_mask &= ~BIT(F2FS_MOUNT_COMPRESS_CACHE);
                return 0;
        }
        if (ctx->spec_mask & F2FS_SPEC_compress_extension) {
@@ -1439,42 +1439,42 @@ static int f2fs_check_opt_consistency(struct fs_context 
*fc,
                return -EINVAL;
 
        if (f2fs_hw_should_discard(sbi) &&
-                       (ctx->opt_mask & F2FS_MOUNT_DISCARD) &&
+                       (ctx->opt_mask & BIT(F2FS_MOUNT_DISCARD)) &&
                        !ctx_test_opt(ctx, F2FS_MOUNT_DISCARD)) {
                f2fs_warn(sbi, "discard is required for zoned block devices");
                return -EINVAL;
        }
 
        if (!f2fs_hw_support_discard(sbi) &&
-                       (ctx->opt_mask & F2FS_MOUNT_DISCARD) &&
+                       (ctx->opt_mask & BIT(F2FS_MOUNT_DISCARD)) &&
                        ctx_test_opt(ctx, F2FS_MOUNT_DISCARD)) {
                f2fs_warn(sbi, "device does not support discard");
                ctx_clear_opt(ctx, F2FS_MOUNT_DISCARD);
-               ctx->opt_mask &= ~F2FS_MOUNT_DISCARD;
+               ctx->opt_mask &= ~BIT(F2FS_MOUNT_DISCARD);
        }
 
        if (f2fs_sb_has_device_alias(sbi) &&
-                       (ctx->opt_mask & F2FS_MOUNT_READ_EXTENT_CACHE) &&
+                       (ctx->opt_mask & BIT(F2FS_MOUNT_READ_EXTENT_CACHE)) &&
                        !ctx_test_opt(ctx, F2FS_MOUNT_READ_EXTENT_CACHE)) {
                f2fs_err(sbi, "device aliasing requires extent cache");
                return -EINVAL;
        }
 
        if (test_opt(sbi, RESERVE_ROOT) &&
-                       (ctx->opt_mask & F2FS_MOUNT_RESERVE_ROOT) &&
+                       (ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_ROOT)) &&
                        ctx_test_opt(ctx, F2FS_MOUNT_RESERVE_ROOT)) {
                f2fs_info(sbi, "Preserve previous reserve_root=%u",
                        F2FS_OPTION(sbi).root_reserved_blocks);
                ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_ROOT);
-               ctx->opt_mask &= ~F2FS_MOUNT_RESERVE_ROOT;
+               ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_ROOT);
        }
        if (test_opt(sbi, RESERVE_NODE) &&
-                       (ctx->opt_mask & F2FS_MOUNT_RESERVE_NODE) &&
+                       (ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_NODE)) &&
                        ctx_test_opt(ctx, F2FS_MOUNT_RESERVE_NODE)) {
                f2fs_info(sbi, "Preserve previous reserve_node=%u",
                        F2FS_OPTION(sbi).root_reserved_nodes);
                ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_NODE);
-               ctx->opt_mask &= ~F2FS_MOUNT_RESERVE_NODE;
+               ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_NODE);
        }
 
        err = f2fs_check_test_dummy_encryption(fc, sb);
-- 
2.49.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to