[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[dm-devel] [PATCH] RFC: Changing dm core (2/5) : Put_table in safer place
- From: "Jun'ichi Nomura" <j-nomura ce jp nec com>
- To: device-mapper development <dm-devel redhat com>
- Subject: [dm-devel] [PATCH] RFC: Changing dm core (2/5) : Put_table in safer place
- Date: Thu, 16 Mar 2006 19:23:38 -0500
Move dm_table_put() outside of dm_sem.
Thanks,
--
Jun'ichi Nomura, NEC Solutions (America), Inc.
Move dm_table_put() outside of dm_sem.
Signed-off-by: Jun'ichi Nomura <j-nomura ce jp nec com>
dm-ioctl.c | 15 +++++++++++----
1 files changed, 11 insertions(+), 4 deletions(-)
--- linux-2.6.16-rc6-mm1-dm.01-dm-sem/drivers/md/dm-ioctl.c 2006-03-13 17:35:40.000000000 -0500
+++ linux-2.6.16-rc6-mm1-dm.02-put-table-after-unlock/drivers/md/dm-ioctl.c 2006-03-15 10:15:11.000000000 -0500
@@ -984,7 +984,7 @@ static int table_load(struct dm_ioctl *p
{
int r;
struct hash_cell *hc;
- struct dm_table *t;
+ struct dm_table *t, *oldmap = NULL;
struct mapped_device *md;
md = find_device(param);
@@ -1005,14 +1005,14 @@ static int table_load(struct dm_ioctl *p
hc = dm_get_mdptr(md);
if (!hc || hc->md != md) {
DMWARN("device has been removed from the dev hash table.");
- dm_table_put(t);
+ oldmap = t;
up_write(&dm_sem);
r = -ENXIO;
goto out;
}
if (hc->new_map)
- dm_table_put(hc->new_map);
+ oldmap = hc->new_map;
hc->new_map = t;
up_write(&dm_sem);
@@ -1020,6 +1020,8 @@ static int table_load(struct dm_ioctl *p
r = __dev_status(md, param);
out:
+ if (oldmap)
+ dm_table_put(oldmap);
dm_put(md);
return r;
@@ -1029,6 +1031,7 @@ static int table_clear(struct dm_ioctl *
{
int r;
struct hash_cell *hc;
+ struct dm_table *oldmap = NULL;
down_write(&dm_sem);
@@ -1040,7 +1043,7 @@ static int table_clear(struct dm_ioctl *
}
if (hc->new_map) {
- dm_table_put(hc->new_map);
+ oldmap = hc->new_map;
hc->new_map = NULL;
}
@@ -1048,6 +1051,10 @@ static int table_clear(struct dm_ioctl *
r = __dev_status(hc->md, param);
up_write(&dm_sem);
+
+ if (oldmap)
+ dm_table_put(oldmap);
+
return r;
}
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]