diff options
| author | 2022-09-22 13:54:20 +0200 | |
|---|---|---|
| committer | 2022-09-22 13:54:20 +0200 | |
| commit | af45a0d32df9c8f5abbbc7401d70ffa296c8cef6 (patch) | |
| tree | f162ece8fa7d94374d15801d614849db649282ac /include/linux/buffer_head.h | |
| parent | ALSA: hda/ca0132 - remove the unneeded result variable (diff) | |
| parent | ALSA: hda: intel-dsp-config: add missing RaptorLake PCI IDs (diff) | |
| download | linux-dev-af45a0d32df9c8f5abbbc7401d70ffa296c8cef6.tar.xz linux-dev-af45a0d32df9c8f5abbbc7401d70ffa296c8cef6.zip | |
Merge branch 'for-linus' into for-next
Diffstat (limited to 'include/linux/buffer_head.h')
| -rw-r--r-- | include/linux/buffer_head.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index def8b8d30ccc..df518c429667 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -138,6 +138,17 @@ BUFFER_FNS(Defer_Completion, defer_completion) static __always_inline void set_buffer_uptodate(struct buffer_head *bh) { /* + * If somebody else already set this uptodate, they will + * have done the memory barrier, and a reader will thus + * see *some* valid buffer state. + * + * Any other serialization (with IO errors or whatever that + * might clear the bit) has to come from other state (eg BH_Lock). + */ + if (test_bit(BH_Uptodate, &bh->b_state)) + return; + + /* * make it consistent with folio_mark_uptodate * pairs with smp_load_acquire in buffer_uptodate */ @@ -156,7 +167,7 @@ static __always_inline int buffer_uptodate(const struct buffer_head *bh) * make it consistent with folio_test_uptodate * pairs with smp_mb__before_atomic in set_buffer_uptodate */ - return (smp_load_acquire(&bh->b_state) & (1UL << BH_Uptodate)) != 0; + return test_bit_acquire(BH_Uptodate, &bh->b_state); } #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) |
