forked from luck/tmp_suning_uos_patched
aoe: properly initialise the request_queue's backing_dev_info
AOE forgot to initialise its queue's backing_dev_info, so kernels crash. (http://bugzilla.kernel.org/show_bug.cgi?id=9482) Fix that and consoldate aoeblk_gdalloc()'s error handling. Thanks be to Jon for reporting and testing. Cc: "Ed L. Cashin" <ecashin@coraid.com> Cc: <stable@kernel.org> Cc: "Jon Nelson" <jnelson@jamponi.net> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5ea139503b
commit
43cbe2cbdd
@ -6,6 +6,7 @@
|
||||
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/genhd.h>
|
||||
@ -210,25 +211,20 @@ aoeblk_gdalloc(void *vp)
|
||||
if (gd == NULL) {
|
||||
printk(KERN_ERR "aoe: cannot allocate disk structure for %ld.%ld\n",
|
||||
d->aoemajor, d->aoeminor);
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
d->flags &= ~DEVFL_GDALLOC;
|
||||
spin_unlock_irqrestore(&d->lock, flags);
|
||||
return;
|
||||
goto err;
|
||||
}
|
||||
|
||||
d->bufpool = mempool_create_slab_pool(MIN_BUFS, buf_pool_cache);
|
||||
if (d->bufpool == NULL) {
|
||||
printk(KERN_ERR "aoe: cannot allocate bufpool for %ld.%ld\n",
|
||||
d->aoemajor, d->aoeminor);
|
||||
put_disk(gd);
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
d->flags &= ~DEVFL_GDALLOC;
|
||||
spin_unlock_irqrestore(&d->lock, flags);
|
||||
return;
|
||||
goto err_disk;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
blk_queue_make_request(&d->blkq, aoeblk_make_request);
|
||||
if (bdi_init(&d->blkq.backing_dev_info))
|
||||
goto err_mempool;
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
gd->major = AOE_MAJOR;
|
||||
gd->first_minor = d->sysminor * AOE_PARTITIONS;
|
||||
gd->fops = &aoe_bdops;
|
||||
@ -246,6 +242,16 @@ aoeblk_gdalloc(void *vp)
|
||||
|
||||
add_disk(gd);
|
||||
aoedisk_add_sysfs(d);
|
||||
return;
|
||||
|
||||
err_mempool:
|
||||
mempool_destroy(d->bufpool);
|
||||
err_disk:
|
||||
put_disk(gd);
|
||||
err:
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
d->flags &= ~DEVFL_GDALLOC;
|
||||
spin_unlock_irqrestore(&d->lock, flags);
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user