On Tue, Aug 9, 2022 at 11:32 AM Mikulas Patocka <mpatocka@xxxxxxxxxx> wrote: > > Let's have a look at this piece of code in __bread_slow: > get_bh(bh); > bh->b_end_io = end_buffer_read_sync; > submit_bh(REQ_OP_READ, 0, bh); > wait_on_buffer(bh); > if (buffer_uptodate(bh)) > return bh; > Neither wait_on_buffer nor buffer_uptodate contain any memory barrier. > Consequently, if someone calls sb_bread and then reads the buffer data, > the read of buffer data may be executed before wait_on_buffer(bh) on > architectures with weak memory ordering and it may return invalid data. > > Fix this bug by adding a memory barrier to set_buffer_uptodate and an > acquire barrier to buffer_uptodate (in a similar way as > folio_test_uptodate and folio_mark_uptodate). Ok, I've applied this to my tree. I still feel that we should probably take a long look at having the proper "acquire/release" uses everywhere for the buffer / page / folio flags, but that wouldn't really work for backporting to stable, so I think that's a "future fixes/cleanup" thing. Thanks, Linus