[dm-devel] [PATCH 6/6] dm ioctl: introduce find_device_noinit
Mike Snitzer
snitzer at redhat.com
Sun May 23 21:45:01 UTC 2010
Factor all appropriate consumers of __find_device_hash_cell() to use
find_device_noinit().
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
---
drivers/md/dm-ioctl.c | 51 +++++++++++++++++++++++++-------------------------
1 file changed, 26 insertions(+), 25 deletions(-)
Index: linux-2.6/drivers/md/dm-ioctl.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-ioctl.c
+++ linux-2.6/drivers/md/dm-ioctl.c
@@ -718,23 +718,40 @@ static struct mapped_device *find_device
return md;
}
+static struct mapped_device *find_device_noinit(struct dm_ioctl *param)
+{
+ struct hash_cell *hc;
+ struct mapped_device *md = NULL;
+
+ down_write(&_hash_lock);
+ hc = __find_device_hash_cell(param);
+ if (hc)
+ md = hc->md;
+ else
+ DMWARN("device doesn't appear to be in the dev hash table.");
+ up_write(&_hash_lock);
+
+ return md;
+}
+
static int dev_remove(struct dm_ioctl *param, size_t param_size)
{
struct hash_cell *hc;
struct mapped_device *md;
int r;
- down_write(&_hash_lock);
- hc = __find_device_hash_cell(param);
+ md = find_device_noinit(param);
+ if (!md)
+ return -ENXIO;
+ down_write(&_hash_lock);
+ hc = dm_get_verified_mdptr(md);
if (!hc) {
- DMWARN("device doesn't appear to be in the dev hash table.");
up_write(&_hash_lock);
+ dm_put(md);
return -ENXIO;
}
- md = hc->md;
-
/*
* Ensure the device is not open and nothing further can open it.
*/
@@ -872,17 +889,9 @@ static int do_resume(struct dm_ioctl *pa
struct mapped_device *md;
struct dm_table *new_map, *old_map = NULL;
- down_write(&_hash_lock);
-
- hc = __find_device_hash_cell(param);
- if (!hc) {
- DMWARN("device doesn't appear to be in the dev hash table.");
- up_write(&_hash_lock);
+ md = find_device_noinit(param);
+ if (!md)
return -ENXIO;
- }
-
- md = hc->md;
- up_write(&_hash_lock);
dm_lock_resume(md);
@@ -1271,17 +1280,9 @@ static int table_clear(struct dm_ioctl *
struct mapped_device *md;
struct dm_table *live_table;
- down_write(&_hash_lock);
-
- hc = __find_device_hash_cell(param);
- if (!hc) {
- DMWARN("device doesn't appear to be in the dev hash table.");
- up_write(&_hash_lock);
+ md = find_device_noinit(param);
+ if (!md)
return -ENXIO;
- }
-
- md = hc->md;
- up_write(&_hash_lock);
dm_lock_resume(md);
dm_lock_md_type(md); /* May need to clear md's type */
More information about the dm-devel
mailing list