Messages in this thread Patch in this message | | | Date | Wed, 25 Nov 2015 12:37:00 +0100 | From | Matias Bjørling <> | Subject | Re: [PATCH] lightnvm: missing nvm_lock acquire |
| |
On 11/25/2015 09:57 AM, Wenwei Tao wrote: > 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. > I've made the patch like this, ok?
To avoid race conditions, traverse dev, media manager, and target lists and also register, unregister entries to/from them, should be always under the nvm_lock control.
Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com> Signed-off-by: Matias Bjørling <m@bjorling.me> --- drivers/lightnvm/core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index ea6dba5..9f901f6 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c @@ -127,9 +127,11 @@ static struct nvm_dev *nvm_find_nvm_dev(const char *name) { struct nvm_dev *dev;
+ down_write(&nvm_lock); list_for_each_entry(dev, &nvm_devices, devices) if (!strcmp(name, dev->name)) return dev; + up_write(&nvm_lock);
return NULL; } @@ -388,13 +390,14 @@ static int nvm_create_target(struct nvm_dev *dev, } }
+ down_write(&nvm_lock); tt = nvm_find_target_type(create->tgttype); if (!tt) { pr_err("nvm: target type %s not found\n", create->tgttype); + up_write(&nvm_lock); return -EINVAL; }
- down_write(&nvm_lock); list_for_each_entry(t, &dev->online_targets, list) { if (!strcmp(create->tgtname, t->disk->disk_name)) { pr_err("nvm: target name already exists.\n"); -- 2.1.4
| |