Skip to content

Commit 8be3a53

Browse files
committed
Merge tag 'erofs-for-5.8-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs
Pull erofs fix from Gao Xiang: "Fix a regression which uses potential uninitialized high 32-bit value unexpectedly recently observed with specific compiler options" * tag 'erofs-for-5.8-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs: erofs: fix partially uninitialized misuse in z_erofs_onlinepage_fixup
2 parents fc10807 + 3c59728 commit 8be3a53

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

fs/erofs/zdata.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,22 +144,22 @@ static inline void z_erofs_onlinepage_init(struct page *page)
144144
static inline void z_erofs_onlinepage_fixup(struct page *page,
145145
uintptr_t index, bool down)
146146
{
147-
unsigned long *p, o, v, id;
148-
repeat:
149-
p = &page_private(page);
150-
o = READ_ONCE(*p);
147+
union z_erofs_onlinepage_converter u = { .v = &page_private(page) };
148+
int orig, orig_index, val;
151149

152-
id = o >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT;
153-
if (id) {
150+
repeat:
151+
orig = atomic_read(u.o);
152+
orig_index = orig >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT;
153+
if (orig_index) {
154154
if (!index)
155155
return;
156156

157-
DBG_BUGON(id != index);
157+
DBG_BUGON(orig_index != index);
158158
}
159159

160-
v = (index << Z_EROFS_ONLINEPAGE_INDEX_SHIFT) |
161-
((o & Z_EROFS_ONLINEPAGE_COUNT_MASK) + (unsigned int)down);
162-
if (cmpxchg(p, o, v) != o)
160+
val = (index << Z_EROFS_ONLINEPAGE_INDEX_SHIFT) |
161+
((orig & Z_EROFS_ONLINEPAGE_COUNT_MASK) + (unsigned int)down);
162+
if (atomic_cmpxchg(u.o, orig, val) != orig)
163163
goto repeat;
164164
}
165165

0 commit comments

Comments
 (0)