--- drivers/block/nvme.c 2011-05-12 13:52:17.000000000 -0400 +++ drivers/block/nvme.c 2011-05-12 01:24:57.000000000 -0400 @@ -41,6 +41,65 @@ #include #include +/* In v2.6.35, the REQ and BIO_RW flags were unified. The FUA flag + * doesn't have the same meaning as barrier, so don't ship this code + * into production on earlier kernels. + */ +#ifndef REQ_RAHEAD +#define REQ_RAHEAD (1 << BIO_RW_AHEAD) +#define REQ_FLUSH (1 << BIO_RW_BARRIER) +#undef REQ_FUA +#define REQ_FUA (1 << BIO_RW_BARRIER) +#warning FUA is broken +#endif + +#ifndef RHEL_RELEASE_CODE +#define RHEL_RELEASE_CODE 0 +#define RHEL_RELEASE_VERSION(x, y) 1 +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) + +#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0) +#define AFFINITY_HINT +#endif + +#endif + +#ifdef AFFINITY_HINT +/* Since 2.6.35, we've exposed irq_set_affinity_hint to modules. Bodge + * it for earlier kernels by looking up the address of irq_set_affinity + * in kallsyms and passing it as a module parameter */ +static unsigned long irq_set_affinity_sym; +module_param(irq_set_affinity_sym, ulong, 0); + +static int irq_set_affinity_hint(unsigned int irq, const struct cpumask *mask) +{ + int (*set_affinity)(unsigned int, const struct cpumask *); + if (!irq_set_affinity_sym) + return 0; + if (!mask) + return 0; + set_affinity = (void *)irq_set_affinity_sym; + return set_affinity(irq, mask); +} +#endif + +/* 2.6.34 introduced this offset */ +#ifndef POISON_POINTER_DELTA +#define POISON_POINTER_DELTA 0 +#endif + +/* 2.6.34 renamed this function */ +#ifndef for_each_set_bit +#define for_each_set_bit for_each_bit +#endif + +/* A lie anyway; I haven't added support for the DSM command yet */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0) +#define QUEUE_FLAG_DISCARD 0 +#endif + #define NVME_Q_DEPTH 1024 #define SQ_SIZE(depth) (depth * sizeof(struct nvme_command)) #define CQ_SIZE(depth) (depth * sizeof(struct nvme_completion))