Bug#482943: linux-image-2.6.24: Device mapper not reporting no-barrier-support?
Package: linux-image-2.6.24-1-686
Version: 2.6.24-7
Severity: important
File: linux-image-2.6.24
Tags: patch
DRBD gives the error message "drbd0: local disk flush failed with status -5".
This seems to be this problem reported here by Anders Henke to LKML:
<http://groups.google.com/group/fa.linux.kernel/browse_thread/thread/3ca7a07dd9d3c54d/8c7d1e1024c215cf>
> I'm currently stuck between Kernel LVM and DRBD, as I'm using Kernel
> 2.6.24.2 with DRBD 8.2.5 on top of an LVM2 device (LV).
>
> -LVM2/device mapper doesn't support write barriers
> -DRBD uses blkdev_issue_flush() to flush its metadata to disk.
>
> On a no-barrier-device, DRBD should receive EOPNOTSUPP, but
> it really does receive an EIO. Promptly, DRBD gives the
> error message "drbd0: local disk flush failed with status -5".
>
> The physical disk (in LVM speak) is a RAID1 on a 3ware 9650SE-2LP
> controller; the driver 3w-9xxx supports barriers and after moving my
> DRBD device from the LV to a single partition on the same RAID1, the
> error messages from DRBD vanished. <<
Patch can be found here:
<http://groups.google.com/group/fa.linux.kernel/attach/8c7d1e1024c215cf/ll_rw_blk-eopnotsup-2.6.24.2.patch?part=2>
-- Package-specific info:
** Version:
Linux version 2.6.24-1-686 (Debian 2.6.24-7) (dannf@debian.org) (gcc version 4.1.3 20080114 (prerelease) (Debian 4.1.2-19)) #1 SMP Thu May 8 02:16:39 UTC 2008
** Command line:
root=/dev/hda1 ro
** Not tainted
** Kernel log:
drbd0: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd1: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
drbd0: local disk flush failed with status -5
[...]
** Loaded modules:
Module Size Used by
sha1_generic 2592 0
cn 8032 0
ocfs2_dlmfs 21224 1
ocfs2_dlm 178628 1 ocfs2_dlmfs
ocfs2_nodemanager 147036 5 ocfs2_dlmfs,ocfs2_dlm
configfs 25648 2 ocfs2_nodemanager
bridge 49240 0
tun 10976 1
ipv6 240836 12
loop 16804 0
parport_pc 33668 0
parport 34280 1 parport_pc
pcspkr 3200 0
rtc 13052 0
psmouse 36464 0
serio_raw 6660 0
i2c_piix4 8428 0
i2c_core 22432 1 i2c_piix4
container 4864 0
ac 6116 0
button 8432 0
intel_agp 23412 1
agpgart 31688 1 intel_agp
shpchp 31028 0
pci_hotplug 27712 1 shpchp
evdev 11104 0
ext3 122920 1
jbd 43732 1 ext3
mbcache 8288 1 ext3
dm_mirror 21600 0
dm_snapshot 16964 0
dm_mod 55812 9 dm_mirror,dm_snapshot
ide_disk 15648 5
ata_generic 7428 0
libata 144624 1 ata_generic
scsi_mod 141164 1 libata
generic 4388 0 [permanent]
floppy 54628 0
pcnet32 32068 0
mii 5312 1 pcnet32
piix 7492 0 [permanent]
ide_core 108292 3 ide_disk,generic,piix
thermal 16028 0
processor 36552 1 thermal
fan 4772 0
** PCI devices:
not available
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.24-1-686 (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash
Versions of packages linux-image-2.6.24-1-686 depends on:
ii debconf [debconf-2.0] 1.5.22 Debian configuration management sy
ii initramfs-tools [linux-initra 0.92a tools for generating an initramfs
ii module-init-tools 3.4-1 tools for managing Linux kernel mo
Versions of packages linux-image-2.6.24-1-686 recommends:
ii libc6-i686 2.7-10 GNU C Library: Shared libraries [i
-- debconf information excluded
--- linux-2.6.24.2-vanilla/block/ll_rw_blk.c 2008-02-11 06:51:11.000000000 +0100
+++ linux-2.6.24.2/block/ll_rw_blk.c 2008-02-28 10:38:22.392987649 +0100
@@ -2667,8 +2667,11 @@ EXPORT_SYMBOL(blk_execute_rq);
static void bio_end_empty_barrier(struct bio *bio, int err)
{
- if (err)
+ if (err) {
+ if (err == -EOPNOTSUPP)
+ set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
clear_bit(BIO_UPTODATE, &bio->bi_flags);
+ }
complete(bio->bi_private);
}
@@ -2717,7 +2720,9 @@ int blkdev_issue_flush(struct block_devi
*error_sector = bio->bi_sector;
ret = 0;
- if (!bio_flagged(bio, BIO_UPTODATE))
+ if (bio_flagged(bio, BIO_EOPNOTSUPP))
+ ret = -EOPNOTSUPP;
+ else if (!bio_flagged(bio, BIO_UPTODATE))
ret = -EIO;
bio_put(bio);
Reply to: