Hi Matias I think list_for_each_entry_safe(pos, n, head, member) cannot avoid race condition the item point by ‘n’ can be deleted and freed in the same time we operate on 'pos' so lock is still necessary. 2015-11-25 2:36 GMT+08:00 Matias <mb@xxxxxxxxxxx>: > On 11/24/2015 04:24 PM, Wenwei Tao wrote: >> >> To avoid race conditions, traverse dev, media manager, >> and targeet lists and also register, unregister entries >> to/from them, should be always under the nvm_lock control. >> >> Signed-off-by: Wenwei Tao <ww.tao0320@xxxxxxxxx> >> --- >> drivers/lightnvm/core.c | 19 +++++++++++++------ >> 1 file changed, 13 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c >> index f659e60..39aec3a 100644 >> --- a/drivers/lightnvm/core.c >> +++ b/drivers/lightnvm/core.c >> @@ -333,19 +333,19 @@ EXPORT_SYMBOL(nvm_register); >> >> void nvm_unregister(char *disk_name) >> { >> + down_write(&nvm_lock); >> struct nvm_dev *dev = nvm_find_nvm_dev(disk_name); > > > In nvm_find_nvm_dev, can we instead replace it with > list_for_each_entry_safe. Then we are sure that we won't hit a missing > element, and will make the other cases significantly cleaner. > >> >> if (!dev) { >> pr_err("nvm: could not find device %s to unregister\n", >> >> disk_name); >> + up_write(&nvm_lock); >> return; >> } >> >> - nvm_exit(dev); >> - >> - down_write(&nvm_lock); >> list_del(&dev->devices); >> up_write(&nvm_lock); >> + nvm_exit(dev); >> } >> EXPORT_SYMBOL(nvm_unregister); >> >> @@ -365,12 +365,15 @@ static int nvm_create_target(struct nvm_dev *dev, >> void *targetdata; >> int ret = 0; >> >> + down_write(&nvm_lock); >> if (!dev->mt) { >> /* register with device with a supported NVM manager */ >> list_for_each_entry(mt, &nvm_mgrs, list) { > > > Same with this one? -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html