|
@@ -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
|