linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [2.6.20-rc6] pktcdvd doesn't work
@ 2007-01-30 19:53 Luca Tettamanti
  2007-01-30 20:02 ` Jan Engelhardt
  2007-01-31 23:30 ` Adrian Bunk
  0 siblings, 2 replies; 16+ messages in thread
From: Luca Tettamanti @ 2007-01-30 19:53 UTC (permalink / raw)
  To: Peter Osterlund; +Cc: linux-kernel

Hi,
pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
is written to the device is lost after umount.
I rarely use pktcdvd but at some point it used to work on my system.

This is what I'm doing:

root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
using device /dev/scd0
1029KB internal buffer
setting write speed to 12x
Settings for /dev/scd0:
        Fixed packets, size 32
        Mode-2 disc

I'm going to do a quick setup of /dev/scd0. The disc is going to be
blanked and formatted with one big track. All data on the device will be
lost!! Press CTRL-C to cancel now.
ENTER to continue.

Initiating quick disc blank
Disc capacity is 275616 blocks (551232KB/538MB)
Formatting track
start=0, blocks=16, type=RESERVED
start=16, blocks=3, type=VRS
start=19, blocks=237, type=USPACE
start=256, blocks=1, type=ANCHOR
start=257, blocks=31, type=USPACE
start=288, blocks=32, type=PVDS
start=320, blocks=32, type=LVID
start=352, blocks=32, type=STABLE
start=384, blocks=1024, type=SSPACE
start=1408, blocks=273920, type=PSPACE
start=275328, blocks=31, type=USPACE
start=275359, blocks=1, type=ANCHOR
start=275360, blocks=160, type=USPACE
start=275520, blocks=32, type=STABLE
start=275552, blocks=32, type=RVDS
start=275584, blocks=31, type=USPACE
start=275615, blocks=1, type=ANCHOR
Writing UDF structures to disc
Quick setup complete!
root@dreamland:/tmp# pktsetup pkt0 /dev/scd0
pktcdvd: writer pktcdvd0 mapped to sr0
root@dreamland:/tmp# mount -t udf -o rw,noatime /dev/pktcdvd/pkt0 /cdrom
pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
pktcdvd: Max. media speed: 4
pktcdvd: write speed 4x
pktcdvd: 0kB available on disc
UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)
root@dreamland:/tmp# touch /cdrom/test
root@dreamland:/tmp# ll /cdrom
total 0
drwxr-xr-x 2 root root 40 2007-01-30 18:18 lost+found
-rw-r--r-- 1 root root  0 2007-01-30 20:42 test
root@dreamland:/tmp# umount /cdrom
root@dreamland:/tmp# mount -t udf -o rw,noatime /dev/pktcdvd/pkt0 /cdrom
pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
pktcdvd: Max. media speed: 4
pktcdvd: write speed 4x
pktcdvd: 0kB available on disc
UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)
root@dreamland:/tmp# ll /cdrom
total 0
drwxr-xr-x 2 root root 40 2007-01-30 18:18 lost+found

As you can see the file is gone. Also notice that pktcdvd says:

pktcdvd: 0kB available on disc

which sounds very strange. The drive is this one:

scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
sr0: scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray

The disk:

root@dreamland:/tmp# cdrwtool -d /dev/scd0 -i
using device /dev/scd0
1029KB internal buffer
setting write speed to 12x

DISC INFO:
	erasable : Yes
	border = 3
	Disc status = 2
	number of first track = 1
	number of sessions = 1
	number of tracks = 1
	status of last track = 1
	uru = 0
	did_v = 1
	dbc_v = 0
	disc type = 32
	disc_id = 9773913
	lead_in = 255:255:255 (1166880)
	lead_out = 255:255:255 (1166880)
	OPC entries = 0

TRACK INFO:

Track 1
	track_number = 1
	session_number = 1
	damage = 0
	copy = 0
	track_mode = 7
	Rt = 1
	blank = 0
	packet = 1
	fp = 1
	data_mode = 2
	lra_v = 0
	nwa_v = 0
	track_start = 0
	next_writable = 0
	last_recorded = 0
	free_blocks = 0
	packet_size = 32
	track_size = 275616 (551232KB)

I've tried different media with the same result. Furthermore I can
correctly write an ISO9660 fs on these cdrw disks.


Luca
-- 
Un apostolo vedendo Gesu` camminare sulle acque:
- Cazzo se e` buono 'sto fumo!!!

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 19:53 [2.6.20-rc6] pktcdvd doesn't work Luca Tettamanti
@ 2007-01-30 20:02 ` Jan Engelhardt
  2007-01-30 20:36   ` Luca Tettamanti
  2007-01-31 23:30 ` Adrian Bunk
  1 sibling, 1 reply; 16+ messages in thread
From: Jan Engelhardt @ 2007-01-30 20:02 UTC (permalink / raw)
  To: Luca Tettamanti; +Cc: Peter Osterlund, linux-kernel


On Jan 30 2007 20:53, Luca Tettamanti wrote:
>Hi,
>pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that

Did it work previously?

>is written to the device is lost after umount.
>I rarely use pktcdvd but at some point it used to work on my system.
>
>This is what I'm doing:
>
>root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
>scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5

In case you are using ide-scsi: try without.


Jan
-- 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 20:02 ` Jan Engelhardt
@ 2007-01-30 20:36   ` Luca Tettamanti
  2007-01-30 20:42     ` Jan Engelhardt
  0 siblings, 1 reply; 16+ messages in thread
From: Luca Tettamanti @ 2007-01-30 20:36 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Peter Osterlund, linux-kernel

Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
> 
> On Jan 30 2007 20:53, Luca Tettamanti wrote:
> >Hi,
> >pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> 
> Did it work previously?

Yup, It used to work but since I rarely use it I don't remember which
kernel version worked for me.

> 
> >is written to the device is lost after umount.
> >I rarely use pktcdvd but at some point it used to work on my system.
> >
> >This is what I'm doing:
> >
> >root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> >scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
> 
> In case you are using ide-scsi: try without.

It's libata jmicron driver. Shall I try the "old" PATA driver on the
next reboot?

Luca
-- 
"Chi parla in tono cortese, ma continua a prepararsi, potra` andare avanti;
 chi parla in tono bellicoso e avanza rapidamente dovra` ritirarsi" 
Sun Tzu -- L'arte della guerra

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 20:36   ` Luca Tettamanti
@ 2007-01-30 20:42     ` Jan Engelhardt
  2007-01-30 23:16       ` Luca Tettamanti
  0 siblings, 1 reply; 16+ messages in thread
From: Jan Engelhardt @ 2007-01-30 20:42 UTC (permalink / raw)
  To: Luca Tettamanti; +Cc: Peter Osterlund, linux-kernel


On Jan 30 2007 21:36, Luca Tettamanti wrote:
>Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
>> 
>> On Jan 30 2007 20:53, Luca Tettamanti wrote:
>> >Hi,
>> >pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
>> 
>> Did it work previously?
>
>Yup, It used to work but since I rarely use it I don't remember which
>kernel version worked for me.

Hm, maybe you can take a guess.

>> >is written to the device is lost after umount.
>> >I rarely use pktcdvd but at some point it used to work on my system.
>> >
>> >This is what I'm doing:
>> >
>> >root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
>> >scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
>> 
>> In case you are using ide-scsi: try without.
>
>It's libata jmicron driver. Shall I try the "old" PATA driver on the
>next reboot?

If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
welcome.


