linux/drivers/block
Alex Elder c30748a365 rbd: drop an unsafe assertion
commit 638c323c4d upstream.

Olivier Bonvalet reported having repeated crashes due to a failed
assertion he was hitting in rbd_img_obj_callback():

    Assertion failure in rbd_img_obj_callback() at line 2165:
	rbd_assert(which >= img_request->next_completion);

With a lot of help from Olivier with reproducing the problem
we were able to determine the object and image requests had
already been completed (and often freed) at the point the
assertion failed.

There was a great deal of discussion on the ceph-devel mailing list
about this.  The problem only arose when there were two (or more)
object requests in an image request, and the problem was always
seen when the second request was being completed.

The problem is due to a race in the window between setting the
"done" flag on an object request and checking the image request's
next completion value.  When the first object request completes, it
checks to see if its successor request is marked "done", and if
so, that request is also completed.  In the process, the image
request's next_completion value is updated to reflect that both
the first and second requests are completed.  By the time the
second request is able to check the next_completion value, it
has been set to a value *greater* than its own "which" value,
which caused an assertion to fail.

Fix this problem by skipping over any completion processing
unless the completing object request is the next one expected.
Test only for inequality (not >=), and eliminate the bad
assertion.

Tested-by: Olivier Bonvalet <ob@daevel.fr>
Signed-off-by: Alex Elder <elder@linaro.org>
Reviewed-by: Sage Weil <sage@inktank.com>
Reviewed-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-02-26 17:48:49 -08:00
..
aoe mm: close PageTail race 2014-04-03 12:01:05 -07:00
drbd drbd: merge_bvec_fn: properly remap bvm->bi_bdev 2015-01-29 17:40:57 -08:00
mtip32xx mtip32xx: Remove dfs_parent after pci unregister 2014-07-06 18:54:13 -07:00
paride block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
rsxx rsxx: remove unused variable 2013-03-26 14:48:12 -06:00
xen-blkback xen/blkback: fix reference counting 2013-12-04 10:56:25 -08:00
amiflop.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
ataflop.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
brd.c block: fix a probe argument to blk_register_region 2013-11-29 11:11:50 -08:00
cciss_cmd.h cciss: use new doorbell-bit-5 reset method 2011-05-06 08:23:55 -06:00
cciss_scsi.c cciss: switch to ->show_info() 2013-04-09 14:13:19 -04:00
cciss_scsi.h cciss: add cciss_tape_cmds module paramter 2011-05-06 08:23:59 -06:00
cciss.c cciss: fix info leak in cciss_ioctl32_passthru() 2013-10-13 16:08:28 -07:00
cciss.h cciss: Adds simple mode functionality 2011-08-08 11:40:15 +02:00
cpqarray.c cpqarray: fix info leak in ida_locked_ioctl() 2013-10-13 16:08:28 -07:00
cpqarray.h
cryptoloop.c drivers: Remove unnecessary inclusions of asm/semaphore.h 2008-04-18 22:16:32 -04:00
DAC960.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
DAC960.h Fix DAC960 driver on machines which don't support 64-bit DMA 2007-09-11 17:21:19 -07:00
floppy.c floppy: don't write kernel-only members to FDRAWCMD ioctl output 2014-05-13 13:59:40 +02:00
hd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
ida_cmd.h
ida_ioctl.h
Kconfig block: IBM RamSan 70/80 branding changes. 2013-03-11 19:53:55 +01:00
loop.c loop: fix crash when using unassigned loop device 2013-12-04 10:56:20 -08:00
Makefile NVMe: Add nvme-scsi.c 2013-03-28 14:50:49 -04:00
mg_disk.c Merge branch 'for-3.10/drivers' of git://git.kernel.dk/linux-block 2013-05-08 11:51:05 -07:00
nbd.c nbd: correct disconnect behavior 2013-07-21 18:21:29 -07:00
nvme-core.c NVMe: Add MSI support 2013-05-31 11:45:52 -04:00
nvme-scsi.c NVMe: Fix a signedness bug in nvme_trans_modesel_get_mp 2013-05-17 09:10:38 -04:00
osdblk.c block: Add bio_clone_bioset(), bio_clone_kmalloc() 2012-09-09 10:35:39 +02:00
pktcdvd.c pktcdvd: silence static checker warning 2013-05-29 15:36:22 +02:00
ps3disk.c Drivers: block: remove __dev* attributes. 2013-01-03 15:57:15 -08:00
ps3vram.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
rbd_types.h rbd: get rid of RBD_MAX_SEG_NAME_LEN 2012-12-17 08:37:29 -06:00
rbd.c rbd: drop an unsafe assertion 2015-02-26 17:48:49 -08:00
smart1,2.h fix typos 'comamnd' -> 'command' in comments 2011-02-02 11:31:21 +01:00
sunvdc.c sunvdc: don't call VD_OP_GET_VTOC 2014-11-21 09:22:52 -08:00
swim_asm.S m68k: mac - Add SWIM floppy support 2009-03-26 21:15:27 +01:00
swim.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
swim3.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
sx8.c block, sx8: fix pointer math issue getting fw version 2012-03-03 19:44:39 +01:00
umem.c Drivers: block: remove __dev* attributes. 2013-01-03 15:57:15 -08:00
umem.h drivers/block/umem: trim trailing whitespace 2007-10-10 09:25:59 +02:00
virtio_blk.c virtio_blk: remove nents member. 2013-03-20 15:44:58 +10:30
xen-blkfront.c xen-blkfront: restore the non-persistent data path 2014-06-07 13:25:37 -07:00
xsysace.c drivers/block/xsysace.c: fix id with missing port-number 2013-05-24 16:22:50 -07:00
z2ram.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00