Alex Elder a0cab92432 rbd: avoid dropping extra reference in rbd_free_disk()
I found during some failure injection testing that the call to
rbd_free_disk() in the error path of rbd_dev_probe_finish() was
dropping an extra reference to the disk queue.  The problem
occurred when put_disk tried to drop a reference to the disk's
queue.  A call to blk_cleanup_queue() just prior to that will have
also dropped a reference to the queue.

The problem is that the reference dropped by put_disk() is assumed
to have been taken by add_disk().  Our code has error paths that can
occur after the disk and its queue are initialized, but before the
call to add_disk(), and in those paths we won't have that extra
reference.

The fix is easy though.  In rbd_free_disk() we're already checking
the disk's GENHD_FL_UP flag.  That flag is an indication that
add_disk() has been called, so just call blk_cleanup_queue()
conditional on that flag being set.

This resolves:
    http://tracker.ceph.com/issues/4800

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
2013-05-01 21:19:32 -07:00
..
2013-03-28 14:29:47 -04:00
2013-02-27 19:10:15 -08:00
2013-03-26 14:48:12 -06:00
2012-01-03 22:54:07 -05:00
2011-08-08 11:40:15 +02:00
2012-03-28 18:30:03 +01:00
2013-04-09 12:05:41 -07:00
2013-02-27 19:10:22 -08:00
2012-09-09 10:35:39 +02:00
2009-03-26 21:15:27 +01:00
2013-02-09 14:23:33 +01:00