On Tue, May 19, 2020 at 11:45:26PM +0200, Ahmed S. Darwish wrote: > For optimized block readers not holding a mutex, the "number of sectors" > 64-bit value is protected from tearing on 32-bit architectures by a > sequence counter. > > Disable preemption before entering that sequence counter's write side > critical section. Otherwise, the read side can preempt the write side > section and spin for the entire scheduler tick. If the reader belongs to > a real-time scheduling class, it can spin forever and the kernel will > livelock. > > Fixes: c83f6bf98dc1 ("block: add partition resize function to blkpg ioctl") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Ahmed S. Darwish <a.darwish@xxxxxxxxxxxxx> > Reviewed-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > --- > block/blk.h | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/block/blk.h b/block/blk.h > index 0a94ec68af32..151f86932547 100644 > --- a/block/blk.h > +++ b/block/blk.h > @@ -470,9 +470,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) > static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) > { > #if BITS_PER_LONG==32 && defined(CONFIG_SMP) > + preempt_disable(); > write_seqcount_begin(&part->nr_sects_seq); > part->nr_sects = size; > write_seqcount_end(&part->nr_sects_seq); > + preempt_enable(); > #elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION) > preempt_disable(); > part->nr_sects = size; This does look like something that include/linux/u64_stats_sync.h could help with.