* [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
@ 2002-10-14 20:36 David Mansfield
2002-10-14 20:49 ` Andrew Morton
2002-10-15 6:41 ` Neil Brown
0 siblings, 2 replies; 6+ messages in thread
From: David Mansfield @ 2002-10-14 20:36 UTC (permalink / raw)
To: linux-kernel
Hi everyone,
I haven't been able to run raw over raid5 since 2.5.30 or so, but every
time I'm about to report it, a new kernel comes out and the problem
changes completely :-( Now I'm finally going to start getting out the info
it the hopes someone can fix it. The oops was triggered by attempting to
read from /dev/raw/raw1 (bound to /dev/md0) using dd. System info
follows oops:
------------[ cut here ]------------
kernel BUG at drivers/block/ll_rw_blk.c:1967!
invalid operand: 0000
CPU: 0
EIP: 0060:[<c024ecc8>] Not tainted
EFLAGS: 00010206
EIP is at end_that_request_first+0x98/0x220
eax: 00001000 ebx: 00000008 ecx: 00000000 edx: 00000000
esi: f6d3e9e0 edi: f6d3ea1c ebp: f7d38b40 esp: c038be68
ds: 0068 es: 0068 ss: 0068
Process swapper (pid: 0, threadinfo=c038a000 task=c0369d00)
Stack: 00000000 00000000 00000000 00000001 c038a000 c038bea8 c0117fa0 f7d52400
f7d38b40 f7d52400 f7d47818 c0282cb7 f7d38b40 00000001 00000008 f6c14520
f7d52400 00000000 00000000 00000000 c0282f78 f7d52400 00000001 00000008
Call Trace:
[<c0117fa0>] try_to_wake_up+0x250/0x260
[<c0282cb7>] __scsi_end_request+0x27/0xd0
[<c0282f78>] scsi_io_completion+0x188/0x3a0
[<c0118f1c>] __wake_up+0x2c/0x50
[<c0299ed3>] sd_rw_intr+0x1f3/0x200
[<c027d881>] scsi_finish_command+0x81/0x90
[<c027d6f6>] scsi_softirq+0x86/0x100
[<c012250b>] do_softirq+0x5b/0xc0
[<c010b0d0>] do_IRQ+0x140/0x160
[<c0106ee0>] default_idle+0x0/0x40
[<c0106ee0>] default_idle+0x0/0x40
[<c01098f4>] common_interrupt+0x18/0x20
[<c0106ee0>] default_idle+0x0/0x40
[<c0106ee0>] default_idle+0x0/0x40
[<c0106f0a>] default_idle+0x2a/0x40
[<c0106fb2>] cpu_idle+0x52/0x70
[<c0105000>] stext+0x0/0x60
Code: 0f 0b af 07 1f 53 33 c0 3b 5c 24 38 7f 61 89 da c1 e2 09 39
<0>Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing
My sytem is a dual 450 MHZ PII with 1GB ram (HIGHMEM4G). Raid is sw raid5
on 5 SCSI disks running off of an adaptec aic7xxx controller. Compiler is
"gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-112)" with an updated
redhat 7.3 toolchain.
Config is:
CONFIG_X86=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_EXPERIMENTAL=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_MODULES=y
CONFIG_KMOD=y
CONFIG_M686=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_X86_TSC=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_PPRO_FENCE=y
CONFIG_SMP=y
CONFIG_PREEMPT=y
CONFIG_NR_CPUS=2
CONFIG_X86_MCE=y
CONFIG_X86_MCE_NONFATAL=y
CONFIG_X86_MCE_P4THERMAL=y
CONFIG_MICROCODE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_HIGHMEM4G=y
CONFIG_HIGHMEM=y
CONFIG_MTRR=y
CONFIG_HAVE_DEC_LOCK=y
CONFIG_ACPI=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_BUS=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_PM=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_PCI=y
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_NAMES=y
CONFIG_ISA=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_PC_CML1=m
CONFIG_PARPORT_PC_FIFO=y
CONFIG_PARPORT_PC_SUPERIO=y
CONFIG_PARPORT_1284=y
CONFIG_PNP=m
CONFIG_BLK_DEV_FD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_NBD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
CONFIG_LBD=y
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDESCSI=m
CONFIG_IDE_TASK_IOCTL=y
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_BLK_DEV_GENERIC=y
CONFIG_IDEPCI_SHARE_IRQ=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_BLK_DEV_IDEDMA=y
CONFIG_IDEDMA_PCI_WIP=y
CONFIG_BLK_DEV_ADMA=y
CONFIG_BLK_DEV_PIIX=y
CONFIG_IDEDMA_AUTO=y
CONFIG_BLK_DEV_IDE_MODES=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_SD_EXTRA_DEVS=40
CONFIG_CHR_DEV_ST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_SR_EXTRA_DEVS=2
CONFIG_CHR_DEV_SG=m
CONFIG_SCSI_REPORT_LUNS=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_AIC7XXX=y
CONFIG_AIC7XXX_CMDS_PER_DEVICE=253
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_LINEAR=y
CONFIG_MD_RAID0=y
CONFIG_MD_RAID1=y
CONFIG_MD_RAID5=y
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETFILTER=y
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_INET_ECN=y
CONFIG_SYN_COOKIES=y
CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IPV6_SCTP__=y
CONFIG_NETDEVICES=y
CONFIG_DUMMY=m
CONFIG_TUN=y
CONFIG_NET_ETHERNET=y
CONFIG_NET_VENDOR_3COM=y
CONFIG_VORTEX=y
CONFIG_NET_PCI=y
CONFIG_E100=y
CONFIG_PPP=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPPOE=m
CONFIG_INPUT=y
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_PCSPKR=y
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256
CONFIG_PRINTER=m
CONFIG_PPDEV=m
CONFIG_RTC=y
CONFIG_RAW_DRIVER=y
CONFIG_REISERFS_FS=y
CONFIG_EXT3_FS=y
CONFIG_JBD=y
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_TMPFS=y
CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_JFS_FS=y
CONFIG_MINIX_FS=y
CONFIG_NTFS_FS=m
CONFIG_NTFS_RW=y
CONFIG_PROC_FS=y
CONFIG_DEVPTS_FS=y
CONFIG_EXT2_FS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_TCP=y
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=y
CONFIG_SMB_FS=m
CONFIG_MSDOS_PARTITION=y
CONFIG_SMB_NLS=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_ISO8859_1=m
CONFIG_VGA_CONSOLE=y
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_KALLSYMS=y
CONFIG_X86_EXTRA_IRQS=y
CONFIG_X86_FIND_SMP_CONFIG=y
CONFIG_X86_MPPARSE=y
CONFIG_SECURITY_CAPABILITIES=y
CONFIG_CRC32=y
CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m
CONFIG_X86_SMP=y
CONFIG_X86_HT=y
CONFIG_X86_BIOS_REBOOT=y
--
/==============================\
| David Mansfield |
| lkml@dm.cobite.com |
\==============================/
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
2002-10-14 20:36 [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967 David Mansfield
@ 2002-10-14 20:49 ` Andrew Morton
2002-10-14 21:57 ` David Mansfield
2002-10-14 22:18 ` David Mansfield
2002-10-15 6:41 ` Neil Brown
1 sibling, 2 replies; 6+ messages in thread
From: Andrew Morton @ 2002-10-14 20:49 UTC (permalink / raw)
To: David Mansfield; +Cc: linux-kernel
David Mansfield wrote:
>
> Hi everyone,
>
> I haven't been able to run raw over raid5 since 2.5.30 or so, but every
> time I'm about to report it, a new kernel comes out and the problem
> changes completely :-( Now I'm finally going to start getting out the info
> it the hopes someone can fix it. The oops was triggered by attempting to
> read from /dev/raw/raw1 (bound to /dev/md0) using dd. System info
> follows oops:
>
> ------------[ cut here ]------------
> kernel BUG at drivers/block/ll_rw_blk.c:1967!
I don't think you told us the kernel version?
There have been recent fixes wrt sizing of the BIOs which the
direct-io layer sends down. So please make sure that you're
testing Linus's current -bk, or 2.5.42 plus
http://www.zip.com.au/~akpm/linux/patches/2.5/2.5.42/2.5.42-mm2/broken-out/dio-bio-add-fix-1.patch
Either that, or raid5 is bust ;)
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
2002-10-14 20:49 ` Andrew Morton
@ 2002-10-14 21:57 ` David Mansfield
2002-10-14 22:18 ` David Mansfield
1 sibling, 0 replies; 6+ messages in thread
From: David Mansfield @ 2002-10-14 21:57 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel
On Mon, 14 Oct 2002, Andrew Morton wrote:
> David Mansfield wrote:
> >
> > Hi everyone,
> >
> > I haven't been able to run raw over raid5 since 2.5.30 or so, but every
> > time I'm about to report it, a new kernel comes out and the problem
> > changes completely :-( Now I'm finally going to start getting out the info
> > it the hopes someone can fix it. The oops was triggered by attempting to
> > read from /dev/raw/raw1 (bound to /dev/md0) using dd. System info
> > follows oops:
> >
> > ------------[ cut here ]------------
> > kernel BUG at drivers/block/ll_rw_blk.c:1967!
>
> I don't think you told us the kernel version?
Arrgh. It was 2.5.42 vanilla.
> There have been recent fixes wrt sizing of the BIOs which the
> direct-io layer sends down. So please make sure that you're
> testing Linus's current -bk, or 2.5.42 plus
>
> http://www.zip.com.au/~akpm/linux/patches/2.5/2.5.42/2.5.42-mm2/broken-out/dio-bio-add-fix-1.patch
I've applied this patch and retested. I was able to run dd once this
time, hit ctrl-c, all ok. But I hit up-arrow and re-did it and it gave
the same oops. I'm going to try with the full (latest) mm patch.
> Either that, or raid5 is bust ;)
>
I guess so.
David
--
/==============================\
| David Mansfield |
| lkml@dm.cobite.com |
\==============================/
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
2002-10-14 20:49 ` Andrew Morton
2002-10-14 21:57 ` David Mansfield
@ 2002-10-14 22:18 ` David Mansfield
1 sibling, 0 replies; 6+ messages in thread
From: David Mansfield @ 2002-10-14 22:18 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel
On Mon, 14 Oct 2002, Andrew Morton wrote:
> David Mansfield wrote:
> > ------------[ cut here ]------------
> > kernel BUG at drivers/block/ll_rw_blk.c:1967!
>
> I don't think you told us the kernel version?
>
> There have been recent fixes wrt sizing of the BIOs which the
> direct-io layer sends down. So please make sure that you're
> testing Linus's current -bk, or 2.5.42 plus
>
I've tried to test 2.5.42-mm2 but it doesn't compile. There were (I
assume 'sard') changes made to remove the DK_MAX_MAJOR etc. but there is
to patch to drivers/md/md.c so it fails to compile:
# find -name \*.c | xargs grep DK_MAX_MAJOR
./drivers/md/md.c:static unsigned int sync_io[DK_MAX_MAJOR][DK_MAX_DISK];
./drivers/md/md.c: if ((index >= DK_MAX_DISK) || (major >=
DK_MAX_MAJOR))
./drivers/md/md.c: if ((idx >= DK_MAX_DISK) || (major >=
DK_MAX_MAJOR))
David
--
/==============================\
| David Mansfield |
| david@cobite.com |
\==============================/
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
2002-10-14 20:36 [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967 David Mansfield
2002-10-14 20:49 ` Andrew Morton
@ 2002-10-15 6:41 ` Neil Brown
2002-11-05 23:43 ` Neil Brown
1 sibling, 1 reply; 6+ messages in thread
From: Neil Brown @ 2002-10-15 6:41 UTC (permalink / raw)
To: David Mansfield; +Cc: linux-kernel
On Monday October 14, lkml@dm.cobite.com wrote:
>
> Hi everyone,
>
> I haven't been able to run raw over raid5 since 2.5.30 or so, but every
> time I'm about to report it, a new kernel comes out and the problem
> changes completely :-( Now I'm finally going to start getting out the info
> it the hopes someone can fix it. The oops was triggered by attempting to
> read from /dev/raw/raw1 (bound to /dev/md0) using dd. System info
> follows oops:
>
> ------------[ cut here ]------------
> kernel BUG at drivers/block/ll_rw_blk.c:1967!
> invalid operand: 0000
>
You are not alone in reporting this BUG...
I blame the Scsi/bio layer.
Jens Axboe blames raid5.
:-)
Hopefully we will find it one place or the other.
The other report didn't use raw to get the bug, but if using raw makes
it reproducable, I will try that and see if I can reproduce it easily.
NeilBrown
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967
2002-10-15 6:41 ` Neil Brown
@ 2002-11-05 23:43 ` Neil Brown
0 siblings, 0 replies; 6+ messages in thread
From: Neil Brown @ 2002-11-05 23:43 UTC (permalink / raw)
To: David Mansfield, Jens Axboe; +Cc: linux-kernel, linux-raid
On Tuesday October 15, neilb@cse.unsw.edu.au wrote:
> On Monday October 14, lkml@dm.cobite.com wrote:
> >
> > Hi everyone,
> >
> > I haven't been able to run raw over raid5 since 2.5.30 or so, but every
> > time I'm about to report it, a new kernel comes out and the problem
> > changes completely :-( Now I'm finally going to start getting out the info
> > it the hopes someone can fix it. The oops was triggered by attempting to
> > read from /dev/raw/raw1 (bound to /dev/md0) using dd. System info
> > follows oops:
> >
> > ------------[ cut here ]------------
> > kernel BUG at drivers/block/ll_rw_blk.c:1967!
> > invalid operand: 0000
> >
>
> You are not alone in reporting this BUG...
>
> I blame the Scsi/bio layer.
> Jens Axboe blames raid5.
> :-)
>
Just for the record, Jens was right. :-)
Here is the patch which will be winging it's way to Linus shortly.
NeilBrown
-----------------------------
Fix bug in raid5
When analysing a stripe in handle_stripe we set bits
R5_Wantread or R5_Wantwrite
to indicate if a read or write is needed. We don't actually schedule the
IO immediately as this is done under a spinlock (sh->lock) and
generic_make_request can block. Instead we check these bits after
the lock has been lifted and then schedule the IO.
But once the lock has been lifted we aren't safe against multiple
access, and it is possible that the IO will be scheduled never, or twice.
So, we use test_and_clear to check and potentially schedule the IO.
This wasn't a problem in 2.4 because the equivalent information was
stored on the stack instead of in the stripe.
We also make sure bi_io_vec[0] has correct values as a previous
call to generic_make_request may have changed them.
----------- Diffstat output ------------
./drivers/md/raid5.c | 92 +++++++++++++++++++++++++++------------------------
1 file changed, 51 insertions(+), 43 deletions(-)
--- ./drivers/md/raid5.c 2002/11/05 23:31:25 1.1
+++ ./drivers/md/raid5.c 2002/11/05 23:39:15 1.2
@@ -851,8 +851,6 @@ static void handle_stripe(struct stripe_
for (i=disks; i--; ) {
mdk_rdev_t *rdev;
dev = &sh->dev[i];
- clear_bit(R5_Wantread, &dev->flags);
- clear_bit(R5_Wantwrite, &dev->flags);
clear_bit(R5_Insync, &dev->flags);
clear_bit(R5_Syncio, &dev->flags);
@@ -1160,48 +1158,56 @@ static void handle_stripe(struct stripe_
bi->bi_size = 0;
bi->bi_end_io(bi, bytes, 0);
}
- for (i=disks; i-- ;)
- if (sh->dev[i].flags & ((1<<R5_Wantwrite)|(1<<R5_Wantread))) {
- struct bio *bi = &sh->dev[i].req;
- mdk_rdev_t *rdev ;
-
- bi->bi_rw = 0;
- if (test_bit(R5_Wantread, &sh->dev[i].flags))
- bi->bi_end_io = raid5_end_read_request;
- else {
- bi->bi_end_io = raid5_end_write_request;
- bi->bi_rw = 1;
- }
-
- spin_lock_irq(&conf->device_lock);
- rdev = conf->disks[i].rdev;
- if (rdev && rdev->faulty)
- rdev = NULL;
- if (rdev)
- atomic_inc(&rdev->nr_pending);
- spin_unlock_irq(&conf->device_lock);
-
- if (rdev) {
- if (test_bit(R5_Syncio, &sh->dev[i].flags))
- md_sync_acct(rdev, STRIPE_SECTORS);
-
- bi->bi_bdev = rdev->bdev;
- PRINTK("for %llu schedule op %ld on disc %d\n", (unsigned long long)sh->sector, bi->bi_rw, i);
- atomic_inc(&sh->count);
- bi->bi_sector = sh->sector;
- bi->bi_flags = 1 << BIO_UPTODATE;
- bi->bi_vcnt = 1;
- bi->bi_idx = 0;
- bi->bi_io_vec = &sh->dev[i].vec;
- bi->bi_size = STRIPE_SIZE;
- bi->bi_next = NULL;
- generic_make_request(bi);
- } else {
- PRINTK("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector);
- clear_bit(R5_LOCKED, &dev->flags);
- set_bit(STRIPE_HANDLE, &sh->state);
- }
+ for (i=disks; i-- ;) {
+ int rw;
+ struct bio *bi;
+ mdk_rdev_t *rdev;
+ if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags))
+ rw = 1;
+ else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags))
+ rw = 0;
+ else
+ continue;
+
+ bi = &sh->dev[i].req;
+
+ bi->bi_rw = rw;
+ if (rw)
+ bi->bi_end_io = raid5_end_write_request;
+ else
+ bi->bi_end_io = raid5_end_read_request;
+
+ spin_lock_irq(&conf->device_lock);
+ rdev = conf->disks[i].rdev;
+ if (rdev && rdev->faulty)
+ rdev = NULL;
+ if (rdev)
+ atomic_inc(&rdev->nr_pending);
+ spin_unlock_irq(&conf->device_lock);
+
+ if (rdev) {
+ if (test_bit(R5_Syncio, &sh->dev[i].flags))
+ md_sync_acct(rdev, STRIPE_SECTORS);
+
+ bi->bi_bdev = rdev->bdev;
+ PRINTK("for %llu schedule op %ld on disc %d\n", (unsigned long long)sh->sector, bi->bi_rw, i);
+ atomic_inc(&sh->count);
+ bi->bi_sector = sh->sector;
+ bi->bi_flags = 1 << BIO_UPTODATE;
+ bi->bi_vcnt = 1;
+ bi->bi_idx = 0;
+ bi->bi_io_vec = &sh->dev[i].vec;
+ bi->bi_io_vec[0].bv_len = STRIPE_SIZE;
+ bi->bi_io_vec[0].bv_offset = 0;
+ bi->bi_size = STRIPE_SIZE;
+ bi->bi_next = NULL;
+ generic_make_request(bi);
+ } else {
+ PRINTK("skip op %ld on disc %d for sector %llu\n", bi->bi_rw, i, (unsigned long long)sh->sector);
+ clear_bit(R5_LOCKED, &dev->flags);
+ set_bit(STRIPE_HANDLE, &sh->state);
}
+ }
}
static inline void raid5_activate_delayed(raid5_conf_t *conf)
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2002-11-05 23:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-14 20:36 [BUG] raw over raid5: BUG at drivers/block/ll_rw_blk.c:1967 David Mansfield
2002-10-14 20:49 ` Andrew Morton
2002-10-14 21:57 ` David Mansfield
2002-10-14 22:18 ` David Mansfield
2002-10-15 6:41 ` Neil Brown
2002-11-05 23:43 ` Neil Brown
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).