Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Pekka Enberg

On 4/4/07, Rene Herman <[EMAIL PROTECTED]> wrote:

Taking forever to reproduce in as far as getting the oops. The thing is
now just locking hard each time. Will keep on trying...


Can you get anything out with sysrq-t? The original oops would be
enough to conclude it's a double-free if it weren't for this:

   if (stuffp->toc) {
  kfree(stuffp->toc);
  stuffp->toc = NULL;
   }

While the code is obviously unsafe, we would have to be interrupted
between the read and the assignment, but you don't even have preempt
enabled! So I don't quite yet see where the concurrency is coming
from.

What you can do here is protect the above sequence with a spinlock,
for example, which might paper-over the double-free enough to get you
running again...

  Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Jens Axboe
On Tue, Apr 03 2007, Pekka J Enberg wrote:
> > mcdx:: close()
> 
> However, we never hit do_mcdx_request(). Jens, do we need to do 
> set_capacity() somewhere? I don't see other cdrom drivers doing it but 
> they could be broken too...

Yeah, that would be appropriate.

-- 
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Rene Herman

On 04/03/2007 08:32 PM, Pekka J Enberg wrote:

Please enable CONFIG_DEBUG_SLAB now and reproduce. It should tell us 
what's going wrong there.


Taking forever to reproduce in as far as getting the oops. The thing is 
now just locking hard each time. Will keep on trying...


Rene.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Pekka J Enberg
On Tue, 3 Apr 2007, Rene Herman wrote:
> That is, the exact same oops the tar test showed which I expect is progress --
> the dd is now in fact doing something :-)

Yes, that's expected. I think we fixed dd now.

On Tue, 3 Apr 2007, Rene Herman wrote:
> When I now switched the monitor to 5va2 itself it was happily generating more
> oopses and supposedly "fixing up recursive faults", while advicing me to
> reboot. 2 seconds later it didn't leave me a choice as it dropped dead :-)

Please enable CONFIG_DEBUG_SLAB now and reproduce. It should tell us 
what's going wrong there.

On Tue, 3 Apr 2007, Rene Herman wrote:
> Just to keep track, I'm now using the patches (minus 03) at:
> 
> http://members.home.nl/rene.herman/mcdx/
> 
> (for lkml: with 03, the machine locks itself hard each and every time without
> information).

Yes, because it is totally broken. So please just drop the patch. AFAICT 
the driver makes the process sleep in mcdex_transfer() until an interrupt 
comes to acknowledge that the I/O has completed but the patch makes the 
code sleep while holding the mutex and once the interrupt comes and tries 
to grab it, the machine will deadlock.

We probably need to fix it somehow but lets see what CONFIG_DEBUG_SLAB 
tells us first. Btw, if anyone has a datasheet for this beast, I would 
like a copy.

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Rene Herman

On 04/03/2007 07:31 PM, Pekka J Enberg wrote:

Oh, well, here goes. Rene, would you be so kind and spin the wheel once 
more? =)


Absolutely!

[EMAIL PROTECTED]:~# dd if=/dev/mcdx0 of=/dev/null

Oops: 0002 [#1]
CPU:0
EIP:0060:[]Not tainted VLI
EFLAGS: 00010082   (2.6.20.4 #11)
EIP is at free_block+0x58/0xcf
eax: 07ff46c6   ebx: c1d5f100   ecx: c1d5f12c   edx: 160010b9
esi: c16414e0   edi: c160c960   ebp: 0001   esp: c1575ef0
ds: 007b   es: 007b   ss: 0068
Process events/0 (pid: 4, ti=c1575000 task=c1577510 task.ti=c1575000)
Stack:  0002 c165fa38 c165fa38 0002 c165fa00  
c1047eb6
     c16414e0 c160c960 c16414e0 c160c960 c14ab540 
0292
   c1047f3a   0292 c14ab544 c154ebc0 c101ec7a 
c154ec14

Call Trace:
 [] drain_array+0x94/0xc3
 [] cache_reap+0x55/0xe9
 [] run_workqueue+0x8f/0x14d
 [] cache_reap+0x0/0xe9
 [] worker_thread+0x122/0x14b
 [] default_wake_function+0x0/0xc
 [] default_wake_function+0x0/0xc
 [] worker_thread+0x0/0x14b
 [] kthread+0x72/0x97
 [] kthread+0x0/0x97
 [] kernel_thread_helper+0x7/0x10
 ===
Code: 05 03 15 4c ab 4a c1 8b 02 f6 c4 40 74 03 8b 52 0c 8b 02 a8 80 75 
04 0f 0b eb fe 8b 5a 1c 8b 44 24 20 8b 53 04 8b 74 87 18 8b 03 <89> 02 
c7 03 00 01 10 00 89 50 04 c7 43 04 00 02 20 00 8b 44 24

EIP: [] free_block+0x58/0xcf SS:ESP 0068:c1575ef0

That is, the exact same oops the tar test showed which I expect is 
progress -- the dd is now in fact doing something :-)


When I now switched the monitor to 5va2 itself it was happily generating 
more oopses and supposedly "fixing up recursive faults", while advicing 
me to reboot. 2 seconds later it didn't leave me a choice as it dropped 
dead :-)


Just to keep track, I'm now using the patches (minus 03) at:

http://members.home.nl/rene.herman/mcdx/

(for lkml: with 03, the machine locks itself hard each and every time 
without information).


Thanks again :)

