On Thu, Sep 24, 2020 at 06:40:41AM +0100, Christoph Hellwig wrote: > On Wed, Sep 23, 2020 at 11:24:37AM -0700, Darrick J. Wong wrote: > > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > > > Actually take the rt lock before updating the bitmap from multiple > > threads. This fixes an infrequent corruption problem when running > > generic/013 and rtinherit=1 is set on the root dir. > > > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > --- > > repair/dinode.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/repair/dinode.c b/repair/dinode.c > > index 57013bf149b2..07f3f83aef8c 100644 > > --- a/repair/dinode.c > > +++ b/repair/dinode.c > > @@ -184,6 +184,7 @@ process_rt_rec( > > xfs_rfsblock_t *tot, > > int check_dups) > > { > > + struct aglock *lock = &ag_locks[(signed)NULLAGNUMBER]; > > Err, what is this weird cast doing here? Well.... ag_locks is allocated with length ag_locks[agcount + 1], and then the pointer is incremented so that ag_locks[-1] is the rt lock. NULLAGNUMBER is cast to xfs_agnumber_t, which is uint32_t, so we have to cast it back to signed so that we actually do the pointer subtraction(!) Yeah, I know, it's nuts... --D > The rest looks sane.