Jan
-- 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 20:42     ` Jan Engelhardt
@ 2007-01-30 23:16       ` Luca Tettamanti
  2007-01-31 10:58         ` Jeff Garzik
  0 siblings, 1 reply; 16+ messages in thread
From: Luca Tettamanti @ 2007-01-30 23:16 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Peter Osterlund, linux-kernel, jgarzik, linux-ide

Hi Jeff, linux-ide,
I'm having troubles with libata and UDF on RW media. See below.

Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto: 
> On Jan 30 2007 21:36, Luca Tettamanti wrote:
> >Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
> >> 
> >> On Jan 30 2007 20:53, Luca Tettamanti wrote:
> >> >Hi,
> >> >pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> >> 
> >> Did it work previously?
> >
> >Yup, It used to work but since I rarely use it I don't remember which
> >kernel version worked for me.
> 
> Hm, maybe you can take a guess.

I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
 
> >> >is written to the device is lost after umount.
> >> >I rarely use pktcdvd but at some point it used to work on my system.
> >> >
> >> >This is what I'm doing:
> >> >
> >> >root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> >> >scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
> >> 
> >> In case you are using ide-scsi: try without.
> >
> >It's libata jmicron driver. Shall I try the "old" PATA driver on the
> >next reboot?
> 
> If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
> welcome.

With the legacy IDE driver it works fine.
The unit is DVD-RAM capable so the firmware should handle random writes
fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
lose files. So I guess it has something to do with libata.

So to recap, after formatting the disk with UDF:

* libata
  - mount with pktcdvd: all files are lost upon umount
  - mount scd0 w/out pktcdvd: all files are lost upon umount
  - write the disk with cdrecord: OK

  pktcdvd reports wrong capacity:
  
  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
  pktcdvd: Max. media speed: 4
  pktcdvd: write speed 4x
  pktcdvd: 0kB available on disc
  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)

* legacy IDE driver
  - mount with pktcdvd: OK
  - mount hda w/out pktcdvd: corrupts FS (duh)
  - write the disk with cdrecord: OK

  pktcdvd reports correct capacity:
  
  pktcdvd: writer pktcdvd0 mapped to hda
  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
  pktcdvd: Max. media speed: 4
  pktcdvd: write speed 4x
  pktcdvd: 551232kB available on disc
  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 22:19 (103c)

The HW is a JMicron controller:
02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)

(one of the 2 has PATA ports)

driven either by libata (CONFIG_PATA_JMICRON):

PCI: Enabling device 0000:02:00.1 (0000 -> 0001)
ACPI: PCI Interrupt 0000:02:00.1[B] -> GSI 17 (level, low) -> IRQ 19
PCI: Setting latency timer of device 0000:02:00.1 to 64
ata9: PATA max UDMA/100 cmd 0xAC00 ctl 0xA882 bmdma 0xA400 irq 19
ata10: PATA max UDMA/100 cmd 0xA800 ctl 0xA482 bmdma 0xA408 irq 19
scsi8 : pata_jmicron
ata9.00: ATAPI, max UDMA/33
ata9.01: ATAPI, max UDMA/33
ata9.00: configured for UDMA/33
ata9.01: configured for UDMA/33
scsi9 : pata_jmicron
ATA: abnormal status 0x7F on port 0xA807
scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
sr0: scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray
Uniform CD-ROM driver Revision: 3.20
sr 8:0:0:0: Attached scsi CD-ROM sr0
sr 8:0:0:0: Attached scsi generic sg1 type 5
scsi 8:0:1:0: CD-ROM            WAITEC   ALADAR/1         B1.5 PQ: 0 ANSI: 5
sr1: scsi3-mmc drive: 16x/40x writer cd/rw xa/form2 cdda tray
sr 8:0:1:0: Attached scsi CD-ROM sr1
sr 8:0:1:0: Attached scsi generic sg2 type 5

or by the legacy driver (CONFIG_BLK_DEV_JMICRON):

Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
JMB361: IDE controller at PCI slot 0000:02:00.1
PCI: Enabling device 0000:02:00.1 (0000 -> 0001)
ACPI: PCI Interrupt 0000:02:00.1[B] -> GSI 17 (level, low) -> IRQ 18
JMB361: chipset revision 2
JMB361: 100% native mode on irq 18
PCI: Setting latency timer of device 0000:02:00.1 to 64
    ide0: BM-DMA at 0xa400-0xa407, BIOS settings: hda:pio, hdb:pio
    ide1: BM-DMA at 0xa408-0xa40f, BIOS settings: hdc:pio, hdd:pio
Probing IDE interface ide0...
hda: HL-DT-ST DVDRAM GSA-4167B, ATAPI CD/DVD-ROM drive
hdb: WAITEC ALADAR/1, ATAPI CD/DVD-ROM drive
ide0 at 0xac00-0xac07,0xa882 on irq 18
Probing IDE interface ide1...
JMB361: IDE controller at PCI slot 0000:02:00.0
PCI: Device 0000:02:00.0 not available because of resource collisions
ACPI: PCI Interrupt 0000:02:00.0[A] -> GSI 16 (level, low) -> IRQ 16
JMB361: BIOS configuration fixed.
JMB361: chipset revision 2
JMB361: 100% native mode on irq 16
JMB361: dma_base is invalid
ide2: JMB361 Bus-Master DMA disabled (BIOS)
JMB361: dma_base is invalid
ide3: JMB361 Bus-Master DMA disabled (BIOS)
Probing IDE interface ide2...
Probing IDE interface ide3...
ALI15X3: IDE controller at PCI slot 0000:05:02.1
ACPI: PCI Interrupt 0000:05:02.1[A] -> GSI 23 (level, low) -> IRQ 19
ALI15X3: chipset revision 198
ALI15X3: 100% native mode on irq 19
ALI15X3: too many IDE interfaces, no room in table
ALI15X3: too many IDE interfaces, no room in table
(hum, must increase MAX_HWIF)
ALI15X3: neither IDE port enabled (BIOS)
hda: ATAPI 40X DVD-ROM DVD-R-RAM CD-R/RW drive, 2048kB Cache, UDMA(33)
Uniform CD-ROM driver Revision: 3.20
hdb: ATAPI 40X CD-ROM CD-R/RW drive, 8192kB Cache, UDMA(33)


Luca
-- 
Not an editor command: Wq

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 23:16       ` Luca Tettamanti
@ 2007-01-31 10:58         ` Jeff Garzik
  2007-01-31 19:17           ` Fabio Comolli
                             ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Jeff Garzik @ 2007-01-31 10:58 UTC (permalink / raw)
  To: Luca Tettamanti
  Cc: Jan Engelhardt, Peter Osterlund, linux-kernel, linux-ide, justin

Luca Tettamanti wrote:
> Hi Jeff, linux-ide,
> I'm having troubles with libata and UDF on RW media. See below.
> 
> Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto: 
>> On Jan 30 2007 21:36, Luca Tettamanti wrote:
>>> Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
>>>> On Jan 30 2007 20:53, Luca Tettamanti wrote:
>>>>> Hi,
>>>>> pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
>>>> Did it work previously?
>>> Yup, It used to work but since I rarely use it I don't remember which
>>> kernel version worked for me.
>> Hm, maybe you can take a guess.
> 
> I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
>  
>>>>> is written to the device is lost after umount.
>>>>> I rarely use pktcdvd but at some point it used to work on my system.
>>>>>
>>>>> This is what I'm doing:
>>>>>
>>>>> root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
>>>>> scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
>>>> In case you are using ide-scsi: try without.
>>> It's libata jmicron driver. Shall I try the "old" PATA driver on the
>>> next reboot?
>> If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
>> welcome.
> 
> With the legacy IDE driver it works fine.
> The unit is DVD-RAM capable so the firmware should handle random writes
> fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
> lose files. So I guess it has something to do with libata.
> 
> So to recap, after formatting the disk with UDF:
> 
> * libata
>   - mount with pktcdvd: all files are lost upon umount
>   - mount scd0 w/out pktcdvd: all files are lost upon umount
>   - write the disk with cdrecord: OK
> 
>   pktcdvd reports wrong capacity:
>   
>   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
>   pktcdvd: Max. media speed: 4
>   pktcdvd: write speed 4x
>   pktcdvd: 0kB available on disc
>   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)
> 
> * legacy IDE driver
>   - mount with pktcdvd: OK
>   - mount hda w/out pktcdvd: corrupts FS (duh)
>   - write the disk with cdrecord: OK
> 
>   pktcdvd reports correct capacity:
>   
>   pktcdvd: writer pktcdvd0 mapped to hda
>   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
>   pktcdvd: Max. media speed: 4
>   pktcdvd: write speed 4x
>   pktcdvd: 551232kB available on disc
>   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 22:19 (103c)
> 
> The HW is a JMicron controller:
> 02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
> 02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)

hmmm, definitely interesting behavior.

Would you mind putting this info into a bugzilla.kernel.org report, so 
that it is not lost?  This bug will likely go into a heavy ATAPI 
debugging session that is coming in a few weeks, but not immediately :/

	Jeff




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-31 10:58         ` Jeff Garzik
@ 2007-01-31 19:17           ` Fabio Comolli
  2007-01-31 19:59           ` Luca
  2007-01-31 23:10           ` Adrian Bunk
  2 siblings, 0 replies; 16+ messages in thread
From: Fabio Comolli @ 2007-01-31 19:17 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Luca Tettamanti, Jan Engelhardt, Peter Osterlund, linux-kernel,
	linux-ide, justin

Hi all.
I don't know if this report can be useful, but this problem does not
show up in my setup.

I tried multiple times to copy 10MB files (unmounting and remounting
every time) and verified with md5sum the results and everything is
correct.

Details:

* kernel version: 2.6.20-rc6-g93544047
* driver: ata_piix (only a PATA hard disk and a DVD writer)
* writer: TSSTcorp CD/DVDW TS-L532M HR08 PQ: 0 ANSI: 5).
* udftools version: udftools-1.0.0b3-7.fc6

Regards,
Fabio



On 1/31/07, Jeff Garzik <jgarzik@pobox.com> wrote:
> Luca Tettamanti wrote:
> > Hi Jeff, linux-ide,
> > I'm having troubles with libata and UDF on RW media. See below.
> >
> > Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto:
> >> On Jan 30 2007 21:36, Luca Tettamanti wrote:
> >>> Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto:
> >>>> On Jan 30 2007 20:53, Luca Tettamanti wrote:
> >>>>> Hi,
> >>>>> pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> >>>> Did it work previously?
> >>> Yup, It used to work but since I rarely use it I don't remember which
> >>> kernel version worked for me.
> >> Hm, maybe you can take a guess.
> >
> > I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
> >
> >>>>> is written to the device is lost after umount.
> >>>>> I rarely use pktcdvd but at some point it used to work on my system.
> >>>>>
> >>>>> This is what I'm doing:
> >>>>>
> >>>>> root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> >>>>> scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
> >>>> In case you are using ide-scsi: try without.
> >>> It's libata jmicron driver. Shall I try the "old" PATA driver on the
> >>> next reboot?
> >> If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
> >> welcome.
> >
> > With the legacy IDE driver it works fine.
> > The unit is DVD-RAM capable so the firmware should handle random writes
> > fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
> > lose files. So I guess it has something to do with libata.
> >
> > So to recap, after formatting the disk with UDF:
> >
> > * libata
> >   - mount with pktcdvd: all files are lost upon umount
> >   - mount scd0 w/out pktcdvd: all files are lost upon umount
> >   - write the disk with cdrecord: OK
> >
> >   pktcdvd reports wrong capacity:
> >
> >   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >   pktcdvd: Max. media speed: 4
> >   pktcdvd: write speed 4x
> >   pktcdvd: 0kB available on disc
> >   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)
> >
> > * legacy IDE driver
> >   - mount with pktcdvd: OK
> >   - mount hda w/out pktcdvd: corrupts FS (duh)
> >   - write the disk with cdrecord: OK
> >
> >   pktcdvd reports correct capacity:
> >
> >   pktcdvd: writer pktcdvd0 mapped to hda
> >   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >   pktcdvd: Max. media speed: 4
> >   pktcdvd: write speed 4x
> >   pktcdvd: 551232kB available on disc
> >   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 22:19 (103c)
> >
> > The HW is a JMicron controller:
> > 02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
> > 02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
>
> hmmm, definitely interesting behavior.
>
> Would you mind putting this info into a bugzilla.kernel.org report, so
> that it is not lost?  This bug will likely go into a heavy ATAPI
> debugging session that is coming in a few weeks, but not immediately :/
>
>         Jeff
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-31 10:58         ` Jeff Garzik
  2007-01-31 19:17           ` Fabio Comolli