Rene.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Pekka J Enberg
On Tue, 3 Apr 2007, Rene Herman wrote:
> I believe the "tar" runs has produced something useful now though:
> 
> [EMAIL PROTECTED]:~# dmesg -c >/dev/null
> [EMAIL PROTECTED]:~# strace -o tar.strace tar cvf foo.tar /mnt/cdrom
> tar: Removing leading `/' from member names
> /mnt/cdrom/
> /mnt/cdrom/dott/
> /mnt/cdrom/dott/adlib.ims
> /mnt/cdrom/dott/dott.bat
> /mnt/cdrom/dott/dotticon.ico
> /mnt/cdrom/dott/gmidi.ims
> /mnt/cdrom/dott/maniac/
> rlogin: connection closed.
> [EMAIL PROTECTED]:~$
> 
> When I now switch the monitor to 5va2 directly, there is an oops on the
> screen, with a backtrace saying (manual transcription):
> 
> Call Trace:
>   [] drain_array+0x94/0xc3
>   [   ...] cache_reap+0x55/0xe9
>   [   ...] run_workqueue+0x8f/0x14d
>   [   ...] cache_reap+0x0//0xe9
>   [   ...] worker_thread+0x122/0x14b
>   [   ...] default_wake_function+0x0/0xc
>   [   ...] default_wake_function+0x0/0xc
>   [   ...] worker_thread+0x0/0x14b
>   [   ...] kthread+0x72/0x97
>   [   ...] kthread+0x0/0x97
>   [   ...] kernel_thread_helper+0x7/0x10
>   ===
> Code: [ ... ]
> EIP: [] free_block+0x58/0xcf SS:ESP [ ... ]
> 
> Couple of functions mentioned twice in that backtrace. That looks a
> little off no?

It looks like we are passing a bad pointer to slab. Please turn on 
CONFIG_DEBUG_SLAB and reproduce. It's probably a double-free as the TOC 
reading bits look racy.

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Pekka J Enberg
On Tue, 3 Apr 2007, Pekka J Enberg wrote:
> However, we never hit do_mcdx_request(). Jens, do we need to do 
> set_capacity() somewhere? I don't see other cdrom drivers doing it but 
> they could be broken too...

Oh, well, here goes. Rene, would you be so kind and spin the wheel once 
more? =)

Pekka

diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
index f574962..8ed61c9 100644
--- a/drivers/cdrom/mcdx.c
+++ b/drivers/cdrom/mcdx.c
@@ -672,6 +672,7 @@ static int mcdx_open(struct cdrom_device
if (-1 == mcdx_requesttocdata(stuffp, &stuffp->di, 1)) {
 
stuffp->lastsector = -1;
+   set_capacity(stuffp->disk, 0);
 
} else {
 
@@ -692,6 +693,7 @@ static int mcdx_open(struct cdrom_device
   stuffp->di.msf_leadout.second,
   stuffp->di.msf_leadout.frame,
   msf2log(&stuffp->di.msf_leadout));
+   set_capacity(stuffp->disk, stuffp->lastsector + 1);
}
 
if (stuffp->toc) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Pekka J Enberg
On 04/03/2007 08:57 AM, Pekka J Enberg wrote:
> > Does this change the dd case?
> > 
> > diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
> > index f574962..6c613d0 100644
> > --- a/drivers/cdrom/mcdx.c
> > +++ b/drivers/cdrom/mcdx.c
> > @@ -1248,6 +1248,7 @@ #endif
> >   disk->private_data = stuffp;
> >   disk->queue = mcdx_queue;
> >   add_disk(disk);
> > +   blk_queue_hardsect_size(mcdx_queue, MCDX_CDBLK);
> >   printk(msg);
> >   return 0;
> >  }

On Tue, 3 Apr 2007, Rene Herman wrote:
> No, I'm afraid not. It's still the same effect:
> 
> [EMAIL PROTECTED]:~# dmesg -c >/dev/null
> [EMAIL PROTECTED]:~# strace -o dd.strace dd if=/dev/mcdx0 of=/dev/null
> 0+0 records in
> 0+0 records out
> 0 bytes (0 B) copied, 0.00438956 seconds, 0.0 kB/s
> [EMAIL PROTECTED]:~# dmesg >dd.xtrace

Looking at the dd strace:

> close(0)= 0
> open("/dev/mcdx0", O_RDONLY|O_LARGEFILE) = 0
> _llseek(0, 0, [0], SEEK_CUR)= 0

The block device is open, dd has the current offset.

> close(1)= 0
> open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 1

[snip]

> read(0, "", 512)= 0

We start to read but get nothing!

> close(0)= 0
> close(1)= 0

Now looking at the driver debug trace:

> mcdx open() Single Session disk found
> mcdx mcdx_media_changed called for device mcdx0
> mcdx:: talk() 1 / 5000 tries, res.size 1, command 0x40<7>mcdx:: 

We do mcdx_getstatus() here...

> mcdx:: talk() command sent
> mcdx:: *** delay: sleepq
> mcdx:: delay awoken
> mcdx:: *** delay: sleepq
> mcdx:: delay awoken
> mcdx:: talk() got status 0x50
> mcdx:: talk() done with 0x50

...and the status bits seem to be MCDX_RBIT_CHECK and MCDX_RBIT_CHECK.

> mcdx:: close()

However, we never hit do_mcdx_request(). Jens, do we need to do 
set_capacity() somewhere? I don't see other cdrom drivers doing it but 
they could be broken too...

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-03 Thread Rene Herman

On 04/03/2007 08:57 AM, Pekka J Enberg wrote:

[ re-including linux-kernel ]


Does this change the dd case?

diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
index f574962..6c613d0 100644
--- a/drivers/cdrom/mcdx.c
+++ b/drivers/cdrom/mcdx.c
@@ -1248,6 +1248,7 @@ #endif
disk->private_data = stuffp;
disk->queue = mcdx_queue;
add_disk(disk);
+   blk_queue_hardsect_size(mcdx_queue, MCDX_CDBLK);
printk(msg);
return 0;
 }


No, I'm afraid not. It's still the same effect:

[EMAIL PROTECTED]:~# dmesg -c >/dev/null
[EMAIL PROTECTED]:~# strace -o dd.strace dd if=/dev/mcdx0 of=/dev/null
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00438956 seconds, 0.0 kB/s
[EMAIL PROTECTED]:~# dmesg >dd.xtrace

dd.strace again attached. I've dropped the mutex patch for now and now
the xtrace is littered with waitqueue debugging. I'll see if I can
disable that particular debugging trace I guess. dd.xtrace sent privately...

"readcd dev=/dev/mcdx0 f=foo.img" is still an immediate hard lockup also
without the mutex. I believe the "tar" runs has produced something
useful now though:

[EMAIL PROTECTED]:~# dmesg -c >/dev/null
[EMAIL PROTECTED]:~# strace -o tar.strace tar cvf foo.tar /mnt/cdrom
tar: Removing leading `/' from member names
/mnt/cdrom/
/mnt/cdrom/dott/
/mnt/cdrom/dott/adlib.ims
/mnt/cdrom/dott/dott.bat
/mnt/cdrom/dott/dotticon.ico
/mnt/cdrom/dott/gmidi.ims
/mnt/cdrom/dott/maniac/
rlogin: connection closed.
[EMAIL PROTECTED]:~$

When I now switch the monitor to 5va2 directly, there is an oops on the
screen, with a backtrace saying (manual transcription):

Call Trace:
  [] drain_array+0x94/0xc3
  [   ...] cache_reap+0x55/0xe9
  [   ...] run_workqueue+0x8f/0x14d
  [   ...] cache_reap+0x0//0xe9
  [   ...] worker_thread+0x122/0x14b
  [   ...] default_wake_function+0x0/0xc
  [   ...] default_wake_function+0x0/0xc
  [   ...] worker_thread+0x0/0x14b
  [   ...] kthread+0x72/0x97
  [   ...] kthread+0x0/0x97
  [   ...] kernel_thread_helper+0x7/0x10
  ===
Code: [ ... ]
EIP: [] free_block+0x58/0xcf SS:ESP [ ... ]

Couple of functions mentioned twice in that backtrace. That looks a
little off no?

"tar.strace" made it to disk, so it's attached as well.

Rene.

