On Wed, 2017-12-13 at 16:33 -0500, Jeff Moyer wrote: > Hi, > > When a sector mode namespace is initially created, the arena's > err_lock > is not initialized. If, on the other hand, the namespace already > exists, the mutex is initialized. To fix the issue, I moved the > mutex > initialization into the arena_alloc, which is called by both > discover_arenas and create_arenas. > > This was discovered on an older kernel where mutex_trylock checks the > count to determine whether the lock is held. Because the data > structure > is kzalloc-d, that count was 0 (held), and I/O to the device would > hang > forever waiting for the lock to be released (see btt_write_pg, for > example). Current kernels have a different mutex implementation that > checks for a non-null owner, and so this doesn't show up as a > problem. > If that lock were ever contended, it might cause issues, but you'd > have > to be really unlucky, I think. > > Signed-off-by: Jeff Moyer <[email protected]>
Ah, good find - the fix looks good to me. Reviewed-by: Vishal Verma <[email protected]> > > diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c > index e949e33..5860f99 100644 > --- a/drivers/nvdimm/btt.c > +++ b/drivers/nvdimm/btt.c > @@ -630,6 +630,7 @@ static struct arena_info *alloc_arena(struct btt > *btt, size_t size, > return NULL; > arena->nd_btt = btt->nd_btt; > arena->sector_size = btt->sector_size; > + mutex_init(&arena->err_lock); > > if (!size) > return arena; > @@ -758,7 +759,6 @@ static int discover_arenas(struct btt *btt) > arena->external_lba_start = cur_nlba; > parse_arena_meta(arena, super, cur_off); > > - mutex_init(&arena->err_lock); > ret = btt_freelist_init(arena); > if (ret) > goto out; _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