@ 2007-01-31 19:59           ` Luca
  2007-01-31 23:10           ` Adrian Bunk
  2 siblings, 0 replies; 16+ messages in thread
From: Luca @ 2007-01-31 19:59 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Jan Engelhardt, Peter Osterlund, linux-kernel, linux-ide, justin

On 1/31/07, Jeff Garzik <jgarzik@pobox.com> wrote:
> Luca Tettamanti wrote:
> > Hi Jeff, linux-ide,
> > I'm having troubles with libata and UDF on RW media. See below.
> >
> > Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto:
> >> On Jan 30 2007 21:36, Luca Tettamanti wrote:
> >>> Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto:
> >>>> On Jan 30 2007 20:53, Luca Tettamanti wrote:
> >>>>> Hi,
> >>>>> pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> >>>> Did it work previously?
> >>> Yup, It used to work but since I rarely use it I don't remember which
> >>> kernel version worked for me.
> >> Hm, maybe you can take a guess.
> >
> > I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
> >
> >>>>> is written to the device is lost after umount.
> >>>>> I rarely use pktcdvd but at some point it used to work on my system.
> >>>>>
> >>>>> This is what I'm doing:
> >>>>>
> >>>>> root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> >>>>> scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 ANSI: 5
> >>>> In case you are using ide-scsi: try without.
> >>> It's libata jmicron driver. Shall I try the "old" PATA driver on the
> >>> next reboot?
> >> If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
> >> welcome.
> >
> > With the legacy IDE driver it works fine.
> > The unit is DVD-RAM capable so the firmware should handle random writes
> > fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
> > lose files. So I guess it has something to do with libata.
> >
> > So to recap, after formatting the disk with UDF:
> >
> > * libata
> >   - mount with pktcdvd: all files are lost upon umount
> >   - mount scd0 w/out pktcdvd: all files are lost upon umount
> >   - write the disk with cdrecord: OK
> >
> >   pktcdvd reports wrong capacity:
> >
> >   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >   pktcdvd: Max. media speed: 4
> >   pktcdvd: write speed 4x
> >   pktcdvd: 0kB available on disc
> >   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 18:18 (103c)
> >
> > * legacy IDE driver
> >   - mount with pktcdvd: OK
> >   - mount hda w/out pktcdvd: corrupts FS (duh)
> >   - write the disk with cdrecord: OK
> >
> >   pktcdvd reports correct capacity:
> >
> >   pktcdvd: writer pktcdvd0 mapped to hda
> >   pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >   pktcdvd: Max. media speed: 4
> >   pktcdvd: write speed 4x
> >   pktcdvd: 551232kB available on disc
> >   UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', timestamp 2007/01/30 22:19 (103c)
> >
> > The HW is a JMicron controller:
> > 02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
> > 02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
>
> hmmm, definitely interesting behavior.
>
> Would you mind putting this info into a bugzilla.kernel.org report, so
> that it is not lost?

Done, ID is 7910.

Luca

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-31 10:58         ` Jeff Garzik
  2007-01-31 19:17           ` Fabio Comolli
  2007-01-31 19:59           ` Luca
@ 2007-01-31 23:10           ` Adrian Bunk
  2007-01-31 23:38             ` Luca Tettamanti
  2 siblings, 1 reply; 16+ messages in thread
From: Adrian Bunk @ 2007-01-31 23:10 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Luca Tettamanti, Jan Engelhardt, Peter Osterlund, linux-kernel,
	linux-ide, justin, Christoph Hellwig

On Wed, Jan 31, 2007 at 05:58:19AM -0500, Jeff Garzik wrote:
> Luca Tettamanti wrote:
> >Hi Jeff, linux-ide,
> >I'm having troubles with libata and UDF on RW media. See below.
> >
> >Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto: 
> >>On Jan 30 2007 21:36, Luca Tettamanti wrote:
> >>>Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
> >>>>On Jan 30 2007 20:53, Luca Tettamanti wrote:
> >>>>>Hi,
> >>>>>pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> >>>>Did it work previously?
> >>>Yup, It used to work but since I rarely use it I don't remember which
> >>>kernel version worked for me.
> >>Hm, maybe you can take a guess.
> >
> >I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
> > 
> >>>>>is written to the device is lost after umount.
> >>>>>I rarely use pktcdvd but at some point it used to work on my system.
> >>>>>
> >>>>>This is what I'm doing:
> >>>>>
> >>>>>root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> >>>>>scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 
> >>>>>ANSI: 5
> >>>>In case you are using ide-scsi: try without.
> >>>It's libata jmicron driver. Shall I try the "old" PATA driver on the
> >>>next reboot?
> >>If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
> >>welcome.
> >
> >With the legacy IDE driver it works fine.
> >The unit is DVD-RAM capable so the firmware should handle random writes
> >fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
> >lose files. So I guess it has something to do with libata.
> >
> >So to recap, after formatting the disk with UDF:
> >
> >* libata
> >  - mount with pktcdvd: all files are lost upon umount
> >  - mount scd0 w/out pktcdvd: all files are lost upon umount
> >  - write the disk with cdrecord: OK
> >
> >  pktcdvd reports wrong capacity:
> >  
> >  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >  pktcdvd: Max. media speed: 4
> >  pktcdvd: write speed 4x
> >  pktcdvd: 0kB available on disc
> >  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', 
> >  timestamp 2007/01/30 18:18 (103c)
> >
> >* legacy IDE driver
> >  - mount with pktcdvd: OK
> >  - mount hda w/out pktcdvd: corrupts FS (duh)
> >  - write the disk with cdrecord: OK
> >
> >  pktcdvd reports correct capacity:
> >  
> >  pktcdvd: writer pktcdvd0 mapped to hda
> >  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> >  pktcdvd: Max. media speed: 4
> >  pktcdvd: write speed 4x
> >  pktcdvd: 551232kB available on disc
> >  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', 
> >  timestamp 2007/01/30 22:19 (103c)
> >
> >The HW is a JMicron controller:
> >02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI 
> >Controller (rev 02)
> >02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI 
> >Controller (rev 02)
> 
> hmmm, definitely interesting behavior.
> 
> Would you mind putting this info into a bugzilla.kernel.org report, so 
> that it is not lost?  This bug will likely go into a heavy ATAPI 
> debugging session that is coming in a few weeks, but not immediately :/

Is this related to #7810 (which is caused by Christoph's patches) or is 
this issue another 2.6.20-rc pktcdvd regression?

> 	Jeff

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-30 19:53 [2.6.20-rc6] pktcdvd doesn't work Luca Tettamanti
  2007-01-30 20:02 ` Jan Engelhardt
@ 2007-01-31 23:30 ` Adrian Bunk
  2007-02-01 23:07   ` Luca Tettamanti
  1 sibling, 1 reply; 16+ messages in thread
From: Adrian Bunk @ 2007-01-31 23:30 UTC (permalink / raw)
  To: Luca Tettamanti; +Cc: Peter Osterlund, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 880 bytes --]

On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> Hi,
> pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> is written to the device is lost after umount.
> I rarely use pktcdvd but at some point it used to work on my system.
> 
> This is what I'm doing:
> 
> root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> using device /dev/scd0
> 1029KB internal buffer
> setting write speed to 12x
> Settings for /dev/scd0:
>         Fixed packets, size 32
>         Mode-2 disc
>...

Does 2.6.20-rc7 work?
If no, does it work after applying the attached patch?
If no, does 2.6.19.2 work?

> Luca

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


[-- Attachment #2: patch-pktcdvd --]
[-- Type: text/plain, Size: 12907 bytes --]

diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 6246219..7c95c76 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
  */
 static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
 {
-	request_queue_t *q = bdev_get_queue(pd->bdev);
+	char sense[SCSI_SENSE_BUFFERSIZE];
+	request_queue_t *q;
 	struct request *rq;
-	int ret = 0;
-
-	rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ?
-			     WRITE : READ, __GFP_WAIT);
-
-	if (cgc->buflen) {
-		if (blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen, __GFP_WAIT))
-			goto out;
-	}
+	DECLARE_COMPLETION_ONSTACK(wait);
+	int err = 0;
 
-	rq->cmd_len = COMMAND_SIZE(rq->cmd[0]);
-	memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
-	if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
-		memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
+	q = bdev_get_queue(pd->bdev);
 
+	rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ? WRITE : READ,
+			     __GFP_WAIT);
+	rq->errors = 0;
+	rq->rq_disk = pd->bdev->bd_disk;
+	rq->bio = NULL;
+	rq->buffer = NULL;
 	rq->timeout = 60*HZ;
+	rq->data = cgc->buffer;
+	rq->data_len = cgc->buflen;
+	rq->sense = sense;
+	memset(sense, 0, sizeof(sense));
+	rq->sense_len = 0;
 	rq->cmd_type = REQ_TYPE_BLOCK_PC;
 	rq->cmd_flags |= REQ_HARDBARRIER;
 	if (cgc->quiet)
 		rq->cmd_flags |= REQ_QUIET;
+	memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
+	if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
+		memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
+	rq->cmd_len = COMMAND_SIZE(rq->cmd[0]);
+
+	rq->ref_count++;
+	rq->end_io_data = &wait;
+	rq->end_io = blk_end_sync_rq;
+	elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 1);
+	generic_unplug_device(q);
+	wait_for_completion(&wait);
+
+	if (rq->errors)
+		err = -EIO;
 
