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@xxxxxxxx> -- 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) { -- dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel