From: Jeff Garzik <jgarzik@pobox.com>
To: Tejun Heo <htejun@gmail.com>
Cc: Arnd Bergmann <arnd.bergmann@de.ibm.com>,
linux-ide@vger.kernel.org, linuxppc-dev@ozlabs.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] libata: don't initialize sg in ata_exec_internal() if DMA_NONE
Date: Mon, 11 Dec 2006 10:55:08 -0500 [thread overview]
Message-ID: <457D7F5C.8040609@pobox.com> (raw)
In-Reply-To: <20061211140258.GB18947@htj.dyndns.org>
Tejun Heo wrote:
> Calling sg_init_one() with NULL buf causes oops on certain
> configurations. Don't initialize sg in ata_exec_internal() if
> DMA_NONE and make the function complain if @buf is NULL when dma_dir
> isn't DMA_NONE. While at it, fix comment.
>
> The problem is discovered and initial patch was submitted by Arnd
> Bergmann.
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
> Cc: Arnd Bergmann <arnd.bergmann@de.ibm.com>
> ---
>
> Hello, Arnd Bergmann.
>
> Thanks for spotting and fixing this but ata_exec_internal_nodma() is
> almost identical to ata_do_simple_cmd() and ata_exec_internal() itself
> needs fixing anyway. This patch just fixes ata_exec_internal(). I'll
> follow up with conversion to ata_do_simple_cmd().
>
> Thanks.
>
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index 011c0a8..70e02e9 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -1332,7 +1332,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
> }
>
> /**
> - * ata_exec_internal_sg - execute libata internal command
> + * ata_exec_internal - execute libata internal command
> * @dev: Device to which the command is sent
> * @tf: Taskfile registers for the command and the result
> * @cdb: CDB for packet command
> @@ -1354,10 +1354,15 @@ unsigned ata_exec_internal(struct ata_device *dev,
> int dma_dir, void *buf, unsigned int buflen)
> {
> struct scatterlist sg;
> + unsigned int n_elem = 0;
>
> - sg_init_one(&sg, buf, buflen);
> + if (dma_dir != DMA_NONE) {
> + WARN_ON(!buf);
> + sg_init_one(&sg, buf, buflen);
> + n_elem++;
> + }
>
> - return ata_exec_internal_sg(dev, tf, cdb, dma_dir, &sg, 1);
> + return ata_exec_internal_sg(dev, tf, cdb, dma_dir, &sg, n_elem);
ACK, if you conditionally replace "&sg" with NULL. That's the safer
choice, as it guarantees (via an oops) that the user will not be
touching sg, if dma_dir==DMA_NONE.
Jeff
WARNING: multiple messages have this Message-ID (diff)
From: Jeff Garzik <jgarzik@pobox.com>
To: Tejun Heo <htejun@gmail.com>
Cc: linux-ide@vger.kernel.org,
Arnd Bergmann <arnd.bergmann@de.ibm.com>,
linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org
Subject: Re: [PATCH] libata: don't initialize sg in ata_exec_internal() if DMA_NONE
Date: Mon, 11 Dec 2006 10:55:08 -0500 [thread overview]
Message-ID: <457D7F5C.8040609@pobox.com> (raw)
In-Reply-To: <20061211140258.GB18947@htj.dyndns.org>
Tejun Heo wrote:
> Calling sg_init_one() with NULL buf causes oops on certain
> configurations. Don't initialize sg in ata_exec_internal() if
> DMA_NONE and make the function complain if @buf is NULL when dma_dir
> isn't DMA_NONE. While at it, fix comment.
>
> The problem is discovered and initial patch was submitted by Arnd
> Bergmann.
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
> Cc: Arnd Bergmann <arnd.bergmann@de.ibm.com>
> ---
>
> Hello, Arnd Bergmann.
>
> Thanks for spotting and fixing this but ata_exec_internal_nodma() is
> almost identical to ata_do_simple_cmd() and ata_exec_internal() itself
> needs fixing anyway. This patch just fixes ata_exec_internal(). I'll
> follow up with conversion to ata_do_simple_cmd().
>
> Thanks.
>
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index 011c0a8..70e02e9 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -1332,7 +1332,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
> }
>
> /**
> - * ata_exec_internal_sg - execute libata internal command
> + * ata_exec_internal - execute libata internal command
> * @dev: Device to which the command is sent
> * @tf: Taskfile registers for the command and the result
> * @cdb: CDB for packet command
> @@ -1354,10 +1354,15 @@ unsigned ata_exec_internal(struct ata_device *dev,
> int dma_dir, void *buf, unsigned int buflen)
> {
> struct scatterlist sg;
> + unsigned int n_elem = 0;
>
> - sg_init_one(&sg, buf, buflen);
> + if (dma_dir != DMA_NONE) {
> + WARN_ON(!buf);
> + sg_init_one(&sg, buf, buflen);
> + n_elem++;
> + }
>
> - return ata_exec_internal_sg(dev, tf, cdb, dma_dir, &sg, 1);
> + return ata_exec_internal_sg(dev, tf, cdb, dma_dir, &sg, n_elem);
ACK, if you conditionally replace "&sg" with NULL. That's the safer
choice, as it guarantees (via an oops) that the user will not be
touching sg, if dma_dir==DMA_NONE.
Jeff
next prev parent reply other threads:[~2006-12-11 15:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-08 18:14 [PATCH] libata: fix oops with sparsemem Arnd Bergmann
2006-12-08 18:14 ` Arnd Bergmann
2006-12-11 14:02 ` [PATCH] libata: don't initialize sg in ata_exec_internal() if DMA_NONE Tejun Heo
2006-12-11 14:02 ` Tejun Heo
2006-12-11 14:18 ` Arnd Bergmann
2006-12-11 14:18 ` Arnd Bergmann
2006-12-11 14:33 ` Jeff Garzik
2006-12-11 14:33 ` Jeff Garzik
2006-12-11 14:23 ` Tejun Heo
2006-12-11 14:23 ` Tejun Heo
2006-12-11 15:55 ` Jeff Garzik [this message]
2006-12-11 15:55 ` Jeff Garzik
2006-12-11 17:15 ` [PATCH] libata: don't initialize sg in ata_exec_internal() if DMA_NONE (take #2) Tejun Heo
2006-12-11 17:15 ` Tejun Heo
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=457D7F5C.8040609@pobox.com \
--to=jgarzik@pobox.com \
--cc=arnd.bergmann@de.ibm.com \
--cc=htejun@gmail.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.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.