-	blk_execute_rq(rq->q, pd->bdev->bd_disk, rq, 0);
-	ret = rq->errors;
-out:
 	blk_put_request(rq);
-	return ret;
+	return err;
 }
 
 /*
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index f02f48a..6fe1e82 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -998,14 +998,25 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
 	int		   count;
 
 	/*
-	 * We used to not use scatter-gather for single segment request,
+	 * if this is a rq->data based REQ_BLOCK_PC, setup for a non-sg xfer
+	 */
+	if (blk_pc_request(req) && !req->bio) {
+		cmd->request_bufflen = req->data_len;
+		cmd->request_buffer = req->data;
+		req->buffer = req->data;
+		cmd->use_sg = 0;
+		return 0;
+	}
+
+	/*
+	 * we used to not use scatter-gather for single segment request,
 	 * but now we do (it makes highmem I/O easier to support without
 	 * kmapping pages)
 	 */
 	cmd->use_sg = req->nr_phys_segments;
 
 	/*
-	 * If sg table allocation fails, requeue request later.
+	 * if sg table allocation fails, requeue request later.
 	 */
 	sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
 	if (unlikely(!sgpnt)) {
@@ -1013,21 +1024,24 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
 		return BLKPREP_DEFER;
 	}
 
-	req->buffer = NULL;
 	cmd->request_buffer = (char *) sgpnt;
+	cmd->request_bufflen = req->nr_sectors << 9;
 	if (blk_pc_request(req))
 		cmd->request_bufflen = req->data_len;
-	else
-		cmd->request_bufflen = req->nr_sectors << 9;
+	req->buffer = NULL;
 
 	/* 
 	 * Next, walk the list, and fill in the addresses and sizes of
 	 * each segment.
 	 */
 	count = blk_rq_map_sg(req->q, req, cmd->request_buffer);
+
+	/*
+	 * mapped well, send it off
+	 */
 	if (likely(count <= cmd->use_sg)) {
 		cmd->use_sg = count;
-		return BLKPREP_OK;
+		return 0;
 	}
 
 	printk(KERN_ERR "Incorrect number of segments after building list\n");
@@ -1057,27 +1071,6 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk,
 	return -EOPNOTSUPP;
 }
 
-static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
-		struct request *req)
-{
-	struct scsi_cmnd *cmd;
-
-	if (!req->special) {
-		cmd = scsi_get_command(sdev, GFP_ATOMIC);
-		if (unlikely(!cmd))
-			return NULL;
-		req->special = cmd;
-	} else {
-		cmd = req->special;
-	}
-
-	/* pull a tag out of the request if we have one */
-	cmd->tag = req->tag;
-	cmd->request = req;
-
-	return cmd;
-}
-
 static void scsi_blk_pc_done(struct scsi_cmnd *cmd)
 {
 	BUG_ON(!blk_pc_request(cmd->request));
@@ -1090,37 +1083,9 @@ static void scsi_blk_pc_done(struct scsi_cmnd *cmd)
 	scsi_io_completion(cmd, cmd->request_bufflen);
 }
 
