From: Jan Vesely <jvesely@redhat.com>
To: Joe Lawrence <Joe.Lawrence@stratus.com>
Cc: linux-scsi@vger.kernel.org, "Ewan Milne" <emilne@redhat.com>,
"James E.J. Bottomley" <JBottomley@parallels.com>,
"Kai Mäkisara" <Kai.Makisara@kolumbus.fi>
Subject: Re: [PATCH] st: Take additional queue ref in st_probe
Date: Tue, 05 Mar 2013 13:39:28 +0100 [thread overview]
Message-ID: <5135E780.6040303@redhat.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1303041101450.1736@jlaw-desktop.mno.stratus.com>
Hi,
I don't understand how error paths are supposed to work with this patch.
As I see it, if we fail to get a reference, the error path tries to put a
non-existent one. moreover, error paths on lines 4188 and 4196 still goto
out_put_disk, leaking the reference.
other than that, it fixes the load/unload cycle issue for me as well
thanks,
On 04/03/13 17:14, Joe Lawrence wrote:
> These changes were applied to scsi.git, branch "misc". This patch
> fixes a reference count bug in the SCSI tape driver which can be
> reproduced with the following:
>
> * Boot with slub_debug=FZPU, tape drive attached
> * echo 1 > /sys/devices/... tape device pci path .../remove
> * Wait for device removal
> * echo 1 > /sys/kernel/slab/blkdev_queue/validate
> * Slub debug complains about corrupted poison pattern
>
> In commit 523e1d39 (block: make gendisk hold a reference to its queue)
> add_disk() and disk_release() were modified to get/put an additional
> reference on a disk queue to fix a reference counting discrepency
> between bdev release and SCSI device removal. The ST driver never
> calls add_disk(), so this commit introduced an extra kref put when the
> ST driver frees its struct gendisk.
>
> Attempts were made to fix this bug at the block level [1] but later
> abandoned due to floppy driver issues [2].
>
> [1] https://lkml.org/lkml/2012/8/27/354
> [2] https://lkml.org/lkml/2012/9/22/113
>
> Regards,
>
> -- Joe
>
> From f209bda3ee16a70e714b55c372ed4265bfa91784 Mon Sep 17 00:00:00 2001
> From: Joe Lawrence <joe.lawrence@stratus.com>
> Date: Fri, 1 Mar 2013 17:32:30 -0500
> Subject: [PATCH] st: Take additional queue ref in st_probe
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> The SCSI tape driver employs a struct gendisk, calling alloc_disk() to
> create an instance, but does not register it via add_disk(). When the
> gendisk is torn down, disk_release() is called and expects to return a
> disk queue reference that add_disk() normally would have taken out. (See
> commit 523e1d39.) Fix the kref accounting by adding a blk_get_queue()
> to st_probe().
>
> Signed-off-by: Joe Lawrence <joe.lawrence@stratus.com>
> Tested-by: Ewan Milne <emilne@redhat.com>
> Cc: Kai Mäkisara <Kai.Makisara@kolumbus.fi>
> Cc: James E.J. Bottomley <JBottomley@parallels.com>
> Cc: Ewan Milne <emilne@redhat.com>
> Cc: linux-scsi@vger.kernel.org
> ---
> drivers/scsi/st.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
> index 98156a9..eef8ddc 100644
> --- a/drivers/scsi/st.c
> +++ b/drivers/scsi/st.c
> @@ -4112,6 +4112,10 @@ static int st_probe(struct device *dev)
> tpnt->disk = disk;
> disk->private_data = &tpnt->driver;
> disk->queue = SDp->request_queue;
> + /* SCSI tape doesn't register this gendisk via add_disk(). Manually
> + * take queue reference that release_disk() expects. */
> + if (!blk_get_queue(disk->queue))
> + goto out_put_queue;
> tpnt->driver = &st_template;
>
> tpnt->device = SDp;
> @@ -4222,6 +4226,8 @@ out_put_index:
> spin_lock(&st_index_lock);
> idr_remove(&st_index_idr, dev_num);
> spin_unlock(&st_index_lock);
> +out_put_queue:
> + blk_put_queue(disk->queue);
> out_put_disk:
> put_disk(disk);
> kfree(tpnt);
>
--
-----
Jan Vesely <jvesely@redhat.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-03-05 12:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-04 16:14 [PATCH] st: Take additional queue ref in st_probe Joe Lawrence
2013-03-04 18:13 ` Ewan Milne
2013-03-04 23:42 ` Seymour, Shane M
2013-03-05 12:39 ` Jan Vesely [this message]
2013-03-05 15:57 ` [PATCH v2] " Joe Lawrence
2013-03-05 17:17 ` Kai Makisara
2013-03-05 17:34 ` James Bottomley
2013-03-15 9:13 ` Jan Vesely
2013-03-15 12:51 ` Ewan Milne
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=5135E780.6040303@redhat.com \
--to=jvesely@redhat.com \
--cc=JBottomley@parallels.com \
--cc=Joe.Lawrence@stratus.com \
--cc=Kai.Makisara@kolumbus.fi \
--cc=emilne@redhat.com \
--cc=linux-scsi@vger.kernel.org \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.