-
Lai Siyao authored
Deadlock may happen in in following senario: a lookup process called ll_update_lsm_md(), it found lli->lli_lsm_md is NULL, then down_write(&lli->lli_lsm_sem). but another lookup process initialized lli->lli_lsm_md after this check and before write lock, so the first lookup process called up_read(&lli->lli_lsm_sem) and return, so the write lock is never released, which cause subsequent lookups deadlock. Rearrange the code to simplify the locking: 1. take read lock. 2. if lsm was initialized and unchanged, release read lock and return. 3. otherwise release read lock and take write lock. 4. free current lsm and initialize with new lsm. 5. release write lock. 6. initialize stripes with read lock. Signed-off-by:
Lai Siyao <lai.siyao@whamcloud.com> Change-Id: Ifcc25a957983512db6f29105b5ca5b6ec914cb4b Reviewed-on: https://review.whamcloud.com/37182 Tested-by:
jenkins <devops@whamcloud.com> Reviewed-by:
Andreas Dilger <adilger@whamcloud.com> Tested-by:
Maloo <maloo@whamcloud.com> Reviewed-by:
Hongchao Zhang <hongchao@whamcloud.com> Reviewed-by:
Oleg Drokin <green@whamcloud.com>
37465502