-static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
+static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd)
 {
-	struct scsi_cmnd *cmd;
-
-	cmd = scsi_get_cmd_from_req(sdev, req);
-	if (unlikely(!cmd))
-		return BLKPREP_DEFER;
-
-	/*
-	 * BLOCK_PC requests may transfer data, in which case they must
-	 * a bio attached to them.  Or they might contain a SCSI command
-	 * that does not transfer data, in which case they may optionally
-	 * submit a request without an attached bio.
-	 */
-	if (req->bio) {
-		int ret;
-
-		BUG_ON(!req->nr_phys_segments);
-
-		ret = scsi_init_io(cmd);
-		if (unlikely(ret))
-			return ret;
-	} else {
-		BUG_ON(req->data_len);
-		BUG_ON(req->data);
-
-		cmd->request_bufflen = 0;
-		cmd->request_buffer = NULL;
-		cmd->use_sg = 0;
-		req->buffer = NULL;
-	}
+	struct request *req = cmd->request;
 
 	BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
 	memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
@@ -1136,138 +1101,154 @@ static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
 	cmd->allowed = req->retries;
 	cmd->timeout_per_command = req->timeout;
 	cmd->done = scsi_blk_pc_done;
-	return BLKPREP_OK;
-}
-
-/*
- * Setup a REQ_TYPE_FS command.  These are simple read/write request
- * from filesystems that still need to be translated to SCSI CDBs from
- * the ULD.
- */
-static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
-{
-	struct scsi_cmnd *cmd;
-	struct scsi_driver *drv;
-	int ret;
-
-	/*
-	 * Filesystem requests must transfer data.
-	 */
-	BUG_ON(!req->nr_phys_segments);
-
-	cmd = scsi_get_cmd_from_req(sdev, req);
-	if (unlikely(!cmd))
-		return BLKPREP_DEFER;
-
-	ret = scsi_init_io(cmd);
-	if (unlikely(ret))
-		return ret;
-
-	/*
-	 * Initialize the actual SCSI command for this request.
-	 */
-	drv = *(struct scsi_driver **)req->rq_disk->private_data;
-	if (unlikely(!drv->init_command(cmd))) {
-		scsi_release_buffers(cmd);
-		scsi_put_command(cmd);
-		return BLKPREP_KILL;
-	}
-
-	return BLKPREP_OK;
 }
 
 static int scsi_prep_fn(struct request_queue *q, struct request *req)
 {
 	struct scsi_device *sdev = q->queuedata;
-	int ret = BLKPREP_OK;
+	struct scsi_cmnd *cmd;
+	int specials_only = 0;
 
 	/*
-	 * If the device is not in running state we will reject some
-	 * or all commands.
+	 * Just check to see if the device is online.  If it isn't, we
+	 * refuse to process any commands.  The device must be brought
+	 * online before trying any recovery commands
 	 */
+	if (unlikely(!scsi_device_online(sdev))) {
+		sdev_printk(KERN_ERR, sdev,
+			    "rejecting I/O to offline device\n");
+		goto kill;
+	}
 	if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
-		switch (sdev->sdev_state) {
-		case SDEV_OFFLINE:
-			/*
-			 * If the device is offline we refuse to process any
-			 * commands.  The device must be brought online
-			 * before trying any recovery commands.
-			 */
-			sdev_printk(KERN_ERR, sdev,
-				    "rejecting I/O to offline device\n");
-			ret = BLKPREP_KILL;
-			break;
-		case SDEV_DEL:
-			/*
-			 * If the device is fully deleted, we refuse to
-			 * process any commands as well.
-			 */
+		/* OK, we're not in a running state don't prep
+		 * user commands */
+		if (sdev->sdev_state == SDEV_DEL) {
+			/* Device is fully deleted, no commands
+			 * at all allowed down */
 			sdev_printk(KERN_ERR, sdev,
 				    "rejecting I/O to dead device\n");
-			ret = BLKPREP_KILL;
-			break;
-		case SDEV_QUIESCE:
-		case SDEV_BLOCK:
-			/*
-			 * If the devices is blocked we defer normal commands.
-			 */
-			if (!(req->cmd_flags & REQ_PREEMPT))
-				ret = BLKPREP_DEFER;
-			break;
-		default:
-			/*
-			 * For any other not fully online state we only allow
-			 * special commands.  In particular any user initiated
-			 * command is not allowed.
-			 */
-			if (!(req->cmd_flags & REQ_PREEMPT))
-				ret = BLKPREP_KILL;
-			break;
+			goto kill;
 		}
-
-		if (ret != BLKPREP_OK)
-			goto out;
+		/* OK, we only allow special commands (i.e. not
+		 * user initiated ones */
+		specials_only = sdev->sdev_state;
 	}
 
-	switch (req->cmd_type) {
-	case REQ_TYPE_BLOCK_PC:
-		ret = scsi_setup_blk_pc_cmnd(sdev, req);
-		break;
-	case REQ_TYPE_FS:
-		ret = scsi_setup_fs_cmnd(sdev, req);
-		break;
-	default:
+	/*
+	 * Find the actual device driver associated with this command.
+	 * The SPECIAL requests are things like character device or
+	 * ioctls, which did not originate from ll_rw_blk.  Note that
+	 * the special field is also used to indicate the cmd for
+	 * the remainder of a partially fulfilled request that can 
+	 * come up when there is a medium error.  We have to treat
+	 * these two cases differently.  We differentiate by looking
+	 * at request->cmd, as this tells us the real story.
+	 */
+	if (blk_special_request(req) && req->special)
+		cmd = req->special;
+	else if (blk_pc_request(req) || blk_fs_request(req)) {
+		if (unlikely(specials_only) && !(req->cmd_flags & REQ_PREEMPT)){
+			if (specials_only == SDEV_QUIESCE ||
+			    specials_only == SDEV_BLOCK)
+				goto defer;
+			
+			sdev_printk(KERN_ERR, sdev,
+				    "rejecting I/O to device being removed\n");
+			goto kill;
+		}
+			
 		/*
-		 * All other command types are not supported.
-		 *
-		 * Note that these days the SCSI subsystem does not use
-		 * REQ_TYPE_SPECIAL requests anymore.  These are only used
-		 * (directly or via blk_insert_request) by non-SCSI drivers.
+		 * Now try and find a command block that we can use.
 		 */
+		if (!req->special) {
+			cmd = scsi_get_command(sdev, GFP_ATOMIC);
+			if (unlikely(!cmd))
+				goto defer;
+		} else
+			cmd = req->special;
+		
+		/* pull a tag out of the request if we have one */
+		cmd->tag = req->tag;
+	} else {
 		blk_dump_rq_flags(req, "SCSI bad req");
-		ret = BLKPREP_KILL;
-		break;
+		goto kill;
 	}
+	
+	/* note the overloading of req->special.  When the tag
+	 * is active it always means cmd.  If the tag goes
+	 * back for re-queueing, it may be reset */
+	req->special = cmd;
+	cmd->request = req;
+	
+	/*
+	 * FIXME: drop the lock here because the functions below
+	 * expect to be called without the queue lock held.  Also,
+	 * previously, we dequeued the request before dropping the
+	 * lock.  We hope REQ_STARTED prevents anything untoward from
+	 * happening now.
+	 */
+	if (blk_fs_request(req) || blk_pc_request(req)) {
+		int ret;
 
- out:
-	switch (ret) {
-	case BLKPREP_KILL:
-		req->errors = DID_NO_CONNECT << 16;
-		break;
-	case BLKPREP_DEFER:
 		/*
-		 * If we defer, the elv_next_request() returns NULL, but the
-		 * queue must be restarted, so we plug here if no returning
-		 * command will automatically do that.
+		 * This will do a couple of things:
+		 *  1) Fill in the actual SCSI command.
+		 *  2) Fill in any other upper-level specific fields
+		 * (timeout).
+		 *
+		 * If this returns 0, it means that the request failed
+		 * (reading past end of disk, reading offline device,
+		 * etc).   This won't actually talk to the device, but
+		 * some kinds of consistency checking may cause the	
+		 * request to be rejected immediately.
 		 */
-		if (sdev->device_busy == 0)
-			blk_plug_device(q);
-		break;
-	default:
-		req->cmd_flags |= REQ_DONTPREP;
+
+		/* 
+		 * This sets up the scatter-gather table (allocating if
+		 * required).
+		 */
+		ret = scsi_init_io(cmd);
+		switch(ret) {
+			/* For BLKPREP_KILL/DEFER the cmd was released */
+		case BLKPREP_KILL:
+			goto kill;
+		case BLKPREP_DEFER:
+			goto defer;
+		}
+		
+		/*
+		 * Initialize the actual SCSI command for this request.
+		 */
+		if (blk_pc_request(req)) {
+			scsi_setup_blk_pc_cmnd(cmd);
+		} else if (req->rq_disk) {
+			struct scsi_driver *drv;
+
+			drv = *(struct scsi_driver **)req->rq_disk->private_data;
+			if (unlikely(!drv->init_command(cmd))) {
+				scsi_release_buffers(cmd);
+				scsi_put_command(cmd);
+				goto kill;
+			}
+		}
 	}
 
-	return ret;
+	/*
+	 * The request is now prepped, no need to come back here
+	 */
+	req->cmd_flags |= REQ_DONTPREP;
+	return BLKPREP_OK;
+
+ defer:
+	/* If we defer, the elv_next_request() returns NULL, but the
+	 * queue must be restarted, so we plug here if no returning
+	 * command will automatically do that. */
+	if (sdev->device_busy == 0)
+		blk_plug_device(q);
+	return BLKPREP_DEFER;
+ kill:
+	req->errors = DID_NO_CONNECT << 16;
+	return BLKPREP_KILL;
 }
 
 /*

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-31 23:10           ` Adrian Bunk
@ 2007-01-31 23:38             ` Luca Tettamanti
  0 siblings, 0 replies; 16+ messages in thread
From: Luca Tettamanti @ 2007-01-31 23:38 UTC (permalink / raw)
  To: Adrian Bunk
  Cc: Jeff Garzik, Jan Engelhardt, Peter Osterlund, linux-kernel,
	linux-ide, justin, Christoph Hellwig

Hi Adrian,

Il Thu, Feb 01, 2007 at 12:10:13AM +0100, Adrian Bunk ha scritto: 
> On Wed, Jan 31, 2007 at 05:58:19AM -0500, Jeff Garzik wrote:
> > Luca Tettamanti wrote:
> > >Hi Jeff, linux-ide,
> > >I'm having troubles with libata and UDF on RW media. See below.
> > >
> > >Il Tue, Jan 30, 2007 at 09:42:34PM +0100, Jan Engelhardt ha scritto: 
> > >>On Jan 30 2007 21:36, Luca Tettamanti wrote:
> > >>>Il Tue, Jan 30, 2007 at 09:02:20PM +0100, Jan Engelhardt ha scritto: 
> > >>>>On Jan 30 2007 20:53, Luca Tettamanti wrote:
> > >>>>>Hi,
> > >>>>>pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > >>>>Did it work previously?
> > >>>Yup, It used to work but since I rarely use it I don't remember which
> > >>>kernel version worked for me.
> > >>Hm, maybe you can take a guess.
> > >
> > >I can bisect pktcdvd.c if necessary, but it seems that it's innocent.
> > > 
> > >>>>>is written to the device is lost after umount.
> > >>>>>I rarely use pktcdvd but at some point it used to work on my system.
> > >>>>>
> > >>>>>This is what I'm doing:
> > >>>>>
> > >>>>>root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > >>>>>scsi 8:0:0:0: CD-ROM            HL-DT-ST DVDRAM GSA-4167B DL13 PQ: 0 
> > >>>>>ANSI: 5
> > >>>>In case you are using ide-scsi: try without.
> > >>>It's libata jmicron driver. Shall I try the "old" PATA driver on the
> > >>>next reboot?
> > >>If you have lots of CDRs/DVDRs to spare (or a CDRW/DVDRW), every test is
> > >>welcome.
> > >
> > >With the legacy IDE driver it works fine.
> > >The unit is DVD-RAM capable so the firmware should handle random writes
> > >fine; I've tried mounting /dev/scd0 rw *without* pktcdvd and I still
> > >lose files. So I guess it has something to do with libata.
> > >
> > >So to recap, after formatting the disk with UDF:
> > >
> > >* libata
> > >  - mount with pktcdvd: all files are lost upon umount
> > >  - mount scd0 w/out pktcdvd: all files are lost upon umount
> > >  - write the disk with cdrecord: OK
> > >
> > >  pktcdvd reports wrong capacity:
> > >  
> > >  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> > >  pktcdvd: Max. media speed: 4
> > >  pktcdvd: write speed 4x
> > >  pktcdvd: 0kB available on disc
> > >  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', 
> > >  timestamp 2007/01/30 18:18 (103c)
> > >
> > >* legacy IDE driver
> > >  - mount with pktcdvd: OK
> > >  - mount hda w/out pktcdvd: corrupts FS (duh)
> > >  - write the disk with cdrecord: OK
> > >
> > >  pktcdvd reports correct capacity:
> > >  
> > >  pktcdvd: writer pktcdvd0 mapped to hda
> > >  pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
> > >  pktcdvd: Max. media speed: 4
> > >  pktcdvd: write speed 4x
> > >  pktcdvd: 551232kB available on disc
> > >  UDF-fs INFO UDF 0.9.8.1 (2004/29/09) Mounting volume 'LinuxUDF', 
> > >  timestamp 2007/01/30 22:19 (103c)
> > >
> > >The HW is a JMicron controller:
> > >02:00.0 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI 
> > >Controller (rev 02)
> > >02:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI 
> > >Controller (rev 02)
> > 
> > hmmm, definitely interesting behavior.
> > 
> > Would you mind putting this info into a bugzilla.kernel.org report, so 
> > that it is not lost?  This bug will likely go into a heavy ATAPI 
> > debugging session that is coming in a few weeks, but not immediately :/
> 
> Is this related to #7810 (which is caused by Christoph's patches) or is 
> this issue another 2.6.20-rc pktcdvd regression?

To me it looks unrelated to #7810. In my case files are "written" to the
disk but they disappear after umount, I don't get any OOPS (nothing at
all in the log).
I'm not sure it's a regression either. As I said I rarely use pktcdvd,
it's possible that the last time I used it I still had the old
motherboard with VIA IDE controller.

Luca
-- 
Software is like sex; it's better when it's free.
Linus Torvalds

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-01-31 23:30 ` Adrian Bunk
@ 2007-02-01 23:07   ` Luca Tettamanti
  2007-02-02  2:21     ` Andrew Morton
  0 siblings, 1 reply; 16+ messages in thread
From: Luca Tettamanti @ 2007-02-01 23:07 UTC (permalink / raw)
  To: Adrian Bunk; +Cc: Peter Osterlund, linux-kernel

Il Thu, Feb 01, 2007 at 12:30:44AM +0100, Adrian Bunk ha scritto: 
> On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> > Hi,
> > pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > is written to the device is lost after umount.
> > I rarely use pktcdvd but at some point it used to work on my system.
> > 
> > This is what I'm doing:
> > 
> > root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > using device /dev/scd0
> > 1029KB internal buffer
> > setting write speed to 12x
> > Settings for /dev/scd0:
> >         Fixed packets, size 32
> >         Mode-2 disc
> >...
> 
> Does 2.6.20-rc7 work?
> If no, does it work after applying the attached patch?
> If no, does 2.6.19.2 work?

Git current + the following patch works.

> diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> index 6246219..7c95c76 100644
> --- a/drivers/block/pktcdvd.c
> +++ b/drivers/block/pktcdvd.c
> @@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
>   */
>  static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
>  {
> -	request_queue_t *q = bdev_get_queue(pd->bdev);
> +	char sense[SCSI_SENSE_BUFFERSIZE];
> +	request_queue_t *q;
>  	struct request *rq;
> -	int ret = 0;
> -
> -	rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ?
> -			     WRITE : READ, __GFP_WAIT);
> -
> -	if (cgc->buflen) {
> -		if (blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen, __GFP_WAIT))
> -			goto out;
> -	}
> +	DECLARE_COMPLETION_ONSTACK(wait);
> +	int err = 0;
>  
> -	rq->cmd_len = COMMAND_SIZE(rq->cmd[0]);
> -	memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
> -	if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
> -		memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
> +	q = bdev_get_queue(pd->bdev);
>  
> +	rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ? WRITE : READ,
> +			     __GFP_WAIT);
> +	rq->errors = 0;
> +	rq->rq_disk = pd->bdev->bd_disk;
> +	rq->bio = NULL;
> +	rq->buffer = NULL;
>  	rq->timeout = 60*HZ;
> +	rq->data = cgc->buffer;
> +	rq->data_len = cgc->buflen;
> +	rq->sense = sense;
> +	memset(sense, 0, sizeof(sense));
> +	rq->sense_len = 0;
>  	rq->cmd_type = REQ_TYPE_BLOCK_PC;
>  	rq->cmd_flags |= REQ_HARDBARRIER;
>  	if (cgc->quiet)
>  		rq->cmd_flags |= REQ_QUIET;
> +	memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
> +	if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
> +		memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
> +	rq->cmd_len = COMMAND_SIZE(rq->cmd[0]);
> +
> +	rq->ref_count++;
> +	rq->end_io_data = &wait;
> +	rq->end_io = blk_end_sync_rq;
> +	elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 1);
> +	generic_unplug_device(q);
> +	wait_for_completion(&wait);
> +
> +	if (rq->errors)
> +		err = -EIO;
>  
> -	blk_execute_rq(rq->q, pd->bdev->bd_disk, rq, 0);
> -	ret = rq->errors;
> -out:
>  	blk_put_request(rq);
> -	return ret;
> +	return err;
>  }
>  
>  /*
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index f02f48a..6fe1e82 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -998,14 +998,25 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
>  	int		   count;
>  
>  	/*
> -	 * We used to not use scatter-gather for single segment request,
> +	 * if this is a rq->data based REQ_BLOCK_PC, setup for a non-sg xfer
> +	 */
> +	if (blk_pc_request(req) && !req->bio) {
> +		cmd->request_bufflen = req->data_len;
> +		cmd->request_buffer = req->data;
> +		req->buffer = req->data;
> +		cmd->use_sg = 0;
> +		return 0;
> +	}
> +
> +	/*
> +	 * we used to not use scatter-gather for single segment request,
>  	 * but now we do (it makes highmem I/O easier to support without
>  	 * kmapping pages)
>  	 */
>  	cmd->use_sg = req->nr_phys_segments;
>  
>  	/*
> -	 * If sg table allocation fails, requeue request later.
> +	 * if sg table allocation fails, requeue request later.
>  	 */
>  	sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
>  	if (unlikely(!sgpnt)) {
> @@ -1013,21 +1024,24 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
>  		return BLKPREP_DEFER;
>  	}
>  
> -	req->buffer = NULL;
>  	cmd->request_buffer = (char *) sgpnt;
> +	cmd->request_bufflen = req->nr_sectors << 9;
>  	if (blk_pc_request(req))
>  		cmd->request_bufflen = req->data_len;
> -	else
> -		cmd->request_bufflen = req->nr_sectors << 9;
> +	req->buffer = NULL;
>  
>  	/* 
>  	 * Next, walk the list, and fill in the addresses and sizes of
>  	 * each segment.
>  	 */
>  	count = blk_rq_map_sg(req->q, req, cmd->request_buffer);
> +
> +	/*
> +	 * mapped well, send it off
> +	 */
>  	if (likely(count <= cmd->use_sg)) {
>  		cmd->use_sg = count;
> -		return BLKPREP_OK;
> +		return 0;
>  	}
>  
>  	printk(KERN_ERR "Incorrect number of segments after building list\n");
> @@ -1057,27 +1071,6 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk,
>  	return -EOPNOTSUPP;
>  }
>  
> -static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
> -		struct request *req)
> -{
> -	struct scsi_cmnd *cmd;
> -
> -	if (!req->special) {
> -		cmd = scsi_get_command(sdev, GFP_ATOMIC);
> -		if (unlikely(!cmd))
> -			return NULL;
> -		req->special = cmd;
> -	} else {
> -		cmd = req->special;
> -	}
> -
> -	/* pull a tag out of the request if we have one */
> -	cmd->tag = req->tag;
> -	cmd->request = req;
> -
> -	return cmd;
> -}
> -
>  static void scsi_blk_pc_done(struct scsi_cmnd *cmd)
>  {
>  	BUG_ON(!blk_pc_request(cmd->request));
> @@ -1090,37 +1083,9 @@ static void scsi_blk_pc_done(struct scsi_cmnd *cmd)
>  	scsi_io_completion(cmd, cmd->request_bufflen);
>  }
>  
> -static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
> +static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd)
>  {
> -	struct scsi_cmnd *cmd;
> -
> -	cmd = scsi_get_cmd_from_req(sdev, req);
> -	if (unlikely(!cmd))
> -		return BLKPREP_DEFER;
> -
> -	/*
> -	 * BLOCK_PC requests may transfer data, in which case they must
> -	 * a bio attached to them.  Or they might contain a SCSI command
> -	 * that does not transfer data, in which case they may optionally
> -	 * submit a request without an attached bio.
> -	 */
> -	if (req->bio) {
> -		int ret;
> -
> -		BUG_ON(!req->nr_phys_segments);
> -
> -		ret = scsi_init_io(cmd);
> -		if (unlikely(ret))
> -			return ret;
> -	} else {
> -		BUG_ON(req->data_len);
> -		BUG_ON(req->data);
> -
> -		cmd->request_bufflen = 0;
> -		cmd->request_buffer = NULL;
> -		cmd->use_sg = 0;
> -		req->buffer = NULL;
> -	}
> +	struct request *req = cmd->request;
>  
>  	BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
>  	memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
> @@ -1136,138 +1101,154 @@ static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
>  	cmd->allowed = req->retries;
>  	cmd->timeout_per_command = req->timeout;
>  	cmd->done = scsi_blk_pc_done;
> -	return BLKPREP_OK;
> -}
> -
> -/*
> - * Setup a REQ_TYPE_FS command.  These are simple read/write request
> - * from filesystems that still need to be translated to SCSI CDBs from
> - * the ULD.
> - */
> -static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
> -{
> -	struct scsi_cmnd *cmd;
> -	struct scsi_driver *drv;
> -	int ret;
> -
> -	/*
> -	 * Filesystem requests must transfer data.
> -	 */
> -	BUG_ON(!req->nr_phys_segments);
> -
> -	cmd = scsi_get_cmd_from_req(sdev, req);
> -	if (unlikely(!cmd))
> -		return BLKPREP_DEFER;
> -
> -	ret = scsi_init_io(cmd);
> -	if (unlikely(ret))
> -		return ret;
> -
> -	/*
> -	 * Initialize the actual SCSI command for this request.
> -	 */
> -	drv = *(struct scsi_driver **)req->rq_disk->private_data;
> -	if (unlikely(!drv->init_command(cmd))) {
> -		scsi_release_buffers(cmd);
> -		scsi_put_command(cmd);
> -		return BLKPREP_KILL;
> -	}
> -
> -	return BLKPREP_OK;
>  }
>  
>  static int scsi_prep_fn(struct request_queue *q, struct request *req)
>  {
>  	struct scsi_device *sdev = q->queuedata;
> -	int ret = BLKPREP_OK;
> +	struct scsi_cmnd *cmd;
> +	int specials_only = 0;
>  
>  	/*
> -	 * If the device is not in running state we will reject some
> -	 * or all commands.
> +	 * Just check to see if the device is online.  If it isn't, we
> +	 * refuse to process any commands.  The device must be brought
> +	 * online before trying any recovery commands
>  	 */
> +	if (unlikely(!scsi_device_online(sdev))) {
> +		sdev_printk(KERN_ERR, sdev,
> +			    "rejecting I/O to offline device\n");
> +		goto kill;
> +	}
>  	if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
> -		switch (sdev->sdev_state) {
> -		case SDEV_OFFLINE:
> -			/*
> -			 * If the device is offline we refuse to process any
> -			 * commands.  The device must be brought online
> -			 * before trying any recovery commands.
> -			 */
> -			sdev_printk(KERN_ERR, sdev,
> -				    "rejecting I/O to offline device\n");
> -			ret = BLKPREP_KILL;
> -			break;
> -		case SDEV_DEL:
> -			/*
> -			 * If the device is fully deleted, we refuse to
> -			 * process any commands as well.
> -			 */
> +		/* OK, we're not in a running state don't prep
> +		 * user commands */
> +		if (sdev->sdev_state == SDEV_DEL) {
> +			/* Device is fully deleted, no commands
> +			 * at all allowed down */
>  			sdev_printk(KERN_ERR, sdev,
>  				    "rejecting I/O to dead device\n");
> -			ret = BLKPREP_KILL;
> -			break;
> -		case SDEV_QUIESCE:
> -		case SDEV_BLOCK:
> -			/*
> -			 * If the devices is blocked we defer normal commands.
> -			 */
> -			if (!(req->cmd_flags & REQ_PREEMPT))
> -				ret = BLKPREP_DEFER;
> -			break;
> -		default:
> -			/*
> -			 * For any other not fully online state we only allow
> -			 * special commands.  In particular any user initiated
> -			 * command is not allowed.
> -			 */
> -			if (!(req->cmd_flags & REQ_PREEMPT))
> -				ret = BLKPREP_KILL;
> -			break;
> +			goto kill;
>  		}
> -
> -		if (ret != BLKPREP_OK)
> -			goto out;
> +		/* OK, we only allow special commands (i.e. not
> +		 * user initiated ones */
> +		specials_only = sdev->sdev_state;
>  	}
>  
> -	switch (req->cmd_type) {
> -	case REQ_TYPE_BLOCK_PC:
> -		ret = scsi_setup_blk_pc_cmnd(sdev, req);
> -		break;
> -	case REQ_TYPE_FS:
> -		ret = scsi_setup_fs_cmnd(sdev, req);
> -		break;
> -	default:
> +	/*
> +	 * Find the actual device driver associated with this command.
> +	 * The SPECIAL requests are things like character device or
> +	 * ioctls, which did not originate from ll_rw_blk.  Note that
> +	 * the special field is also used to indicate the cmd for
> +	 * the remainder of a partially fulfilled request that can 
> +	 * come up when there is a medium error.  We have to treat
> +	 * these two cases differently.  We differentiate by looking
> +	 * at request->cmd, as this tells us the real story.
> +	 */
> +	if (blk_special_request(req) && req->special)
> +		cmd = req->special;
> +	else if (blk_pc_request(req) || blk_fs_request(req)) {
> +		if (unlikely(specials_only) && !(req->cmd_flags & REQ_PREEMPT)){
> +			if (specials_only == SDEV_QUIESCE ||
> +			    specials_only == SDEV_BLOCK)
> +				goto defer;
> +			
> +			sdev_printk(KERN_ERR, sdev,
> +				    "rejecting I/O to device being removed\n");
> +			goto kill;
> +		}
> +			
>  		/*
> -		 * All other command types are not supported.
> -		 *
> -		 * Note that these days the SCSI subsystem does not use
> -		 * REQ_TYPE_SPECIAL requests anymore.  These are only used
> -		 * (directly or via blk_insert_request) by non-SCSI drivers.
> +		 * Now try and find a command block that we can use.
>  		 */
> +		if (!req->special) {
> +			cmd = scsi_get_command(sdev, GFP_ATOMIC);
> +			if (unlikely(!cmd))
> +				goto defer;
> +		} else
> +			cmd = req->special;
> +		
> +		/* pull a tag out of the request if we have one */
> +		cmd->tag = req->tag;
> +	} else {
>  		blk_dump_rq_flags(req, "SCSI bad req");
> -		ret = BLKPREP_KILL;
> -		break;
> +		goto kill;
>  	}
> +	
> +	/* note the overloading of req->special.  When the tag
> +	 * is active it always means cmd.  If the tag goes
> +	 * back for re-queueing, it may be reset */
> +	req->special = cmd;
> +	cmd->request = req;
> +	
> +	/*
> +	 * FIXME: drop the lock here because the functions below
> +	 * expect to be called without the queue lock held.  Also,
> +	 * previously, we dequeued the request before dropping the
> +	 * lock.  We hope REQ_STARTED prevents anything untoward from
> +	 * happening now.
> +	 */
> +	if (blk_fs_request(req) || blk_pc_request(req)) {
> +		int ret;
>  
> - out:
> -	switch (ret) {
> -	case BLKPREP_KILL:
> -		req->errors = DID_NO_CONNECT << 16;
> -		break;
> -	case BLKPREP_DEFER:
>  		/*
> -		 * If we defer, the elv_next_request() returns NULL, but the
> -		 * queue must be restarted, so we plug here if no returning
> -		 * command will automatically do that.
> +		 * This will do a couple of things:
> +		 *  1) Fill in the actual SCSI command.
> +		 *  2) Fill in any other upper-level specific fields
> +		 * (timeout).
> +		 *
> +		 * If this returns 0, it means that the request failed
> +		 * (reading past end of disk, reading offline device,
> +		 * etc).   This won't actually talk to the device, but
> +		 * some kinds of consistency checking may cause the	
> +		 * request to be rejected immediately.
>  		 */
> -		if (sdev->device_busy == 0)
> -			blk_plug_device(q);
> -		break;
> -	default:
> -		req->cmd_flags |= REQ_DONTPREP;
> +
> +		/* 
> +		 * This sets up the scatter-gather table (allocating if
> +		 * required).
> +		 */
> +		ret = scsi_init_io(cmd);
> +		switch(ret) {
> +			/* For BLKPREP_KILL/DEFER the cmd was released */
> +		case BLKPREP_KILL:
> +			goto kill;
> +		case BLKPREP_DEFER:
> +			goto defer;
> +		}
> +		
> +		/*
> +		 * Initialize the actual SCSI command for this request.
> +		 */
> +		if (blk_pc_request(req)) {
> +			scsi_setup_blk_pc_cmnd(cmd);
> +		} else if (req->rq_disk) {
> +			struct scsi_driver *drv;
> +
> +			drv = *(struct scsi_driver **)req->rq_disk->private_data;
> +			if (unlikely(!drv->init_command(cmd))) {
> +				scsi_release_buffers(cmd);
> +				scsi_put_command(cmd);
> +				goto kill;
> +			}
> +		}
>  	}
>  
> -	return ret;
> +	/*
> +	 * The request is now prepped, no need to come back here
> +	 */
> +	req->cmd_flags |= REQ_DONTPREP;
> +	return BLKPREP_OK;
> +
> + defer:
> +	/* If we defer, the elv_next_request() returns NULL, but the
> +	 * queue must be restarted, so we plug here if no returning
> +	 * command will automatically do that. */
> +	if (sdev->device_busy == 0)
> +		blk_plug_device(q);
> +	return BLKPREP_DEFER;
> + kill:
> +	req->errors = DID_NO_CONNECT << 16;
> +	return BLKPREP_KILL;
>  }
>  
>  /*

Correct capacity is reported:

pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
pktcdvd: Max. media speed: 4
pktcdvd: write speed 4x
pktcdvd: 551232kB available on disc

and writing works fine.
While tracking this bug I've enabled lockdep, which complains when I
create the device (pktsetup ptk0 /dev/scd0); the warning appears also
with vanilla kernel:

pktcdvd: writer pktcdvd0 mapped to sr0

=============================================
[ INFO: possible recursive locking detected ]
2.6.20-rc7 #24
---------------------------------------------
vol_id/5364 is trying to acquire lock:
 (&bdev->bd_mutex){--..}, at: [<b017e587>] do_open+0x64/0x280

but task is already holding lock:
 (&bdev->bd_mutex){--..}, at: [<b017e587>] do_open+0x64/0x280

other info that might help us debug this:
2 locks held by vol_id/5364:
 #0:  (&bdev->bd_mutex){--..}, at: [<b017e587>] do_open+0x64/0x280
 #1:  (&ctl_mutex#2){--..}, at: [<f1a69bfb>] pkt_open+0x1a/0xcaa [pktcdvd]

stack backtrace:
 [<b0136a69>] __lock_acquire+0x11e/0xa09
 [<b02f17e3>] __mutex_unlock_slowpath+0x105/0x127
 [<b0137635>] lock_acquire+0x56/0x6e
 [<b017e587>] do_open+0x64/0x280
 [<b02f1b83>] mutex_lock_nested+0xf8/0x27c
 [<b017e587>] do_open+0x64/0x280
 [<b017e587>] do_open+0x64/0x280
 [<b017a427>] __find_get_block+0x158/0x162
 [<b017e7fe>] __blkdev_get+0x5b/0x66
 [<b017e81b>] blkdev_get+0x12/0x14
 [<f1a69c6e>] pkt_open+0x8d/0xcaa [pktcdvd]
 [<b02f317b>] _spin_unlock+0x25/0x3b
 [<b02f17e3>] __mutex_unlock_slowpath+0x105/0x127
 [<b0136545>] trace_hardirqs_on+0x11e/0x141
 [<b0165486>] do_lookup+0x4f/0x143
 [<b016db3b>] dput+0x2c/0x12c
 [<b016d61f>] __d_lookup+0x6a/0x10b
 [<b0172567>] lookup_mnt+0x10/0x37
 [<b016d61f>] __d_lookup+0x6a/0x10b
 [<b02f317b>] _spin_unlock+0x25/0x3b
 [<b016d6a3>] __d_lookup+0xee/0x10b
 [<b0165486>] do_lookup+0x4f/0x143
 [<b016db3b>] dput+0x2c/0x12c
 [<b0166e9a>] __link_path_walk+0xa13/0xb57
 [<b024a2b5>] kobj_lookup+0x33/0x14d
 [<b017e587>] do_open+0x64/0x280
 [<b02f1ce1>] mutex_lock_nested+0x256/0x27c
 [<b0136364>] mark_held_locks+0x46/0x62
 [<b02f1ce1>] mutex_lock_nested+0x256/0x27c
 [<b02f1ce1>] mutex_lock_nested+0x256/0x27c
 [<b0136545>] trace_hardirqs_on+0x11e/0x141
 [<b02f1cff>] mutex_lock_nested+0x274/0x27c
 [<b017e587>] do_open+0x64/0x280
 [<b017e5b4>] do_open+0x91/0x280
 [<b017e92d>] blkdev_open+0x0/0x4d
 [<b017e952>] blkdev_open+0x25/0x4d
 [<b015ddc8>] __dentry_open+0x101/0x1b9
 [<b015defa>] nameidata_to_filp+0x24/0x33
 [<b015df3b>] do_filp_open+0x32/0x39
 [<b02f317b>] _spin_unlock+0x25/0x3b
 [<b015dcbd>] get_unused_fd+0xb3/0xbd
 [<b015df84>] do_sys_open+0x42/0xc3
 [<b015e03e>] sys_open+0x1c/0x1e
 [<b0102ee4>] syscall_call+0x7/0xb
 =======================
pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
pktcdvd: Max. media speed: 4
pktcdvd: write speed 4x
pktcdvd: 551232kB available on disc

Luca
-- 
The trouble with computers is that they do what you tell them, 
not what you want.
D. Cohen

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-02-01 23:07   ` Luca Tettamanti
@ 2007-02-02  2:21     ` Andrew Morton
  2007-02-02  2:33       ` Adrian Bunk
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Morton @ 2007-02-02  2:21 UTC (permalink / raw)
  To: Luca Tettamanti; +Cc: Adrian Bunk, Peter Osterlund, linux-kernel

On Fri, 2 Feb 2007 00:07:52 +0100 Luca Tettamanti <kronos.it@gmail.com> wrote:

> Il Thu, Feb 01, 2007 at 12:30:44AM +0100, Adrian Bunk ha scritto: 
> > On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> > > Hi,
> > > pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > > is written to the device is lost after umount.
> > > I rarely use pktcdvd but at some point it used to work on my system.
> > > 
> > > This is what I'm doing:
> > > 
> > > root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > > using device /dev/scd0
> > > 1029KB internal buffer
> > > setting write speed to 12x
> > > Settings for /dev/scd0:
> > >         Fixed packets, size 32
> > >         Mode-2 disc
> > >...
> > 
> > Does 2.6.20-rc7 work?
> > If no, does it work after applying the attached patch?
> > If no, does 2.6.19.2 work?
> 
> Git current + the following patch works.
> 
> > diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> > index 6246219..7c95c76 100644
> > --- a/drivers/block/pktcdvd.c
> > +++ b/drivers/block/pktcdvd.c
> > @@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
> >   */
> >  static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
> >  {
> > -	request_queue_t *q = bdev_get_queue(pd->bdev);
> > +	char sense[SCSI_SENSE_BUFFERSIZE];

Where did this patch come from?

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-02-02  2:21     ` Andrew Morton
@ 2007-02-02  2:33       ` Adrian Bunk
  2007-02-02  4:07         ` Andrew Morton
  0 siblings, 1 reply; 16+ messages in thread
From: Adrian Bunk @ 2007-02-02  2:33 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Luca Tettamanti, Peter Osterlund, linux-kernel

On Thu, Feb 01, 2007 at 06:21:47PM -0800, Andrew Morton wrote:
> On Fri, 2 Feb 2007 00:07:52 +0100 Luca Tettamanti <kronos.it@gmail.com> wrote:
> 
> > Il Thu, Feb 01, 2007 at 12:30:44AM +0100, Adrian Bunk ha scritto: 
> > > On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> > > > Hi,
> > > > pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > > > is written to the device is lost after umount.
> > > > I rarely use pktcdvd but at some point it used to work on my system.
> > > > 
> > > > This is what I'm doing:
> > > > 
> > > > root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > > > using device /dev/scd0
> > > > 1029KB internal buffer
> > > > setting write speed to 12x
> > > > Settings for /dev/scd0:
> > > >         Fixed packets, size 32
> > > >         Mode-2 disc
> > > >...
> > > 
> > > Does 2.6.20-rc7 work?
> > > If no, does it work after applying the attached patch?
> > > If no, does 2.6.19.2 work?
> > 
> > Git current + the following patch works.
> > 
> > > diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> > > index 6246219..7c95c76 100644
> > > --- a/drivers/block/pktcdvd.c
> > > +++ b/drivers/block/pktcdvd.c
> > > @@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
> > >   */
> > >  static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
> > >  {
> > > -	request_queue_t *q = bdev_get_queue(pd->bdev);
> > > +	char sense[SCSI_SENSE_BUFFERSIZE];
> 
> Where did this patch come from?

It's a revert of the commits 3b00315799d78f76531b71435fbc2643cd71ae4c 
and 406c9b605cbc45151c03ac9a3f95e9acf050808c

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-02-02  2:33       ` Adrian Bunk
@ 2007-02-02  4:07         ` Andrew Morton
  2007-02-02  5:32           ` Adrian Bunk
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Morton @ 2007-02-02  4:07 UTC (permalink / raw)
  To: Adrian Bunk
  Cc: Andrew Morton, Luca Tettamanti, Peter Osterlund, linux-kernel,
	linux-scsi, Christoph Hellwig

On Fri, 2 Feb 2007 03:33:43 +0100 Adrian Bunk <bunk@stusta.de> wrote:

> On Thu, Feb 01, 2007 at 06:21:47PM -0800, Andrew Morton wrote:
> > On Fri, 2 Feb 2007 00:07:52 +0100 Luca Tettamanti <kronos.it@gmail.com> wrote:
> > 
> > > Il Thu, Feb 01, 2007 at 12:30:44AM +0100, Adrian Bunk ha scritto: 
> > > > On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> > > > > Hi,
> > > > > pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > > > > is written to the device is lost after umount.
> > > > > I rarely use pktcdvd but at some point it used to work on my system.
> > > > > 
> > > > > This is what I'm doing:
> > > > > 
> > > > > root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > > > > using device /dev/scd0
> > > > > 1029KB internal buffer
> > > > > setting write speed to 12x
> > > > > Settings for /dev/scd0:
> > > > >         Fixed packets, size 32
> > > > >         Mode-2 disc
> > > > >...
> > > > 
> > > > Does 2.6.20-rc7 work?
> > > > If no, does it work after applying the attached patch?
> > > > If no, does 2.6.19.2 work?
> > > 
> > > Git current + the following patch works.
> > > 
> > > > diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> > > > index 6246219..7c95c76 100644
> > > > --- a/drivers/block/pktcdvd.c
> > > > +++ b/drivers/block/pktcdvd.c
> > > > @@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
> > > >   */
> > > >  static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
> > > >  {
> > > > -	request_queue_t *q = bdev_get_queue(pd->bdev);
> > > > +	char sense[SCSI_SENSE_BUFFERSIZE];
> > 
> > Where did this patch come from?
> 
> It's a revert of the commits 3b00315799d78f76531b71435fbc2643cd71ae4c 
> and 406c9b605cbc45151c03ac9a3f95e9acf050808c
> 

Oh.  That's

 [SCSI] untangle scsi_prep_fn
and	
 [PATCH] Fix BUG at drivers/scsi/scsi_lib.c:1118 caused by "pktsetup dvd /dev

so this is a post-2.6.18 regression, yes?

do we know why this is happening?

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [2.6.20-rc6] pktcdvd doesn't work
  2007-02-02  4:07         ` Andrew Morton
@ 2007-02-02  5:32           ` Adrian Bunk
  0 siblings, 0 replies; 16+ messages in thread
From: Adrian Bunk @ 2007-02-02  5:32 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Luca Tettamanti, Peter Osterlund, linux-kernel, linux-scsi,
	Christoph Hellwig

On Thu, Feb 01, 2007 at 08:07:12PM -0800, Andrew Morton wrote:
> On Fri, 2 Feb 2007 03:33:43 +0100 Adrian Bunk <bunk@stusta.de> wrote:
> 
> > On Thu, Feb 01, 2007 at 06:21:47PM -0800, Andrew Morton wrote:
> > > On Fri, 2 Feb 2007 00:07:52 +0100 Luca Tettamanti <kronos.it@gmail.com> wrote:
> > > 
> > > > Il Thu, Feb 01, 2007 at 12:30:44AM +0100, Adrian Bunk ha scritto: 
> > > > > On Tue, Jan 30, 2007 at 08:53:19PM +0100, Luca Tettamanti wrote:
> > > > > > Hi,
> > > > > > pktcdvd on kernel 2.6.20-rc6 is not working as expected. Any file that
> > > > > > is written to the device is lost after umount.
> > > > > > I rarely use pktcdvd but at some point it used to work on my system.
> > > > > > 
> > > > > > This is what I'm doing:
> > > > > > 
> > > > > > root@dreamland:/tmp# cdrwtool -d /dev/scd0 -q
> > > > > > using device /dev/scd0
> > > > > > 1029KB internal buffer
> > > > > > setting write speed to 12x
> > > > > > Settings for /dev/scd0:
> > > > > >         Fixed packets, size 32
> > > > > >         Mode-2 disc
> > > > > >...
> > > > > 
> > > > > Does 2.6.20-rc7 work?
> > > > > If no, does it work after applying the attached patch?
> > > > > If no, does 2.6.19.2 work?
> > > > 
> > > > Git current + the following patch works.
> > > > 
> > > > > diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> > > > > index 6246219..7c95c76 100644
> > > > > --- a/drivers/block/pktcdvd.c
> > > > > +++ b/drivers/block/pktcdvd.c
> > > > > @@ -765,34 +765,47 @@ static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio
> > > > >   */
> > > > >  static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
> > > > >  {
> > > > > -	request_queue_t *q = bdev_get_queue(pd->bdev);
> > > > > +	char sense[SCSI_SENSE_BUFFERSIZE];
> > > 
> > > Where did this patch come from?
> > 
> > It's a revert of the commits 3b00315799d78f76531b71435fbc2643cd71ae4c 
> > and 406c9b605cbc45151c03ac9a3f95e9acf050808c
> > 
> 
> Oh.  That's
> 
>  [SCSI] untangle scsi_prep_fn
> and	
>  [PATCH] Fix BUG at drivers/scsi/scsi_lib.c:1118 caused by "pktsetup dvd /dev
> 
> so this is a post-2.6.18 regression, yes?

No, a post-2.6.19 regression.

> do we know why this is happening?

No.

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2007-02-02  5:31 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-01-30 19:53 [2.6.20-rc6] pktcdvd doesn't work Luca Tettamanti
2007-01-30 20:02 ` Jan Engelhardt
2007-01-30 20:36   ` Luca Tettamanti
2007-01-30 20:42     ` Jan Engelhardt
2007-01-30 23:16       ` Luca Tettamanti
2007-01-31 10:58         ` Jeff Garzik
2007-01-31 19:17           ` Fabio Comolli
2007-01-31 19:59           ` Luca
2007-01-31 23:10           ` Adrian Bunk
2007-01-31 23:38             ` Luca Tettamanti
2007-01-31 23:30 ` Adrian Bunk
2007-02-01 23:07   ` Luca Tettamanti
2007-02-02  2:21     ` Andrew Morton
2007-02-02  2:33       ` Adrian Bunk
2007-02-02  4:07         ` Andrew Morton
2007-02-02  5:32           ` Adrian Bunk

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).