[dm-devel] [PATCH 03/08] dm: fix idr_pre_get lock ordering
Jeff Mahoney
jeffm at suse.com
Mon Apr 17 15:16:02 UTC 2006
idr_pre_get() can sleep while allocating memory for the worst-case scenario.
This isn't a huge deal with the current code, but the next patch will
switch _minor_lock to a spinlock.
Signed-off-by: Jeff Mahoney <jeffm at suse.com>
--
drivers/md/dm.c | 20 ++++++++------------
1 files changed, 8 insertions(+), 12 deletions(-)
diff -ruNpX ../dontdiff 2.6.17-rc1-staging1/drivers/md/dm.c 2.6.17-rc1-staging2/drivers/md/dm.c
--- 2.6.17-rc1-staging1/drivers/md/dm.c 2006-04-17 10:51:44.000000000 -0400
+++ 2.6.17-rc1-staging2/drivers/md/dm.c 2006-04-17 10:51:44.000000000 -0400
@@ -766,6 +766,10 @@ static int specific_minor(struct mapped_
if (minor >= (1 << MINORBITS))
return -EINVAL;
+ r = idr_pre_get(&_minor_idr, GFP_KERNEL);
+ if (!r)
+ return -ENOMEM;
+
mutex_lock(&_minor_lock);
if (idr_find(&_minor_idr, minor)) {
@@ -773,12 +777,6 @@ static int specific_minor(struct mapped_
goto out;
}
- r = idr_pre_get(&_minor_idr, GFP_KERNEL);
- if (!r) {
- r = -ENOMEM;
- goto out;
- }
-
r = idr_get_new_above(&_minor_idr, MINOR_ALLOCED, minor, &m);
if (r) {
goto out;
@@ -800,13 +798,11 @@ static int next_free_minor(struct mapped
int r;
unsigned int m;
- mutex_lock(&_minor_lock);
-
r = idr_pre_get(&_minor_idr, GFP_KERNEL);
- if (!r) {
- r = -ENOMEM;
- goto out;
- }
+ if (!r)
+ return -ENOMEM;
+
+ mutex_lock(&_minor_lock);
r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m);
if (r) {
More information about the dm-devel
mailing list