erofs-utils: lib: use atomic operations for `vi->flags`
authorGao Xiang <hsiangkao@linux.alibaba.com>
Sat, 5 Apr 2025 13:39:37 +0000 (21:39 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Sat, 5 Apr 2025 16:25:21 +0000 (00:25 +0800)
Since `vi->flags` can be accessed by multiple threads.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250405133937.2665477-2-hsiangkao@linux.alibaba.com
include/erofs/atomic.h
include/erofs/internal.h
lib/xattr.c
lib/zmap.c

index f28687eeb1f8f658cba6dc4404563be4e15aae0d..142590bd6c79f384b58182184039612043e9dec7 100644 (file)
@@ -22,6 +22,11 @@ __n;})
        __atomic_store(ptr, &__n, __ATOMIC_RELAXED); \
 } while(0)
 
+#define erofs_atomic_set_bit(bit, ptr) do { \
+       typeof(*ptr) __n = (1 << bit);    \
+       __atomic_or_fetch(ptr, __n, __ATOMIC_ACQ_REL); \
+} while(0)
+
 #define erofs_atomic_test_and_set(ptr) \
        __atomic_test_and_set(ptr, __ATOMIC_RELAXED)
 
index 2f715572b6e77d008c0193d6ca98666a9928343e..90bee078bc6ef105b9f76646ea76f73e33398536 100644 (file)
@@ -176,8 +176,11 @@ EROFS_FEATURE_FUNCS(xattr_prefixes, incompat, INCOMPAT_XATTR_PREFIXES)
 EROFS_FEATURE_FUNCS(sb_chksum, compat, COMPAT_SB_CHKSUM)
 EROFS_FEATURE_FUNCS(xattr_filter, compat, COMPAT_XATTR_FILTER)
 
-#define EROFS_I_EA_INITED      (1 << 0)
-#define EROFS_I_Z_INITED       (1 << 1)
+#define EROFS_I_EA_INITED_BIT  0
+#define EROFS_I_Z_INITED_BIT   1
+
+#define EROFS_I_EA_INITED      (1 << EROFS_I_EA_INITED_BIT)
+#define EROFS_I_Z_INITED       (1 << EROFS_I_Z_INITED_BIT)
 
 struct erofs_diskbuf;
 
@@ -191,7 +194,7 @@ struct erofs_inode {
 
        union {
                /* (erofsfuse) runtime flags */
-               unsigned int flags;
+               erofs_atomic_t flags;
 
                /* (mkfs.erofs) next pointer for directory dumping */
                struct erofs_inode *next_dirwrite;
index 2f6ebab916020980bf14f234f7c1d7593d4b7a23..5b4c98d87098932735e690fe08bd60ca01909a75 100644 (file)
@@ -1056,7 +1056,7 @@ static int init_inode_xattrs(struct erofs_inode *vi)
        int ret = 0;
 
        /* the most case is that xattrs of this inode are initialized. */
-       if (vi->flags & EROFS_I_EA_INITED)
+       if (erofs_atomic_read(&vi->flags) & EROFS_I_EA_INITED)
                return ret;
 
        /*
@@ -1117,9 +1117,7 @@ static int init_inode_xattrs(struct erofs_inode *vi)
                        le32_to_cpu(*(__le32 *)(it.kaddr + it.ofs));
                it.ofs += sizeof(__le32);
        }
-
-       vi->flags |= EROFS_I_EA_INITED;
-
+       erofs_atomic_set_bit(EROFS_I_EA_INITED_BIT, &vi->flags);
        return ret;
 }
 
index 70ff8980b11df672f3baf54220700fc4bdd7b977..2a9baba391719ba577e19e862ef5b276de2aa93c 100644 (file)
@@ -557,7 +557,7 @@ static int z_erofs_fill_inode_lazy(struct erofs_inode *vi)
        struct erofs_sb_info *sbi = vi->sbi;
        int err, headnr;
 
-       if (vi->flags & EROFS_I_Z_INITED)
+       if (erofs_atomic_read(&vi->flags) & EROFS_I_Z_INITED)
                return 0;
 
        pos = round_up(erofs_iloc(vi) + vi->inode_isize + vi->xattr_isize, 8);
@@ -624,7 +624,7 @@ static int z_erofs_fill_inode_lazy(struct erofs_inode *vi)
                        return err;
        }
 out:
-       vi->flags |= EROFS_I_Z_INITED;
+       erofs_atomic_set_bit(EROFS_I_Z_INITED_BIT, &vi->flags);
        return 0;
 }