Re: [PATCH] make ide-cd handle non-2kB sector sizes

Bartlomiej Zolnierkiewicz
2004-01-23T15:20:14Z

On Friday 23 of January 2004 15:01, Pascal Schmidt wrote:
> On Fri, 23 Jan 2004, Jens Axboe wrote:
> > It's a good first start, thanks for doing this. You really want to be
> > storing this info in the queue, though, there's a hardsector size just
> > for this very purpose. That way other layers know about the hardware
> > sector size as well, not just ide-cd. And you get other things right for
> > free as well, for instance ide_cdrom_prep_fs() needs a correct hardware
> > block size or it will build wrong cdbs.
>
> Hmmm. I'm doing
>
> blk_queue_hardsect_size(drive->queue, sectors_per_frame << 9);
>
> inside of cdrom_read_toc, is that not enough? Or do you mean that
> I should only store it in the queue and not also in cdrom_state_flags?

I think Jens means storing it only in q->hardsect_size.
This way you can just use rq->q->hardsect_size << 9 to get sectors_per_frame.

> > Hmm, you made it a bit more confusing. It should read that writes must
> > be hardware sector aligned. Something ala
> >
> > if ((rq->nr_sectors << 9) & (sector_size - 1) ||
> > (rq->sector & ((sector_size >> 9) - 1)))
> > problem
>
> I'll change that.

If you do that please remember to revert this chunk
(except comment fix of course):

@@ -1969,9 +1959,13 @@ static ide_startstop_t cdrom_start_write

info->nsectors_buffered = 0;

- /* use dma, if possible. we don't need to check more, since we
- * know that the transfer is always (at least!) 2KB aligned */
- info->dma = drive->using_dma ? 1 : 0;
+ /* use dma, if possible */
+ if (drive->using_dma && (rq->sector % sectors_per_frame == 0) &&
+ (rq->nr_sectors % sectors_per_frame == 0))
+ info->dma = 1;
+ else
+ info->dma = 0;
+

> > > - set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
> > > + set_capacity(drive->disk, toc->capacity * sectors_per_frame);
> > > +
> > > + if (CDROM_STATE_FLAGS(drive)->sectors_per_frame != sectors_per_frame)
> > > + printk(KERN_INFO "%s: new hardware sector size %lu\n",
> > > + drive->name, sectors_per_frame << 9);
> >
> > if you feel you must print this, then do it in the same line as the
> > other cdrom info printed.
>
> This happens on disc change, no other info is normally printed. But this
> printk can probably go away, I just put it there for debugging.

Good.

Cheers,
--bart