From: Jeff Garzik <jeff@garzik.org>
To: Tejun Heo <htejun@gmail.com>
Cc: linux-ide@vger.kernel.org, alan@lxorguk.ukuu.org.uk, liml@rtr.ca,
albertl@mail.com, jens.axboe@oracle.com
Subject: Re: [PATCH 05/14] libata: make ->data_xfer return the number of consumed bytes
Date: Tue, 04 Dec 2007 14:30:41 -0500 [thread overview]
Message-ID: <4755AAE1.5060000@garzik.org> (raw)
In-Reply-To: <11963468181417-git-send-email-htejun@gmail.com>
Tejun Heo wrote:
> Depending on how many bytes are transferred as a unit, PIO data
> tranasfer may consume more bytes than requested. Knowing how much
> data is consumed is necessary to determine how much is left for
> draining. This patch update ->data_xfer such that it returns the
> number of consumed bytes.
>
> While at it, it also makes the following changes.
>
> * s/adev/dev/
> * s/buflen/len/
> * use READ/WRITE constants for rw indication
> * misc clean ups
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
> ---
> drivers/ata/libata-core.c | 56 ++++++++++++++++++++++++++---------------
> drivers/ata/pata_bf54x.c | 34 +++++++++++++------------
> drivers/ata/pata_ixp4xx_cf.c | 32 ++++++++++++-----------
> drivers/ata/pata_legacy.c | 38 +++++++++++++++-------------
> drivers/ata/pata_qdi.c | 32 +++++++++++++----------
> drivers/ata/pata_scc.c | 38 +++++++++++++++-------------
> drivers/ata/pata_winbond.c | 32 +++++++++++++----------
> include/linux/libata.h | 11 ++++---
> 8 files changed, 152 insertions(+), 121 deletions(-)
>
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index bc53492..10f3b42 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -4966,48 +4966,55 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
>
> /**
> * ata_data_xfer - Transfer data by PIO
> - * @adev: device to target
> + * @dev: device to target
> * @buf: data buffer
> - * @buflen: buffer length
> + * @len: buffer length
> * @write_data: read/write
> *
> * Transfer data from/to the device data register by PIO.
> *
> * LOCKING:
> * Inherited from caller.
> + *
> + * RETURNS:
> + * Bytes consumed.
> */
> -void ata_data_xfer(struct ata_device *adev, unsigned char *buf,
> - unsigned int buflen, int write_data)
> +unsigned int ata_data_xfer(struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - unsigned int words = buflen >> 1;
> + struct ata_port *ap = dev->link->ap;
> + void __iomem *data_addr = ap->ioaddr.data_addr;
> + unsigned int words = len >> 1;
>
> /* Transfer multiple of 2 bytes */
> - if (write_data)
> - iowrite16_rep(ap->ioaddr.data_addr, buf, words);
> + if (rw == READ)
> + ioread16_rep(data_addr, buf, words);
> else
> - ioread16_rep(ap->ioaddr.data_addr, buf, words);
> + iowrite16_rep(data_addr, buf, words);
>
> /* Transfer trailing 1 byte, if any. */
> - if (unlikely(buflen & 0x01)) {
> + if (unlikely(len & 0x01)) {
> u16 align_buf[1] = { 0 };
> - unsigned char *trailing_buf = buf + buflen - 1;
> + unsigned char *trailing_buf = buf + len - 1;
>
> - if (write_data) {
> - memcpy(align_buf, trailing_buf, 1);
> - iowrite16(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr);
> - } else {
> - align_buf[0] = cpu_to_le16(ioread16(ap->ioaddr.data_addr));
> + if (rw == READ) {
> + align_buf[0] = cpu_to_le16(ioread16(data_addr));
> memcpy(trailing_buf, align_buf, 1);
> + } else {
> + memcpy(align_buf, trailing_buf, 1);
> + iowrite16(le16_to_cpu(align_buf[0]), data_addr);
> }
> + words++;
> }
> +
> + return words << 1;
> }
>
> /**
> * ata_data_xfer_noirq - Transfer data by PIO
> - * @adev: device to target
> + * @dev: device to target
> * @buf: data buffer
> - * @buflen: buffer length
> + * @len: buffer length
> * @write_data: read/write
> *
> * Transfer data from/to the device data register by PIO. Do the
> @@ -5015,14 +5022,21 @@ void ata_data_xfer(struct ata_device *adev, unsigned char *buf,
> *
> * LOCKING:
> * Inherited from caller.
> + *
> + * RETURNS:
> + * Bytes consumed.
> */
> -void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
> - unsigned int buflen, int write_data)
> +unsigned int ata_data_xfer_noirq(struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> unsigned long flags;
> + unsigned int consumed;
> +
> local_irq_save(flags);
> - ata_data_xfer(adev, buf, buflen, write_data);
> + consumed = ata_data_xfer(dev, buf, len, rw);
> local_irq_restore(flags);
> +
> + return consumed;
> }
>
>
> diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
> index 81db405..53ae7d3 100644
> --- a/drivers/ata/pata_bf54x.c
> +++ b/drivers/ata/pata_bf54x.c
> @@ -1161,40 +1161,42 @@ static unsigned char bfin_bmdma_status(struct ata_port *ap)
> * bfin_data_xfer - Transfer data by PIO
> * @adev: device for this I/O
> * @buf: data buffer
> - * @buflen: buffer length
> + * @len: buffer length
> * @write_data: read/write
> *
> * Note: Original code is ata_data_xfer().
> */
>
> -static void bfin_data_xfer(struct ata_device *adev, unsigned char *buf,
> - unsigned int buflen, int write_data)
> +static unsigned int bfin_data_xfer(struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - unsigned int words = buflen >> 1;
> - unsigned short *buf16 = (u16 *) buf;
> + struct ata_port *ap = dev->link->ap;
> void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr;
> + unsigned int words = len >> 1;
> + unsigned short *buf16 = (u16 *)buf;
>
> /* Transfer multiple of 2 bytes */
> - if (write_data) {
> - write_atapi_data(base, words, buf16);
> - } else {
> + if (rw == READ)
> read_atapi_data(base, words, buf16);
> - }
> + else
> + write_atapi_data(base, words, buf16);
>
> /* Transfer trailing 1 byte, if any. */
> - if (unlikely(buflen & 0x01)) {
> + if (unlikely(len & 0x01)) {
> unsigned short align_buf[1] = { 0 };
> - unsigned char *trailing_buf = buf + buflen - 1;
> + unsigned char *trailing_buf = buf + len - 1;
>
> - if (write_data) {
> - memcpy(align_buf, trailing_buf, 1);
> - write_atapi_data(base, 1, align_buf);
> - } else {
> + if (rw == READ) {
> read_atapi_data(base, 1, align_buf);
> memcpy(trailing_buf, align_buf, 1);
> + } else {
> + memcpy(align_buf, trailing_buf, 1);
> + write_atapi_data(base, 1, align_buf);
> }
> + words++;
> }
> +
> + return words << 1;
> }
>
> /**
> diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c
> index fcd532a..b8a6ce3 100644
> --- a/drivers/ata/pata_ixp4xx_cf.c
> +++ b/drivers/ata/pata_ixp4xx_cf.c
> @@ -42,13 +42,13 @@ static int ixp4xx_set_mode(struct ata_link *link, struct ata_device **error)
> return 0;
> }
>
> -static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
> - unsigned int buflen, int write_data)
> +static unsigned int ixp4xx_mmio_data_xfer(struct ata_device *dev,
> + unsigned char *buf, unsigned int len, int rw)
> {
> unsigned int i;
> - unsigned int words = buflen >> 1;
> + unsigned int words = len >> 1;
> u16 *buf16 = (u16 *) buf;
> - struct ata_port *ap = adev->link->ap;
> + struct ata_port *ap = dev->link->ap;
> void __iomem *mmio = ap->ioaddr.data_addr;
> struct ixp4xx_pata_data *data = ap->host->dev->platform_data;
>
> @@ -59,30 +59,32 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
> udelay(100);
>
> /* Transfer multiple of 2 bytes */
> - if (write_data) {
> - for (i = 0; i < words; i++)
> - writew(buf16[i], mmio);
> - } else {
> + if (rw == READ)
> for (i = 0; i < words; i++)
> buf16[i] = readw(mmio);
> - }
> + else
> + for (i = 0; i < words; i++)
> + writew(buf16[i], mmio);
>
> /* Transfer trailing 1 byte, if any. */
> - if (unlikely(buflen & 0x01)) {
> + if (unlikely(len & 0x01)) {
> u16 align_buf[1] = { 0 };
> - unsigned char *trailing_buf = buf + buflen - 1;
> + unsigned char *trailing_buf = buf + len - 1;
>
> - if (write_data) {
> - memcpy(align_buf, trailing_buf, 1);
> - writew(align_buf[0], mmio);
> - } else {
> + if (rw == READ) {
> align_buf[0] = readw(mmio);
> memcpy(trailing_buf, align_buf, 1);
> + } else {
> + memcpy(align_buf, trailing_buf, 1);
> + writew(align_buf[0], mmio);
> }
> + words++;
> }
>
> udelay(100);
> *data->cs0_cfg |= 0x01;
> +
> + return words << 1;
> }
>
> static struct scsi_host_template ixp4xx_sht = {
> diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
> index 7bed8d8..f04e980 100644
> --- a/drivers/ata/pata_legacy.c
> +++ b/drivers/ata/pata_legacy.c
> @@ -249,13 +249,14 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
>
> }
>
> -static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
> +static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
> + unsigned char *buf, unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - int slop = buflen & 3;
> - unsigned long flags;
> -
> if (ata_id_has_dword_io(adev->id)) {
> + struct ata_port *ap = dev->link->ap;
> + int slop = len & 3;
> + unsigned long flags;
> +
> local_irq_save(flags);
>
> /* Perform the 32bit I/O synchronization sequence */
> @@ -264,28 +265,29 @@ static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsig
> ioread8(ap->ioaddr.nsect_addr);
>
> /* Now the data */
> -
> - if (write_data)
> - iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + if (rw == READ)
> + ioread32_rep(ap->ioaddr.data_addr, buf, len >> 2);
> else
> - ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + iowrite32_rep(ap->ioaddr.data_addr, buf, len >> 2);
>
> if (unlikely(slop)) {
> u32 pad;
> - if (write_data) {
> - memcpy(&pad, buf + buflen - slop, slop);
> - pad = le32_to_cpu(pad);
> - iowrite32(pad, ap->ioaddr.data_addr);
> - } else {
> + if (rw == READ) {
> pad = ioread32(ap->ioaddr.data_addr);
> pad = cpu_to_le16(pad);
> - memcpy(buf + buflen - slop, &pad, slop);
> + memcpy(buf + len - slop, &pad, slop);
> + } else {
> + memcpy(&pad, buf + len - slop, slop);
> + pad = le32_to_cpu(pad);
> + iowrite32(pad, ap->ioaddr.data_addr);
> }
> + len += 4 - slop;
> }
> local_irq_restore(flags);
> - }
> - else
> - ata_data_xfer_noirq(adev, buf, buflen, write_data);
> + } else
> + len = ata_data_xfer_noirq(dev, buf, len, rw);
> +
> + return len;
> }
>
> static struct ata_port_operations pdc20230_port_ops = {
> diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c
> index 7d4c696..9e1802e 100644
> --- a/drivers/ata/pata_qdi.c
> +++ b/drivers/ata/pata_qdi.c
> @@ -124,31 +124,35 @@ static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc)
> return ata_qc_issue_prot(qc);
> }
>
> -static void qdi_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
> +static unsigned int qdi_data_xfer(struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - int slop = buflen & 3;
> + if (ata_id_has_dword_io(dev->id)) {
> + struct ata_port *ap = dev->link->ap;
> + int slop = len & 3;
>
> - if (ata_id_has_dword_io(adev->id)) {
> - if (write_data)
> - iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + if (rw == READ)
> + ioread32_rep(ap->ioaddr.data_addr, buf, len >> 2);
> else
> - ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + iowrite32_rep(ap->ioaddr.data_addr, buf, len >> 2);
>
> if (unlikely(slop)) {
> u32 pad;
> - if (write_data) {
> - memcpy(&pad, buf + buflen - slop, slop);
> - pad = le32_to_cpu(pad);
> - iowrite32(pad, ap->ioaddr.data_addr);
> - } else {
> + if (rw == READ) {
> pad = ioread32(ap->ioaddr.data_addr);
> pad = cpu_to_le32(pad);
> - memcpy(buf + buflen - slop, &pad, slop);
> + memcpy(buf + len - slop, &pad, slop);
> + } else {
> + memcpy(&pad, buf + len - slop, slop);
> + pad = le32_to_cpu(pad);
> + iowrite32(pad, ap->ioaddr.data_addr);
> }
> + len += 4 - slop;
> }
> } else
> - ata_data_xfer(adev, buf, buflen, write_data);
> + len = ata_data_xfer(dev, buf, len, rw);
> +
> + return len;
> }
>
> static struct scsi_host_template qdi_sht = {
> diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c
> index ea2ef9f..755e2b9 100644
> --- a/drivers/ata/pata_scc.c
> +++ b/drivers/ata/pata_scc.c
> @@ -768,45 +768,47 @@ static u8 scc_bmdma_status (struct ata_port *ap)
>
> /**
> * scc_data_xfer - Transfer data by PIO
> - * @adev: device for this I/O
> + * @dev: device for this I/O
> * @buf: data buffer
> - * @buflen: buffer length
> - * @write_data: read/write
> + * @len: buffer length
> + * @rw: read/write
> *
> * Note: Original code is ata_data_xfer().
> */
>
> -static void scc_data_xfer (struct ata_device *adev, unsigned char *buf,
> - unsigned int buflen, int write_data)
> +static unsigned int scc_data_xfer (struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - unsigned int words = buflen >> 1;
> + struct ata_port *ap = dev->link->ap;
> + unsigned int words = len >> 1;
> unsigned int i;
> u16 *buf16 = (u16 *) buf;
> void __iomem *mmio = ap->ioaddr.data_addr;
>
> /* Transfer multiple of 2 bytes */
> - if (write_data) {
> - for (i = 0; i < words; i++)
> - out_be32(mmio, cpu_to_le16(buf16[i]));
> - } else {
> + if (rw == READ)
> for (i = 0; i < words; i++)
> buf16[i] = le16_to_cpu(in_be32(mmio));
> - }
> + else
> + for (i = 0; i < words; i++)
> + out_be32(mmio, cpu_to_le16(buf16[i]));
>
> /* Transfer trailing 1 byte, if any. */
> - if (unlikely(buflen & 0x01)) {
> + if (unlikely(len & 0x01)) {
> u16 align_buf[1] = { 0 };
> - unsigned char *trailing_buf = buf + buflen - 1;
> + unsigned char *trailing_buf = buf + len - 1;
>
> - if (write_data) {
> - memcpy(align_buf, trailing_buf, 1);
> - out_be32(mmio, cpu_to_le16(align_buf[0]));
> - } else {
> + if (rw == READ) {
> align_buf[0] = le16_to_cpu(in_be32(mmio));
> memcpy(trailing_buf, align_buf, 1);
> + } else {
> + memcpy(align_buf, trailing_buf, 1);
> + out_be32(mmio, cpu_to_le16(align_buf[0]));
> }
> + words++;
> }
> +
> + return words << 1;
> }
>
> /**
> diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c
> index 311cdb3..9ded084 100644
> --- a/drivers/ata/pata_winbond.c
> +++ b/drivers/ata/pata_winbond.c
> @@ -92,31 +92,35 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
> }
>
>
> -static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
> +static void winbond_data_xfer(struct ata_device *dev, unsigned char *buf,
> + unsigned int len, int rw)
> {
> - struct ata_port *ap = adev->link->ap;
> - int slop = buflen & 3;
> + struct ata_port *ap = dev->link->ap;
> + int slop = len & 3;
>
> - if (ata_id_has_dword_io(adev->id)) {
> - if (write_data)
> - iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + if (ata_id_has_dword_io(dev->id)) {
> + if (rw == READ)
> + ioread32_rep(ap->ioaddr.data_addr, buf, len >> 2);
> else
> - ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
> + iowrite32_rep(ap->ioaddr.data_addr, buf, len >> 2);
>
> if (unlikely(slop)) {
> u32 pad;
> - if (write_data) {
> - memcpy(&pad, buf + buflen - slop, slop);
> - pad = le32_to_cpu(pad);
> - iowrite32(pad, ap->ioaddr.data_addr);
> - } else {
> + if (rw == read) {
> pad = ioread32(ap->ioaddr.data_addr);
> pad = cpu_to_le16(pad);
> - memcpy(buf + buflen - slop, &pad, slop);
> + memcpy(buf + len - slop, &pad, slop);
> + } else {
> + memcpy(&pad, buf + len - slop, slop);
> + pad = le32_to_cpu(pad);
> + iowrite32(pad, ap->ioaddr.data_addr);
> }
> + len += 4 - slop;
> }
> } else
> - ata_data_xfer(adev, buf, buflen, write_data);
> + len = ata_data_xfer(dev, buf, len, rw);
> +
> + return len;
IMO s/buflen/len/ causes needless patch noise, and makes this harder review
next prev parent reply other threads:[~2007-12-04 19:30 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-29 14:33 [PATCHSET] libata: improve ATAPI data transfer handling, take #2 Tejun Heo
2007-11-29 14:33 ` [PATCH 01/14] libata: update atapi_eh_request_sense() such that lbam/lbah contains buffer size Tejun Heo
2007-11-29 15:51 ` Alan Cox
2007-12-04 19:27 ` Jeff Garzik
2007-12-05 0:47 ` Tejun Heo
2007-11-29 14:33 ` [PATCH 02/14] cdrom: add more GPCMD_* constants Tejun Heo
2007-11-29 14:33 ` [PATCH 03/14] libata: rename ATA_PROT_ATAPI_* to ATAPI_PROT_* Tejun Heo
2007-11-29 15:52 ` Alan Cox
2007-11-29 14:33 ` [PATCH 04/14] libata: add ATAPI_* cmd types and implement atapi_cmd_type() Tejun Heo
2007-11-29 14:33 ` [PATCH 05/14] libata: make ->data_xfer return the number of consumed bytes Tejun Heo
2007-11-29 15:55 ` Alan Cox
2007-11-29 16:06 ` Tejun Heo
2007-11-29 17:42 ` Alan Cox
2007-11-29 18:00 ` Tejun Heo
2007-11-29 18:24 ` Alan Cox
2007-11-29 18:57 ` Mark Lord
2007-11-29 19:37 ` Jeff Garzik
2007-11-29 19:36 ` Jeff Garzik
2007-11-29 21:22 ` Alan Cox
2007-12-04 19:30 ` Jeff Garzik [this message]
2007-12-05 0:49 ` Tejun Heo
2007-12-05 1:05 ` Jeff Garzik
2007-11-29 14:33 ` [PATCH 06/14] libata: improve ATAPI draining Tejun Heo
2007-11-29 15:59 ` Alan Cox
2007-11-29 16:09 ` Tejun Heo
2007-11-29 16:42 ` Tejun Heo
2007-11-29 17:40 ` Alan Cox
2007-11-29 18:11 ` Tejun Heo
2007-11-29 18:19 ` Alan Cox
2007-12-04 10:06 ` Albert Lee
2007-12-05 1:00 ` Tejun Heo
2007-11-29 14:33 ` [PATCH 07/14] libata: make atapi_request_sense() use sg Tejun Heo
2007-11-29 14:33 ` [PATCH 08/14] libata: kill non-sg DMA interface Tejun Heo
2007-11-29 16:00 ` Alan Cox
2007-12-04 19:31 ` Jeff Garzik
2007-12-05 1:02 ` Tejun Heo
2007-11-29 14:33 ` [PATCH 09/14] libata: change ATA_QCFLAG_DMAMAP semantics Tejun Heo
2007-11-29 14:33 ` [PATCH 10/14] libata: convert to chained sg Tejun Heo
2007-11-29 14:33 ` [PATCH 11/14] libata: add qc->dma_nbytes Tejun Heo
2007-11-29 16:02 ` Alan Cox
2007-12-04 19:33 ` Jeff Garzik
2007-12-05 1:02 ` Tejun Heo
2007-11-29 14:33 ` [PATCH 12/14] libata: implement ATAPI drain buffer Tejun Heo
2007-11-29 14:33 ` [PATCH 13/14] libata: implement ATAPI per-command-type DMA horkages Tejun Heo
2007-11-29 16:04 ` Alan Cox
2007-11-29 16:10 ` Tejun Heo
2007-11-29 14:33 ` [PATCH 14/14] libata: use PIO for misc ATAPI commands Tejun Heo
2007-11-29 16:05 ` Alan Cox
2007-11-29 16:14 ` Tejun Heo
2007-11-29 16:16 ` Tejun Heo
2007-11-29 18:55 ` Mark Lord
2007-11-29 22:52 ` Tejun Heo
2007-11-30 1:03 ` Mark Lord
2007-11-30 1:34 ` Tejun Heo
2007-11-30 4:19 ` Mark Lord
2007-11-30 13:40 ` Alan Cox
2007-11-30 13:59 ` Tejun Heo
2007-11-30 14:12 ` Jeff Garzik
2007-11-30 15:36 ` Alan Cox
2007-11-30 13:09 ` Alan Cox
2007-11-29 17:38 ` Alan Cox
2007-12-04 19:34 ` Jeff Garzik
2007-12-05 1:14 ` Tejun Heo
2007-12-05 12:47 ` Alan Cox
2007-12-05 13:03 ` Tejun Heo
2007-12-05 14:01 ` Alan Cox
2007-12-05 14:22 ` Tejun Heo
2007-12-05 14:46 ` Alan Cox
2007-12-05 15:13 ` Tejun Heo
2007-12-05 18:52 ` Jeff Garzik
2007-12-06 11:03 ` Petr Vandrovec
2007-12-06 11:10 ` 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=4755AAE1.5060000@garzik.org \
--to=jeff@garzik.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=albertl@mail.com \
--cc=htejun@gmail.com \
--cc=jens.axboe@oracle.com \
--cc=liml@rtr.ca \
--cc=linux-ide@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).