execve("/bin/dd", ["dd", "if=/dev/mcdx0", "of=/dev/null"], [/* 28 vars */]) = 0
uname({sys="Linux", node="5va2", ...})  = 0
brk(0)  = 0x8052000
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)  = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=47774, ...}) = 0
mmap2(NULL, 47774, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fb3000
close(3)= 0
open("/lib/tls/librt.so.1", O_RDONLY)   = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=34763, ...}) = 0
mmap2(NULL, 29260, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7fab000
mmap2(0xb7fb1000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7fb1000
close(3)= 0
open("/lib/tls/libc.so.6", O_RDONLY)= 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20O\1\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1441201, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0xb7faa000
mmap2(NULL, 1240284, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7e7b000
mmap2(0xb7fa4000, 16384, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x128) = 0xb7fa4000
mmap2(0xb7fa8000, 7388, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fa8000
close(3)= 0
open("/lib/tls/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20H\0\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=88005, ...}) = 0
mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7e69000
mmap2(0xb7e77000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd) = 0xb7e77000
mmap2(0xb7e79000, 4568, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e79000
close(3)= 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0xb7e68000
mprotect(0xb7fa4000, 4096, PROT_READ)   = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e686c0, limit:1048575, 
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, 
useable:1}) = 0
munmap(0xb7fb3000, 47774)   = 0
set_tid_address(0xb7e68708) = 1173
rt_sigaction(SIGRTMIN, {0xb7e6d3a0, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0xb7e6d420, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
_

Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Rene Herman

On 04/02/2007 11:42 AM, Jens Axboe wrote:

I somehow doubt that the cards are capable of highmem addressing in 
the first place :-)


Well, we could pretend we're using 286s and define the 15-16 MB hole as 
"highmem". But other than that, these things plug into an ISA bus, so 
no. Most of them are strictly PIO anyway in fact...


Rene.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Rene Herman

On 04/02/2007 05:18 PM, Rene Herman wrote:


Thanks again, spinning!


Oh, forgot to mention. Yes, earlier PREEMPT was on and it's now disabled.

Rene.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Rene Herman

On 04/02/2007 09:10 AM, Jens Axboe wrote:


Updated patch attached :-)

diff --git a/Documentation/feature-removal-schedule.txt 
b/Documentation/feature-removal-schedule.txt
index 0bc8b0b..cff761a 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -324,3 +324,10 @@ Why:   the i8xx_tco watchdog driver has been replaced 
by the iTCO_wdt
 Who:   Wim Van Sebroeck <[EMAIL PROTECTED]>
 
 ---

+
+What:  The legacy CDROM drivers (drivers/cdrom/, except cdrom.c)
+When:  In 2.6.23


Not going to complain about it loudly. I like playing with these old 
drives, but the drivers are so immensely broken that they don't seem to 
serve a very useful purpose anymore; even if I, or someone else, would 
ever get around to try and revive this hardware under Linux; the current 
state of these drivers seems to imply we'd be better of starting from 
scratch.


And even more so since I expect that any new attempts should do the "no 
really, I'm a scsi drive" thing that most anything else is doing these 
days. Using a different infrastructure like that would, I presume, mean 
that really only the hardware details would remain useful from the old 
drivers, and those will be present inside linux-2.6.22.tar.gz same as 
before.


Having said that, it would still be good to have mcdx functional so 
please don't let me keep you, Pekka, or anyone else from looking :-)


With a bit of luck sbpcd and cdu31a (and cm206 as the other controller 
that I have) will be similarly broken and having an example in mcdx will 
be useful whatever happens to the drivers in the upstream tree...



+Why:   They are all terminally broken (most don't even compile)


That's not true though... I just checked and they all compile on 
2.6.20.4. sbpcd and cm206 with cli/sti warnings, the others without even.


Rene.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Rene Herman

On 04/02/2007 10:55 AM, Pekka J Enberg wrote:


On Mon, 2 Apr 2007, Jens Axboe wrote:


But as I wrote earlier, it'll take lots more to make this driver close 
to functional.


Heh, looking at the driver, that's quite an understatement =). Rene, 
here's an untested attempt to use a mutex instead of the horribly broken 
waitqueue "synchronization" in mcdx. It may or may not help so give it a 
spin if you want.


Thanks again, spinning! I've split up the patch into its history and am 
now using the three available at:


http://members.home.nl/rene.herman/mcdx/

against 2.6.20.4. The mutex does change things but not so much for the 
better unfortunately. With this, I'm still able to do:


[EMAIL PROTECTED]:~# strace -o dd.strace dd if=/dev/mcdx0 of=foo.img

with the same result:

[EMAIL PROTECTED]:~# strace -o dd.strace dd if=/dev/mcdx0 of=foo.img
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00202698 seconds, 0.0 kB/s

(dd.strace attached) but the readcd and tar tests:

[EMAIL PROTECTED]:~# strace -o readcd.strace readcd dev=/dev/mcdx0 f=foo.img
[EMAIL PROTECTED]:~# strace -o tar.strace tar cvf foo.tar /mnt/cdrom

now lock up the machine hard each time; no pings replies, no nothing.

Using f=/dev/null with readcd does not change things. Using /dev/null 
with tar _does_ but tar seems to notice it's writing to /dev/null and 
"optimizes" the actual reading away so that's no surprise.


Thanks again! Still love inserting CDs in this thing, so I'll happily 
keep on testing... :-)


Rene.
execve("/bin/dd", ["dd", "if=/dev/mcdx0", "of=foo.img"], [/* 28 vars */]) = 0
uname({sys="Linux", node="5va2", ...})  = 0
brk(0)  = 0x8052000
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)  = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=47774, ...}) = 0
mmap2(NULL, 47774, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f8d000
close(3)= 0
open("/lib/tls/librt.so.1", O_RDONLY)   = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=34763, ...}) = 0
mmap2(NULL, 29260, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7f85000
mmap2(0xb7f8b000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7f8b000
close(3)= 0
open("/lib/tls/libc.so.6", O_RDONLY)= 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20O\1\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1441201, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0xb7f84000
mmap2(NULL, 1240284, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7e55000
mmap2(0xb7f7e000, 16384, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x128) = 0xb7f7e000
mmap2(0xb7f82000, 7388, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f82000
close(3)= 0
open("/lib/tls/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20H\0\000"..., 512) = 
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=88005, ...}) = 0
mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0xb7e43000
mmap2(0xb7e51000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd) = 0xb7e51000
mmap2(0xb7e53000, 4568, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e53000
close(3)= 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0xb7e42000
mprotect(0xb7f7e000, 4096, PROT_READ)   = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e426c0, limit:1048575, 
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, 
useable:1}) = 0
munmap(0xb7f8d000, 47774)   = 0
set_tid_address(0xb7e42708) = 1177
rt_sigaction(SIGRTMIN, {0xb7e473a0, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0xb7e47420, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
_sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbf93cd5c, 32, (nil), 0}) = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No 
such file or directory)
brk(0)  = 0x8052000
brk(0x8073000)  = 0x8073000
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2586, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0xb7f98000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2586
read(3, "", 4096)   = 0
close(3)= 0
munmap(0xb7f98000, 4096)= 0
open("/usr/lib/locale/en_US/LC_IDENTIFICATION", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=378, .

Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Boaz Harrosh
Pekka J Enberg wrote:
> On Mon, 2 Apr 2007, Jens Axboe wrote:
>> But as I wrote earlier, it'll take lots more to make this driver close 
>> to functional.
> 
> Heh, looking at the driver, that's quite an understatement =). Rene, 
> here's an untested attempt to use a mutex instead of the horribly broken 
> waitqueue "synchronization" in mcdx. It may or may not help so give it a 
> spin if you want.
> 
>   Pekka
> 
> ---
>  drivers/cdrom/mcdx.c |  121 
> ++-
>  1 file changed, 44 insertions(+), 77 deletions(-)
> 
> Index: 2.6/drivers/cdrom/mcdx.c
> ===
> --- 2.6.orig/drivers/cdrom/mcdx.c 2007-04-02 11:50:40.0 +0300
> +++ 2.6/drivers/cdrom/mcdx.c  2007-04-02 11:51:20.0 +0300
> @@ -58,6 +58,7 @@ = "$Id: mcdx.c,v 1.21 1997/01/26 07:
>  
>  #include 
>  
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -151,15 +152,14 @@ struct s_version {
>  /* Per drive/controller stuff **/
>  
>  struct s_drive_stuff {
> + struct mutex mutex;
> +
>   /* waitqueues */
>   wait_queue_head_t busyq;
> - wait_queue_head_t lockq;
> - wait_queue_head_t sleepq;
>  
>   /* flags */
>   volatile int introk;/* status of last irq operation */
>   volatile int busy;  /* drive performs an operation */
> - volatile int lock;  /* exclusive usage */
>  
>   /* cd infos */
>   struct s_diskinfo di;
> @@ -266,7 +266,6 @@ static unsigned int uint2bcd(unsigned in
>  static unsigned int bcd2uint(unsigned char);
>  static unsigned port(int *);
>  static int irq(int *);
> -static void mcdx_delay(struct s_drive_stuff *, long jifs);
>  static int mcdx_transfer(struct s_drive_stuff *, char *buf, int sector,
>int nr_sectors);
>  static int mcdx_xfer(struct s_drive_stuff *, char *buf, int sector,
> @@ -287,7 +286,7 @@ static int mcdx_requestmultidiskinfo(str
>  static int mcdx_requesttocdata(struct s_drive_stuff *, struct s_diskinfo *,
>  int);
>  static int mcdx_getstatus(struct s_drive_stuff *, int);
> -static int mcdx_getval(struct s_drive_stuff *, int to, int delay, char *);
> +static int mcdx_getval(struct s_drive_stuff *, int to, int delay_sec, char 
> *);
>  static int mcdx_talk(struct s_drive_stuff *,
>const unsigned char *cmd, size_t,
>void *buffer, size_t size, unsigned int timeout, int);
> @@ -577,56 +576,57 @@ static void do_mcdx_request(request_queu
>   if (!req)
>   return;
>  
> + if (!blk_fs_request(req)) {
> + end_request(req, 0);
> + goto again;
> + }
> +
>   stuffp = req->rq_disk->private_data;
>  
>   if (!stuffp->present) {
>   xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name);
>   xtrace(REQUEST, "end_request(0): bad device\n");
>   end_request(req, 0);
> - return;
> + goto again;
>   }
>  
>   if (stuffp->audio) {
>   xwarn("do_request() attempt to read from audio cd\n");
>   xtrace(REQUEST, "end_request(0): read from audio\n");
>   end_request(req, 0);
> - return;
> + goto again;
>   }
>  
>   xtrace(REQUEST, "do_request() (%lu + %lu)\n",
>  req->sector, req->nr_sectors);
>  
> - if (req->cmd != READ) {
> + if (rq_data_dir(req) != READ) {
>   xwarn("do_request(): non-read command to cd!!\n");
>   xtrace(REQUEST, "end_request(0): write\n");
>   end_request(req, 0);
> - return;
> - }
> - else {
> - stuffp->status = 0;
> - while (req->nr_sectors) {
> - int i;
> -
> - i = mcdx_transfer(stuffp,
> -   req->buffer,
> -   req->sector,
> -   req->nr_sectors);
> -
> - if (i == -1) {
> - end_request(req, 0);
> - goto again;
> - }
> - req->sector += i;
> - req->nr_sectors -= i;
> - req->buffer += (i * 512);
> - }
> - end_request(req, 1);
>   goto again;
> -
> - xtrace(REQUEST, "end_request(1)\n");
> - end_request(req, 1);
>   }
>  
> + stuffp->status = 0;
> + while (req->nr_sectors) {
> + int i;
> +
> + spin_unlock_irq(q->queue_lock);
> + i = mcdx_transfer(stuffp,
> +   req->buffer,
> +   req->sector,
> +   req->nr_sectors);
> + spin_lock_irq(q->queue_lock);
> +
> + if (i == -1) {
> +  

Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Jens Axboe
On Mon, Apr 02 2007, Boaz Harrosh wrote:
> Pekka J Enberg wrote:
> > On Mon, 2 Apr 2007, Jens Axboe wrote:
> >> But as I wrote earlier, it'll take lots more to make this driver close 
> >> to functional.
> > 
> > Heh, looking at the driver, that's quite an understatement =). Rene, 
> > here's an untested attempt to use a mutex instead of the horribly broken 
> > waitqueue "synchronization" in mcdx. It may or may not help so give it a 
> > spin if you want.
> > 
> > Pekka
> > 
> > ---
> >  drivers/cdrom/mcdx.c |  121 
> > ++-
> >  1 file changed, 44 insertions(+), 77 deletions(-)
> > 
> > Index: 2.6/drivers/cdrom/mcdx.c
> > ===
> > --- 2.6.orig/drivers/cdrom/mcdx.c   2007-04-02 11:50:40.0 +0300
> > +++ 2.6/drivers/cdrom/mcdx.c2007-04-02 11:51:20.0 +0300
> > @@ -58,6 +58,7 @@ = "$Id: mcdx.c,v 1.21 1997/01/26 07:
> >  
> >  #include 
> >  
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -151,15 +152,14 @@ struct s_version {
> >  /* Per drive/controller stuff **/
> >  
> >  struct s_drive_stuff {
> > +   struct mutex mutex;
> > +
> > /* waitqueues */
> > wait_queue_head_t busyq;
> > -   wait_queue_head_t lockq;
> > -   wait_queue_head_t sleepq;
> >  
> > /* flags */
> > volatile int introk;/* status of last irq operation */
> > volatile int busy;  /* drive performs an operation */
> > -   volatile int lock;  /* exclusive usage */
> >  
> > /* cd infos */
> > struct s_diskinfo di;
> > @@ -266,7 +266,6 @@ static unsigned int uint2bcd(unsigned in
> >  static unsigned int bcd2uint(unsigned char);
> >  static unsigned port(int *);
> >  static int irq(int *);
> > -static void mcdx_delay(struct s_drive_stuff *, long jifs);
> >  static int mcdx_transfer(struct s_drive_stuff *, char *buf, int sector,
> >  int nr_sectors);
> >  static int mcdx_xfer(struct s_drive_stuff *, char *buf, int sector,
> > @@ -287,7 +286,7 @@ static int mcdx_requestmultidiskinfo(str
> >  static int mcdx_requesttocdata(struct s_drive_stuff *, struct s_diskinfo *,
> >int);
> >  static int mcdx_getstatus(struct s_drive_stuff *, int);
> > -static int mcdx_getval(struct s_drive_stuff *, int to, int delay, char *);
> > +static int mcdx_getval(struct s_drive_stuff *, int to, int delay_sec, char 
> > *);
> >  static int mcdx_talk(struct s_drive_stuff *,
> >  const unsigned char *cmd, size_t,
> >  void *buffer, size_t size, unsigned int timeout, int);
> > @@ -577,56 +576,57 @@ static void do_mcdx_request(request_queu
> > if (!req)
> > return;
> >  
> > +   if (!blk_fs_request(req)) {
> > +   end_request(req, 0);
> > +   goto again;
> > +   }
> > +
> > stuffp = req->rq_disk->private_data;
> >  
> > if (!stuffp->present) {
> > xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name);
> > xtrace(REQUEST, "end_request(0): bad device\n");
> > end_request(req, 0);
> > -   return;
> > +   goto again;
> > }
> >  
> > if (stuffp->audio) {
> > xwarn("do_request() attempt to read from audio cd\n");
> > xtrace(REQUEST, "end_request(0): read from audio\n");
> > end_request(req, 0);
> > -   return;
> > +   goto again;
> > }
> >  
> > xtrace(REQUEST, "do_request() (%lu + %lu)\n",
> >req->sector, req->nr_sectors);
> >  
> > -   if (req->cmd != READ) {
> > +   if (rq_data_dir(req) != READ) {
> > xwarn("do_request(): non-read command to cd!!\n");
> > xtrace(REQUEST, "end_request(0): write\n");
> > end_request(req, 0);
> > -   return;
> > -   }
> > -   else {
> > -   stuffp->status = 0;
> > -   while (req->nr_sectors) {
> > -   int i;
> > -
> > -   i = mcdx_transfer(stuffp,
> > - req->buffer,
> > - req->sector,
> > - req->nr_sectors);
> > -
> > -   if (i == -1) {
> > -   end_request(req, 0);
> > -   goto again;
> > -   }
> > -   req->sector += i;
> > -   req->nr_sectors -= i;
> > -   req->buffer += (i * 512);
> > -   }
> > -   end_request(req, 1);
> > goto again;
> > -
> > -   xtrace(REQUEST, "end_request(1)\n");
> > -   end_request(req, 1);
> > }
> >  
> > +   stuffp->status = 0;
> > +   while (req->nr_sectors) {
> > +   int i;
> > +
> > +   spin_unlock_irq(q->queue_lock);
> > +   i = mcdx_transfer(stuffp,
> > + req->buffer,
> > + 

Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Pekka J Enberg
On Mon, 2 Apr 2007, Boaz Harrosh wrote:
> Why are you using req->buffer in new code.

You did read the patch, right? It's not new code. Feel free to send a 
patch, though. Thanks.

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Pekka J Enberg
On Mon, 2 Apr 2007, Jens Axboe wrote:
> But as I wrote earlier, it'll take lots more to make this driver close 
> to functional.

Heh, looking at the driver, that's quite an understatement =). Rene, 
here's an untested attempt to use a mutex instead of the horribly broken 
waitqueue "synchronization" in mcdx. It may or may not help so give it a 
spin if you want.

Pekka

---
 drivers/cdrom/mcdx.c |  121 ++-
 1 file changed, 44 insertions(+), 77 deletions(-)

Index: 2.6/drivers/cdrom/mcdx.c
===
--- 2.6.orig/drivers/cdrom/mcdx.c   2007-04-02 11:50:40.0 +0300
+++ 2.6/drivers/cdrom/mcdx.c2007-04-02 11:51:20.0 +0300
@@ -58,6 +58,7 @@ = "$Id: mcdx.c,v 1.21 1997/01/26 07:
 
 #include 
 
+#include 
 #include 
 #include 
 #include 
@@ -151,15 +152,14 @@ struct s_version {
 /* Per drive/controller stuff **/
 
 struct s_drive_stuff {
+   struct mutex mutex;
+
/* waitqueues */
wait_queue_head_t busyq;
-   wait_queue_head_t lockq;
-   wait_queue_head_t sleepq;
 
/* flags */
volatile int introk;/* status of last irq operation */
volatile int busy;  /* drive performs an operation */
-   volatile int lock;  /* exclusive usage */
 
/* cd infos */
struct s_diskinfo di;
@@ -266,7 +266,6 @@ static unsigned int uint2bcd(unsigned in
 static unsigned int bcd2uint(unsigned char);
 static unsigned port(int *);
 static int irq(int *);
-static void mcdx_delay(struct s_drive_stuff *, long jifs);
 static int mcdx_transfer(struct s_drive_stuff *, char *buf, int sector,
 int nr_sectors);
 static int mcdx_xfer(struct s_drive_stuff *, char *buf, int sector,
@@ -287,7 +286,7 @@ static int mcdx_requestmultidiskinfo(str
 static int mcdx_requesttocdata(struct s_drive_stuff *, struct s_diskinfo *,
   int);
 static int mcdx_getstatus(struct s_drive_stuff *, int);
-static int mcdx_getval(struct s_drive_stuff *, int to, int delay, char *);
+static int mcdx_getval(struct s_drive_stuff *, int to, int delay_sec, char *);
 static int mcdx_talk(struct s_drive_stuff *,
 const unsigned char *cmd, size_t,
 void *buffer, size_t size, unsigned int timeout, int);
@@ -577,56 +576,57 @@ static void do_mcdx_request(request_queu
if (!req)
return;
 
+   if (!blk_fs_request(req)) {
+   end_request(req, 0);
+   goto again;
+   }
+
stuffp = req->rq_disk->private_data;
 
if (!stuffp->present) {
xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name);
xtrace(REQUEST, "end_request(0): bad device\n");
end_request(req, 0);
-   return;
+   goto again;
}
 
if (stuffp->audio) {
xwarn("do_request() attempt to read from audio cd\n");
xtrace(REQUEST, "end_request(0): read from audio\n");
end_request(req, 0);
-   return;
+   goto again;
}
 
xtrace(REQUEST, "do_request() (%lu + %lu)\n",
   req->sector, req->nr_sectors);
 
-   if (req->cmd != READ) {
+   if (rq_data_dir(req) != READ) {
xwarn("do_request(): non-read command to cd!!\n");
xtrace(REQUEST, "end_request(0): write\n");
end_request(req, 0);
-   return;
-   }
-   else {
-   stuffp->status = 0;
-   while (req->nr_sectors) {
-   int i;
-
-   i = mcdx_transfer(stuffp,
- req->buffer,
- req->sector,
- req->nr_sectors);
-
-   if (i == -1) {
-   end_request(req, 0);
-   goto again;
-   }
-   req->sector += i;
-   req->nr_sectors -= i;
-   req->buffer += (i * 512);
-   }
-   end_request(req, 1);
goto again;
-
-   xtrace(REQUEST, "end_request(1)\n");
-   end_request(req, 1);
}
 
+   stuffp->status = 0;
+   while (req->nr_sectors) {
+   int i;
+
+   spin_unlock_irq(q->queue_lock);
+   i = mcdx_transfer(stuffp,
+ req->buffer,
+ req->sector,
+ req->nr_sectors);
+   spin_lock_irq(q->queue_lock);
+
+   if (i == -1) {
+   end_request(req, 0);
+   goto again;
+   }
+   req->sector += i;
+   

Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Pekka J Enberg
On Mon, 2 Apr 2007, Jens Axboe wrote:
> Updated patch attached :-)
> 
> diff --git a/Documentation/feature-removal-schedule.txt 
> b/Documentation/feature-removal-schedule.txt
> index 0bc8b0b..cff761a 100644
> --- a/Documentation/feature-removal-schedule.txt
> +++ b/Documentation/feature-removal-schedule.txt
> @@ -324,3 +324,10 @@ Why: the i8xx_tco watchdog driver has been replaced 
> by the iTCO_wdt
>  Who: Wim Van Sebroeck <[EMAIL PROTECTED]>
>  
>  ---
> +
> +What:The legacy CDROM drivers (drivers/cdrom/, except cdrom.c)
> +When:In 2.6.23
> +Why: They are all terminally broken (most don't even compile)
> +Who: Jens Axboe <[EMAIL PROTECTED]>
> +
> +---

I am certainly ok with that. But until then, update patch below =)

Pekka

diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
index f574962..a1e4297 100644
--- a/drivers/cdrom/mcdx.c
+++ b/drivers/cdrom/mcdx.c
@@ -577,56 +577,57 @@ static void do_mcdx_request(request_queu
if (!req)
return;
 
+   if (!blk_fs_request(req)) {
+   end_request(req, 0);
+   goto again;
+   }
+
stuffp = req->rq_disk->private_data;
 
if (!stuffp->present) {
xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name);
xtrace(REQUEST, "end_request(0): bad device\n");
end_request(req, 0);
-   return;
+   goto again;
}
 
if (stuffp->audio) {
xwarn("do_request() attempt to read from audio cd\n");
xtrace(REQUEST, "end_request(0): read from audio\n");
end_request(req, 0);
-   return;
+   goto again;
}
 
xtrace(REQUEST, "do_request() (%lu + %lu)\n",
   req->sector, req->nr_sectors);
 
-   if (req->cmd != READ) {
+   if (rq_data_dir(req) != READ) {
xwarn("do_request(): non-read command to cd!!\n");
xtrace(REQUEST, "end_request(0): write\n");
end_request(req, 0);
-   return;
-   }
-   else {
-   stuffp->status = 0;
-   while (req->nr_sectors) {
-   int i;
-
-   i = mcdx_transfer(stuffp,
- req->buffer,
- req->sector,
- req->nr_sectors);
-
-   if (i == -1) {
-   end_request(req, 0);
-   goto again;
-   }
-   req->sector += i;
-   req->nr_sectors -= i;
-   req->buffer += (i * 512);
-   }
-   end_request(req, 1);
goto again;
-
-   xtrace(REQUEST, "end_request(1)\n");
-   end_request(req, 1);
}
 
+   stuffp->status = 0;
+   while (req->nr_sectors) {
+   int i;
+
+   spin_unlock_irq(q->queue_lock);
+   i = mcdx_transfer(stuffp,
+ req->buffer,
+ req->sector,
+ req->nr_sectors);
+   spin_lock_irq(q->queue_lock);
+
+   if (i == -1) {
+   end_request(req, 0);
+   goto again;
+   }
+   req->sector += i;
+   req->nr_sectors -= i;
+   req->buffer += (i * 512);
+   }
+   end_request(req, 1);
goto again;
 }
 
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Jens Axboe
On Mon, Apr 02 2007, Pekka J Enberg wrote:
> On Mon, 2 Apr 2007, Rene Herman wrote:
> > +   if (!blk_fs_request(req)) {
> > +   spin_lock_irq(q->queue_lock);
> 
> Contrary to what I said, this spin_lock_irq() is wrong...
> 
> > +   end_request(req, 0);
> > +   goto again;
> > +   }
> > +
> > +   spin_unlock_irq(q->queue_lock);
> 
> ...because we drop the lock here.

well you did make it overly complex, you should just have dropped the
lock around

spin_unlock_irq(q->queue_lock);
i = mcdx_transfer(...);
spin_lock_irq(q->queue_lock);

and be done with it. But as I wrote earlier, it'll take lots more to
make this driver close to functional. For one, most of the return
statements in do_mcdx_request() really want to be goto again's.

Updated patch attached :-)

diff --git a/Documentation/feature-removal-schedule.txt 
b/Documentation/feature-removal-schedule.txt
index 0bc8b0b..cff761a 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -324,3 +324,10 @@ Why:   the i8xx_tco watchdog driver has been replaced 
by the iTCO_wdt
 Who:   Wim Van Sebroeck <[EMAIL PROTECTED]>
 
 ---
+
+What:  The legacy CDROM drivers (drivers/cdrom/, except cdrom.c)
+When:  In 2.6.23
+Why:   They are all terminally broken (most don't even compile)
+Who:   Jens Axboe <[EMAIL PROTECTED]>
+
+---

-- 
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-02 Thread Pekka Enberg

Hi Rene,

On 4/2/07, Rene Herman <[EMAIL PROTECTED]> wrote:

[EMAIL PROTECTED]:~# dd if=/dev/mcdx0 of=/dev/null bs=2048
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000221955 seconds, 0.0 kB/s
[EMAIL PROTECTED]:~#

This I know isn't:

[EMAIL PROTECTED]:~# readcd dev=/dev/mcdx0 f=/dev/null
Segmentation fault
[EMAIL PROTECTED]:~#

(leaves a "note: readcd[1174] exited with preempt_count 1" in the log)

and after a "mount -t iso9660 /dev/mcdx0 /mnt/cdrom",  a:

[EMAIL PROTECTED]:~# tar cv /mnt/cdrom >/dev/null

has upto now done all of:


[snip]

Try with CONFIG_PREEMPT_NONE as suggested by Jens. Can we see strace
for the dd, readcd, and tar runs, please?
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Pekka J Enberg
On Mon, 2 Apr 2007, Rene Herman wrote:
> +   if (!blk_fs_request(req)) {
> +   spin_lock_irq(q->queue_lock);

Contrary to what I said, this spin_lock_irq() is wrong...

> +   end_request(req, 0);
> +   goto again;
> +   }
> +
> +   spin_unlock_irq(q->queue_lock);

...because we drop the lock here.

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Jens Axboe
On Mon, Apr 02 2007, Rene Herman wrote:
> On 04/01/2007 12:06 PM, Pekka Enberg wrote:
> 
> >Looks like mcdx_xfer is sleeping while holding q->queue_lock. The 
> >attached (untested) patch should fix it.
> 
> This (including your followup) does indeed avoid the traces in the 
> kernel log, but unfortunately, the driver seems to need a bit more.

I took a quick look at the driver, and it's pretty much utter crap so I
would not expect much. If you want to use it, make sure you at least
disable any form of SMP and preempt.

> Last time Al Viro suggested ripping them out, I slightly objected:
> 
> http://lkml.org/lkml/2004/5/2/123
> 
> but well, although I like playing with this stuff, I still don't know 
> the first thing about the block layer and given the shape these things 
> are in...

The questionable quality of the ancient CDROM drivers itself makes it
appealing to just dump it.

-- 
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Rene Herman

On 04/02/2007 02:02 AM, Rene Herman wrote:


On 04/01/2007 12:06 PM, Pekka Enberg wrote:

Looks like mcdx_xfer is sleeping while holding q->queue_lock. The 
attached (untested) patch should fix it.


This (including your followup) does indeed avoid the traces in the 
kernel log, but unfortunately, the driver seems to need a bit more.


This may be expected, I'm not sure:

[EMAIL PROTECTED]:~# dd if=/dev/mcdx0 of=/dev/null bs=2048
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000221955 seconds, 0.0 kB/s
[EMAIL PROTECTED]:~#

This I know isn't:

[EMAIL PROTECTED]:~# readcd dev=/dev/mcdx0 f=/dev/null
Segmentation fault
[EMAIL PROTECTED]:~#

(leaves a "note: readcd[1174] exited with preempt_count 1" in the log)

and after a "mount -t iso9660 /dev/mcdx0 /mnt/cdrom",  a:

[EMAIL PROTECTED]:~# tar cv /mnt/cdrom >/dev/null

has upto now done all of:

1) segfault
2) make the kernel oops
3) reset the machine

This thing is just so badly broken... ;-(

I've attached the current patches from Jens and yourself (against 
2.6.20.4) as a double check, but the driver's still totally unuseable 
even with them...


No, I didn't.

I own two other legacy drives; a Panasonic CR562 (sbpcd.c) and a Sony 
CDU33A (cdu31a.c) which together with this Mitsumi LU005S (mcdx.c) make 
up also all but one of the controllers I have; a few standalone, but 
most on old ISA soundcards. When I last tested, cdu31a somewhat worked 
and sbpcd didn't. Had high hopes for mcdx.c upon seeing it compile 
without warnings, but alas.


Last time Al Viro suggested ripping them out, I slightly objected:

http://lkml.org/lkml/2004/5/2/123

but well, although I like playing with this stuff, I still don't know 
the first thing about the block layer and given the shape these things 
are in...


Many thanks for looking though!


Rene.
--- drivers/cdrom/mcdx.c.orig   2007-04-02 00:25:09.0 +0200
+++ drivers/cdrom/mcdx.c2007-04-02 00:37:53.0 +0200
@@ -577,11 +577,20 @@
if (!req)
return;
 
+   if (!blk_fs_request(req)) {
+   spin_lock_irq(q->queue_lock);
+   end_request(req, 0);
+   goto again;
+   }
+
+   spin_unlock_irq(q->queue_lock);
+
stuffp = req->rq_disk->private_data;
 
if (!stuffp->present) {
xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name);
xtrace(REQUEST, "end_request(0): bad device\n");
+   spin_lock_irq(q->queue_lock);
end_request(req, 0);
return;
}
@@ -589,6 +598,7 @@
if (stuffp->audio) {
xwarn("do_request() attempt to read from audio cd\n");
xtrace(REQUEST, "end_request(0): read from audio\n");
+   spin_lock_irq(q->queue_lock);
end_request(req, 0);
return;
}
@@ -596,9 +606,10 @@
xtrace(REQUEST, "do_request() (%lu + %lu)\n",
   req->sector, req->nr_sectors);
 
-   if (req->cmd != READ) {
+   if (rq_data_dir(req) != READ) {
xwarn("do_request(): non-read command to cd!!\n");
xtrace(REQUEST, "end_request(0): write\n");
+   spin_lock_irq(q->queue_lock);
end_request(req, 0);
return;
}
@@ -613,6 +624,7 @@
  req->nr_sectors);
 
if (i == -1) {
+   spin_lock_irq(q->queue_lock);
end_request(req, 0);
goto again;
}
@@ -620,10 +632,12 @@
req->nr_sectors -= i;
req->buffer += (i * 512);
}
+   spin_lock_irq(q->queue_lock);
end_request(req, 1);
goto again;
 
xtrace(REQUEST, "end_request(1)\n");
+   spin_lock_irq(q->queue_lock);
end_request(req, 1);
}
 


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Rene Herman

On 04/01/2007 12:06 PM, Pekka Enberg wrote:

Looks like mcdx_xfer is sleeping while holding q->queue_lock. The 
attached (untested) patch should fix it.


This (including your followup) does indeed avoid the traces in the 
kernel log, but unfortunately, the driver seems to need a bit more.


This may be expected, I'm not sure:

[EMAIL PROTECTED]:~# dd if=/dev/mcdx0 of=/dev/null bs=2048
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000221955 seconds, 0.0 kB/s
[EMAIL PROTECTED]:~#

This I know isn't:

[EMAIL PROTECTED]:~# readcd dev=/dev/mcdx0 f=/dev/null
Segmentation fault
[EMAIL PROTECTED]:~#

(leaves a "note: readcd[1174] exited with preempt_count 1" in the log)

and after a "mount -t iso9660 /dev/mcdx0 /mnt/cdrom",  a:

[EMAIL PROTECTED]:~# tar cv /mnt/cdrom >/dev/null

has upto now done all of:

1) segfault
2) make the kernel oops
3) reset the machine

This thing is just so badly broken... ;-(

I've attached the current patches from Jens and yourself (against 
2.6.20.4) as a double check, but the driver's still totally unuseable 
even with them...


I own two other legacy drives; a Panasonic CR562 (sbpcd.c) and a Sony 
CDU33A (cdu31a.c) which together with this Mitsumi LU005S (mcdx.c) make 
up also all but one of the controllers I have; a few standalone, but 
most on old ISA soundcards. When I last tested, cdu31a somewhat worked 
and sbpcd didn't. Had high hopes for mcdx.c upon seeing it compile 
without warnings, but alas.


Last time Al Viro suggested ripping them out, I slightly objected:

http://lkml.org/lkml/2004/5/2/123

but well, although I like playing with this stuff, I still don't know 
the first thing about the block layer and given the shape these things 
are in...


Many thanks for looking though!

Rene.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Pekka Enberg

On 4/1/07, Pekka Enberg <[EMAIL PROTECTED]> wrote:

Looks like mcdx_xfer is sleeping while holding q->queue_lock. The
attached (untested) patch should fix it.


You also need to add a spin_lock_irq() before the call to
end_request() to Jens' patch.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-04-01 Thread Pekka Enberg

On 3/31/07, Rene Herman <[EMAIL PROTECTED]> wrote:

There's quite a bit of noise in dmesg though. Repeated 5 times:

===BUG: scheduling while atomic: mount/0x0001/1166
  [] __sched_text_start+0x57/0x574
  [] schedule_timeout+0x70/0x8f
  [] process_timeout+0x0/0x5
  [] interruptible_sleep_on_timeout+0x5d/0xa5
  [] default_wake_function+0x0/0xc
  [] mcdx_xfer+0xae/0x2a5 [mcdx]


[snip]


  [] do_mcdx_request+0x9b/0xd2 [mcdx]
  [] __generic_unplug_device+0x1d/0x1f
  [] generic_unplug_device+0x11/0x29


Looks like mcdx_xfer is sleeping while holding q->queue_lock. The
attached (untested) patch should fix it.


mcdx-drop-queue_lock-before-sleeping
Description: Binary data


Re: mcdx -- do_request(): non-read command to cd!!

2007-03-31 Thread Rene Herman

On 03/31/2007 08:47 AM, Jens Axboe wrote:


Try this.

diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
index f574962..7086313 100644
--- a/drivers/cdrom/mcdx.c
+++ b/drivers/cdrom/mcdx.c
@@ -577,6 +577,11 @@ static void do_mcdx_request(request_queue_t * q)
if (!req)
return;
 
+	if (!blk_fs_request(req)) {

+   end_request(req, 0);
+   goto again;
+   }
+
stuffp = req->rq_disk->private_data;
 
 	if (!stuffp->present) {

@@ -596,7 +601,7 @@ static void do_mcdx_request(request_queue_t * q)
xtrace(REQUEST, "do_request() (%lu + %lu)\n",
   req->sector, req->nr_sectors);
 
-	if (req->cmd != READ) {

+   if (rq_data_dir(req) != READ) {
xwarn("do_request(): non-read command to cd!!\n");
xtrace(REQUEST, "end_request(0): write\n");
end_request(req, 0);



Thank you! Yes, that works in so far that it now indeed does actually 
mount the CD:


[EMAIL PROTECTED]:~# mount -t iso9660 /dev/mcdx0 /mnt/cdrom
mount: block device /dev/mcdx0 is write-protected, mounting read-only
[EMAIL PROTECTED]:~# ls /mnt/cdrom/
dott  dott.exe  dottdemo  indydemo  rebel  samdemo

There's quite a bit of noise in dmesg though. Repeated 5 times:

===BUG: scheduling while atomic: mount/0x0001/1166
 [] __sched_text_start+0x57/0x574
 [] schedule_timeout+0x70/0x8f
 [] process_timeout+0x0/0x5
 [] interruptible_sleep_on_timeout+0x5d/0xa5
 [] default_wake_function+0x0/0xc
 [] mcdx_xfer+0xae/0x2a5 [mcdx]
 [] cfq_init_prio_data+0x57/0x12a
 [] cfq_get_queue+0x119/0x16e
 [] cfq_set_request+0x0/0x131
 [] elv_set_request+0x14/0x22
 [] elv_rb_del+0x23/0x31
 [] cfq_remove_request+0x63/0xd9
 [] elv_dispatch_sort+0x1c/0x67
 [] cfq_dispatch_insert+0x38/0x4c
 [] __cfq_dispatch_requests+0x72/0x1ad
 [] cfq_dispatch_requests+0x50/0x77
 [] sync_buffer+0x0/0x2e
 [] elv_next_request+0x5d/0x105
 [] sync_buffer+0x0/0x2e
 [] do_mcdx_request+0x9b/0xd2 [mcdx]
 [] __generic_unplug_device+0x1d/0x1f
 [] generic_unplug_device+0x11/0x29
 [] blk_backing_dev_unplug+0xc/0xd
 [] sync_buffer+0x26/0x2e
 [] __wait_on_bit+0x2c/0x51
 [] out_of_line_wait_on_bit+0x6f/0x77
 [] sync_buffer+0x0/0x2e
 [] wake_bit_function+0x0/0x3c
 [] wake_bit_function+0x0/0x3c
 [] __wait_on_buffer+0x22/0x25
 [] __bread_slow+0x4b/0x60
 [] __bread+0x18/0x1d
 [] isofs_fill_super+0xf0/0x5d7 [isofs]
 [] radix_tree_delete+0x177/0x1a0
 [] get_sb_bdev+0xc6/0x10f
 [] mntput_no_expire+0x11/0x73
 [] alloc_vfsmnt+0x97/0xbe
 [] isofs_get_sb+0x20/0x25 [isofs]
 [] isofs_fill_super+0x0/0x5d7 [isofs]
 [] vfs_kern_mount+0x40/0x6f
 [] do_kern_mount+0x2a/0x3a
 [] do_new_mount+0x64/0x93
 [] do_mount+0x185/0x19a
 [] __wake_up_locked+0x1e/0x20
 [] default_wake_function+0x0/0xc
 [] sys_mount+0x79/0xb5
 [] syscall_call+0x7/0xb
===

Any access results in te above. A copy from the CD segfaulted:

===
[EMAIL PROTECTED]:~# cp /mnt/cdrom/dott.exe .

malloc: unwind_prot.c:247: assertion botched
free: called with unallocated block argument
Segmentation fault
===

This sounds like a userspace problem but I sure haven't seen it before. 
There's a few "blk: request botched" followed by similar backtraces in 
the log after that.


It looks like mcdx_xfer() is seriously broken. If you don't particularly 
care for spending time on this thing -- feel free. To top it off, if you 
unload the module, it doesn't clean up after itself and the IRQ is kept 
in use (and a cat /proc/interrupts faults).


I'm only using the thing for the heck of it...

Rene.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: mcdx -- do_request(): non-read command to cd!!

2007-03-30 Thread Jens Axboe
On Fri, Mar 30 2007, Rene Herman wrote:
> Hi Al.
> 
> GIT doesn't remember, it's been too long, but IIRC you were the last one 
> to do some work on mcdx (the old proprietary mitsumi cd-rom driver). The 
> thing builds without warnings on 2.6.20.4, unlike most other proprietary 
> CD-ROM drivers, so someone did...
> 
> In any case, I just bet you're positively thrilled receiving bug-reports 
> for the thing right? Mmm?
> 
> I dug up a 1-speed Mitsumi CRMC-LU005S today. Brilliant drive! You push 
> on the front, after which it comes loose and you then yank the entire 
> drive, mechanism and all, out of its casing over some kind of magnetic 
> resistance it seems and then open a _second_ top-loading door, put in 
> the CD and follow the procedure backwards again. I've done that at least 
> 20 times now and I'm not by any means done yet. Brilliant.
> 
> The drive works fine under DOS (*), with both IRQ-less and IRQ-enabled 
> controllers. The linux driver does not work though:
> 
> [EMAIL PROTECTED]:~# modprobe mcdx
> 
> [EMAIL PROTECTED]:~# dmesg | tail -4
> mcdx Version 2.14(hs)
> mcdx $Id: mcdx.c,v 1.21 1997/01/26 07:12:59 davem Exp $
> Uniform CD-ROM driver Revision: 3.20
>  mcdx: Mitsumi CD-ROM installed at 0x300, irq 15. (Firmware version M 4)
> 
> [EMAIL PROTECTED]:~# mount /dev/mcdx0 /mnt/cdrom
> mount: block device /dev/mcdx0 is write-protected, mounting read-only
> mount: /dev/mcdx0: can't read superblock
> 
> [EMAIL PROTECTED]:~# dmesg | tail -4
>  mcdx: Mitsumi CD-ROM installed at 0x300, irq 15. (Firmware version M 4)
> mcdx do_request(): non-read command to cd!!
> end_request: I/O error, dev mcdx0, sector 0
> FAT: unable to read boot sector
> [EMAIL PROTECTED]:~#
> 
> This same 300/15 pair works under DOS in the same machine and IRQ15 is 
> firing. The error sounds very block-ish. Would you happen to know?
> 
> I'll happily test patches :-)

Try this.

diff --git a/drivers/cdrom/mcdx.c b/drivers/cdrom/mcdx.c
index f574962..7086313 100644
--- a/drivers/cdrom/mcdx.c
+++ b/drivers/cdrom/mcdx.c
@@ -577,6 +577,11 @@ static void do_mcdx_request(request_queue_t * q)
if (!req)
return;
 
+   if (!blk_fs_request(req)) {
+   end_request(req, 0);
+   goto again;
+   }
+
stuffp = req->rq_disk->private_data;
 
if (!stuffp->present) {
@@ -596,7 +601,7 @@ static void do_mcdx_request(request_queue_t * q)
xtrace(REQUEST, "do_request() (%lu + %lu)\n",
   req->sector, req->nr_sectors);
 
-   if (req->cmd != READ) {
+   if (rq_data_dir(req) != READ) {
xwarn("do_request(): non-read command to cd!!\n");
xtrace(REQUEST, "end_request(0): write\n");
end_request(req, 0);

-- 
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


mcdx -- do_request(): non-read command to cd!!

2007-03-30 Thread Rene Herman

Hi Al.

GIT doesn't remember, it's been too long, but IIRC you were the last one 
to do some work on mcdx (the old proprietary mitsumi cd-rom driver). The 
thing builds without warnings on 2.6.20.4, unlike most other proprietary 
CD-ROM drivers, so someone did...


In any case, I just bet you're positively thrilled receiving bug-reports 
for the thing right? Mmm?


I dug up a 1-speed Mitsumi CRMC-LU005S today. Brilliant drive! You push 
on the front, after which it comes loose and you then yank the entire 
drive, mechanism and all, out of its casing over some kind of magnetic 
resistance it seems and then open a _second_ top-loading door, put in 
the CD and follow the procedure backwards again. I've done that at least 
20 times now and I'm not by any means done yet. Brilliant.


The drive works fine under DOS (*), with both IRQ-less and IRQ-enabled 
controllers. The linux driver does not work though:


[EMAIL PROTECTED]:~# modprobe mcdx

[EMAIL PROTECTED]:~# dmesg | tail -4
mcdx Version 2.14(hs)
mcdx $Id: mcdx.c,v 1.21 1997/01/26 07:12:59 davem Exp $
Uniform CD-ROM driver Revision: 3.20
 mcdx: Mitsumi CD-ROM installed at 0x300, irq 15. (Firmware version M 4)

[EMAIL PROTECTED]:~# mount /dev/mcdx0 /mnt/cdrom
mount: block device /dev/mcdx0 is write-protected, mounting read-only
mount: /dev/mcdx0: can't read superblock

[EMAIL PROTECTED]:~# dmesg | tail -4
 mcdx: Mitsumi CD-ROM installed at 0x300, irq 15. (Firmware version M 4)
mcdx do_request(): non-read command to cd!!
end_request: I/O error, dev mcdx0, sector 0
FAT: unable to read boot sector
[EMAIL PROTECTED]:~#

This same 300/15 pair works under DOS in the same machine and IRQ15 is 
firing. The error sounds very block-ish. Would you happen to know?


I'll happily test patches :-)

Rene.

(*) Mitsumi not only has the old DOS driver online, it even keeps a 
scanned manual available:


http://www.mitsumi.com/enduser/1_drivers.html#Manuals

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/