[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <7e7530a9-7939-2ad6-bfe1-d3aeeeed1f77@canonical.com>
Date: Thu, 3 Jun 2021 23:17:09 +0100
From: Colin Ian King <colin.king@...onical.com>
To: Damien Le Moal <damien.lemoal@....com>
Cc: Alasdair Kergon <agk@...hat.com>,
Mike Snitzer <snitzer@...hat.com>, dm-devel@...hat.com,
linux-kernel@...r.kernel.org
Subject: re: dm: Forbid requeue of writes to zones
Hi,
Static analysis with Coverity on Linux next has found and issue in
drivers/md/dm.c with the following commit:
commit 2c243153d1d4be4e23735cd10984ac17c7a54531
Author: Damien Le Moal <damien.lemoal@....com>
Date: Wed May 26 06:24:58 2021 +0900
dm: Forbid requeue of writes to zones
The analysis is as follows:
828 static void dec_pending(struct dm_io *io, blk_status_t error)
829 {
830 unsigned long flags;
831 blk_status_t io_error;
1. var_decl: Declaring variable bio without initializer.
832 struct bio *bio;
833 struct mapped_device *md = io->md;
834
835 /* Push-back supersedes any I/O errors */
2. Condition !!error, taking true branch.
836 if (unlikely(error)) {
837 spin_lock_irqsave(&io->endio_lock, flags);
3. Condition io->status == 11 /* (blk_status_t)11 */, taking false
branch.
838 if (!(io->status == BLK_STS_DM_REQUEUE &&
__noflush_suspending(md)))
839 io->status = error;
840 spin_unlock_irqrestore(&io->endio_lock, flags);
841 }
842
4. Condition atomic_dec_and_test(&io->io_count), taking true branch.
843 if (atomic_dec_and_test(&io->io_count)) {
5. Condition io->status == 11 /* (blk_status_t)11 */, taking true
branch.
844 if (io->status == BLK_STS_DM_REQUEUE) {
845 /*
846 * Target requested pushing back the I/O.
847 */
848 spin_lock_irqsave(&md->deferred_lock, flags);
6. Condition __noflush_suspending(md), taking true branch.
849 if (__noflush_suspending(md) &&
Uninitialized pointer read
7. uninit_use_in_call: Using uninitialized value bio when calling
dm_is_zone_write.
850 !WARN_ON_ONCE(dm_is_zone_write(md, bio)))
851 /* NOTE early return due to
BLK_STS_DM_REQUEUE below */
852 bio_list_add_head(&md->deferred,
io->orig_bio);
The pointer bio is not initialized and yet is being used in the call to
function dm_is_zone_write where pointer bio is being accessed. I'm not
sure what the original intent was, but this looks incorrect.
Colin
Powered by blists - more mailing lists