diff options
author | Brian Behlendorf <[email protected]> | 2010-11-10 14:40:38 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-11-10 16:59:49 -0800 |
commit | f4af6bb783b0b7f2a6075cb1c74c225db8a157b2 (patch) | |
tree | e171b9ed0d0b876fd38e4d221b45297994a9ab87 /include/sys | |
parent | b04cffc9b03db08148f19bfbc92a53e5dc7b30d5 (diff) |
Linux 2.6.36 compat, use REQ_FAILFAST_MASK
As of linux-2.6.36 the BIO_RW_FAILFAST and REQ_FAILFAST flags
have been unified under the REQ_* names. These flags always had
to be kept in-sync so this is a nice step forward, unfortunately
it means we need to be careful to only use the new unified flags
when the BIO_RW_* flags are not defined. Additional autoconf
checks were added for this and if it is ever unclear which method
to use no flags are set. This is safe but may result in longer
delays before a disk is failed.
Perferred interface for setting FAILFAST on a bio:
2.6.12-2.6.27: BIO_RW_FAILFAST
2.6.28-2.6.35: BIO_RW_FAILFAST_{DEV|TRANSPORT|DRIVER}
2.6.36-2.6.xx: REQ_FAILFAST_{DEV|TRANSPORT|DRIVER}
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/blkdev.h | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/include/sys/blkdev.h b/include/sys/blkdev.h index 7102890f1..3dc0fd2a8 100644 --- a/include/sys/blkdev.h +++ b/include/sys/blkdev.h @@ -205,17 +205,16 @@ struct req_iterator { static inline void bio_set_flags_failfast(struct block_device *bdev, int *flags) { -#ifdef HAVE_BIO_RW_FAILFAST +#ifdef CONFIG_BUG /* - * Disable BIO_RW_FAILFAST_* for loopback devices because of - * the following incorrect BUG_ON() in loop_make_request(). + * Disable FAILFAST for loopback devices because of the + * following incorrect BUG_ON() in loop_make_request(). * This support is also disabled for md devices because the * test suite layers md devices on top of loopback devices. * This may be removed when the loopback driver is fixed. * * BUG_ON(!lo || (rw != READ && rw != WRITE)); */ -#ifdef CONFIG_BUG if ((MAJOR(bdev->bd_dev) == LOOP_MAJOR) || (MAJOR(bdev->bd_dev) == MD_MAJOR)) return; @@ -225,13 +224,25 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags) return; #endif /* BLOCK_EXT_MAJOR */ #endif /* CONFIG_BUG */ + +#ifdef HAVE_BIO_RW_FAILFAST_DTD + /* BIO_RW_FAILFAST_* preferred interface from 2.6.28 - 2.6.35 */ *flags |= ((1 << BIO_RW_FAILFAST_DEV) | (1 << BIO_RW_FAILFAST_TRANSPORT) | (1 << BIO_RW_FAILFAST_DRIVER)); -#else /* !HAVE_BIO_RW_FAILFAST */ +#else +# ifdef HAVE_BIO_RW_FAILFAST + /* BIO_RW_FAILFAST preferred interface from 2.6.12 - 2.6.27 */ *flags |= (1 << BIO_RW_FAILFAST); -#endif /* HAVE_BIO_RW_FAILFAST */ +# else +# ifdef HAVE_REQ_FAILFAST_MASK + /* REQ_FAILFAST_* preferred interface from 2.6.36 - 2.6.xx, + * the BIO_* and REQ_* flags were unified under REQ_* flags. */ + *flags |= REQ_FAILFAST_MASK; +# endif /* HAVE_REQ_FAILFAST_MASK */ +# endif /* HAVE_BIO_RW_FAILFAST */ +#endif /* HAVE_BIO_RW_FAILFAST_DTD */ } #ifndef DISK_NAME_LEN |