diff mbox

[v3,16/44] atapi: Switch to byte-based block access

Message ID 1461368452-10389-17-git-send-email-eblake@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Eric Blake April 22, 2016, 11:40 p.m. UTC
Sector-based blk_read() should die; switch to byte-based
blk_pread() instead.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 hw/ide/atapi.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

John Snow April 25, 2016, 9:36 p.m. UTC | #1
On 04/22/2016 07:40 PM, Eric Blake wrote:
> Sector-based blk_read() should die; switch to byte-based
> blk_pread() instead.
> 
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  hw/ide/atapi.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c
> index 2bb606c..81000d8 100644
> --- a/hw/ide/atapi.c
> +++ b/hw/ide/atapi.c
> @@ -119,12 +119,12 @@ cd_read_sector_sync(IDEState *s)
> 
>      switch (s->cd_sector_size) {
>      case 2048:
> -        ret = blk_read(s->blk, (int64_t)s->lba << 2,
> -                       s->io_buffer, 4);
> +        ret = blk_pread(s->blk, (int64_t)s->lba << (2 + BDRV_SECTOR_BITS),
> +                        s->io_buffer, 4 << BDRV_SECTOR_BITS);
>          break;
>      case 2352:
> -        ret = blk_read(s->blk, (int64_t)s->lba << 2,
> -                       s->io_buffer + 16, 4);
> +        ret = blk_pread(s->blk, (int64_t)s->lba << (2 + BDRV_SECTOR_BITS),

Uh, hm. So what we have is a cdrom-sector-based LBA, that we need to
transform into IDE-based sectors, then to bytes.

We could just define an ATAPI_SECTOR_BITS to be (2 + BDRV_SECTOR_BITS).

Then, the lba conversion would be just:

s->lba << ATAPI_SECTOR_BITS

and the size would be just:

1 << ATAPI_SECTOR_BITS

And that's probably better on the eyes.

> +                        s->io_buffer + 16, 4 << BDRV_SECTOR_BITS);
>          if (ret >= 0) {
>              cd_data_to_raw(s->io_buffer, s->lba);
>          }
> 

The code already uses lots of different stuff like
4 * BDRV_SECTOR_SIZE
or
"2048"

so we probably need some staple definition here.


...Otherwise, none of this is a problem you've created, just one this
patch highlights. Fix at your own peril.

Acked-by: John Snow <jsnow@redhat.com>
diff mbox

Patch

diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c
index 2bb606c..81000d8 100644
--- a/hw/ide/atapi.c
+++ b/hw/ide/atapi.c
@@ -119,12 +119,12 @@  cd_read_sector_sync(IDEState *s)

     switch (s->cd_sector_size) {
     case 2048:
-        ret = blk_read(s->blk, (int64_t)s->lba << 2,
-                       s->io_buffer, 4);
+        ret = blk_pread(s->blk, (int64_t)s->lba << (2 + BDRV_SECTOR_BITS),
+                        s->io_buffer, 4 << BDRV_SECTOR_BITS);
         break;
     case 2352:
-        ret = blk_read(s->blk, (int64_t)s->lba << 2,
-                       s->io_buffer + 16, 4);
+        ret = blk_pread(s->blk, (int64_t)s->lba << (2 + BDRV_SECTOR_BITS),
+                        s->io_buffer + 16, 4 << BDRV_SECTOR_BITS);
         if (ret >= 0) {
             cd_data_to_raw(s->io_buffer, s->lba);
         }