All of lore.kernel.org
 help / color / mirror / Atom feed
From: Damien Le Moal <Damien.LeMoal@wdc.com>
To: Colin Ian King <colin.king@canonical.com>
Cc: Alasdair Kergon <agk@redhat.com>,
	Mike Snitzer <snitzer@redhat.com>,
	"dm-devel@redhat.com" <dm-devel@redhat.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: dm: Forbid requeue of writes to zones
Date: Fri, 4 Jun 2021 00:08:47 +0000	[thread overview]
Message-ID: <DM6PR04MB708127E21C618C8F5F6B3DB6E73B9@DM6PR04MB7081.namprd04.prod.outlook.com> (raw)
In-Reply-To: <7e7530a9-7939-2ad6-bfe1-d3aeeeed1f77@canonical.com>

On 2021/06/04 7:17, Colin Ian King wrote:
> 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@wdc.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.

This one is related to #7.

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

My patch does not touch these hunks. They are as is. So that is not new.

> 
>     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) &&

I do not understand this one, nor #4.

> 
> 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 kernel build robot signaled this one already. Will send an incremental patch
asap today.

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


-- 
Damien Le Moal
Western Digital Research

WARNING: multiple messages have this Message-ID
From: Damien Le Moal <Damien.LeMoal@wdc.com>
To: Colin Ian King <colin.king@canonical.com>
Cc: "dm-devel@redhat.com" <dm-devel@redhat.com>,
	Mike Snitzer <snitzer@redhat.com>,
	Alasdair Kergon <agk@redhat.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [dm-devel] dm: Forbid requeue of writes to zones
Date: Fri, 4 Jun 2021 00:08:47 +0000	[thread overview]
Message-ID: <DM6PR04MB708127E21C618C8F5F6B3DB6E73B9@DM6PR04MB7081.namprd04.prod.outlook.com> (raw)
In-Reply-To: <7e7530a9-7939-2ad6-bfe1-d3aeeeed1f77@canonical.com>

On 2021/06/04 7:17, Colin Ian King wrote:
> 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@wdc.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.

This one is related to #7.

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

My patch does not touch these hunks. They are as is. So that is not new.

> 
>     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) &&

I do not understand this one, nor #4.

> 
> 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 kernel build robot signaled this one already. Will send an incremental patch
asap today.

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


-- 
Damien Le Moal
Western Digital Research



--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2021-06-04  0:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-03 22:17 Colin Ian King
2021-06-03 22:17 ` [dm-devel] " Colin Ian King
2021-06-04  0:08 ` Damien Le Moal [this message]
2021-06-04  0:08   ` Damien Le Moal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DM6PR04MB708127E21C618C8F5F6B3DB6E73B9@DM6PR04MB7081.namprd04.prod.outlook.com \
    --to=damien.lemoal@wdc.com \
    --cc=agk@redhat.com \
    --cc=colin.king@canonical.com \
    --cc=dm-devel@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=snitzer@redhat.com \
    --subject='Re: dm: Forbid requeue of writes to zones' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.