]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
aoe: do not call bdi_init after blk_alloc_queue
authorEd Cashin <ecashin@coraid.com>
Sat, 12 Jan 2013 11:43:35 +0000 (06:43 -0500)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 16 Jan 2013 01:13:29 +0000 (01:13 +0000)
commit 0a41409c518083133e79015092585d68915865be upstream.

blk_alloc_queue has already done a bdi_init, so do not bdi_init
again in aoeblk_gdalloc.  The extra call causes list corruption
in the per-CPU backing dev info stats lists.

Affected users see console WARNINGs about list_del corruption on
percpu_counter_destroy when doing "rmmod aoe" or "aoeflush -a"
when AoE targets have been detected and initialized by the
system.

The patch below applies to v3.6.11, with its v47 aoe driver.  It
is expected to apply to all currently maintained stable kernels
except 3.7.y.  A related but different fix has been posted for
3.7.y.

References:

  RedHat bugzilla ticket with original report
  https://bugzilla.redhat.com/show_bug.cgi?id=853064

  LKML discussion of bug and fix
  http://thread.gmane.org/gmane.linux.kernel/1416336/focus=1416497

Reported-by: Josh Boyer <jwboyer@redhat.com>
Signed-off-by: Ed Cashin <ecashin@coraid.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/block/aoe/aoe.h
drivers/block/aoe/aoeblk.c

index db195abad69889e4d499bde162ff5e818601f3b2..e49ddd0aea128f0261332c9dad32cbd6781aa0ed 100644 (file)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2007 Coraid, Inc.  See COPYING for GPL terms. */
-#define VERSION "47"
+#define VERSION "47q"
 #define AOE_MAJOR 152
 #define DEVICE_NAME "aoe"
 
index 321de7b6c44228e5b7c5cfc0a410be19a54759fe..7eca46349c4cd6ece8cc0631732bc20bf0512ebf 100644 (file)
@@ -276,8 +276,6 @@ aoeblk_gdalloc(void *vp)
                goto err_mempool;
        blk_queue_make_request(d->blkq, aoeblk_make_request);
        d->blkq->backing_dev_info.name = "aoe";
-       if (bdi_init(&d->blkq->backing_dev_info))
-               goto err_blkq;
        spin_lock_irqsave(&d->lock, flags);
        gd->major = AOE_MAJOR;
        gd->first_minor = d->sysminor * AOE_PARTITIONS;
@@ -298,9 +296,6 @@ aoeblk_gdalloc(void *vp)
        aoedisk_add_sysfs(d);
        return;
 
-err_blkq:
-       blk_cleanup_queue(d->blkq);
-       d->blkq = NULL;
 err_mempool:
        mempool_destroy(d->bufpool);
 err_disk: