--- drivers/block/nvme.c 2011-03-02 19:17:18.000000000 -0500 +++ drivers/block/nvme.c 2011-02-24 16:27:39.000000000 -0500 @@ -38,6 +38,37 @@ #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 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) +/* 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 */ +int (*irq_set_affinity_hint)(unsigned int, const struct cpumask *); +static unsigned long irq_set_affinity_sym; +module_param(irq_set_affinity_sym, ulong, 0); + +#define dma_set_coherent_mask(dev, mask) \ + pci_set_consistent_dma_mask(pdev, mask) +#endif +/* 2.6.34 introduced this offset */ +#ifndef POISON_POINTER_DELTA +#define POISON_POINTER_DELTA 0 +#endif +/* A lie anyway; I haven't added support for the DSM command yet */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) +#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)) @@ -1584,10 +1616,32 @@ .err_handler = &nvme_err_handler, }; +/* XXX: not for upstream */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) +static int no_irq_set_affinity(unsigned int i, const struct cpumask *m) +{ + return 0; +} + +static void setup_irq_hint(void) +{ + if (irq_set_affinity_sym) { + irq_set_affinity_hint = (void *)irq_set_affinity_sym; + } else { + printk("Unable to set IRQ affinity!\n"); + irq_set_affinity_hint = no_irq_set_affinity; + } +} +#endif + static int __init nvme_init(void) { int result = -EBUSY; + /* XXX: Not for upstream */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) + setup_irq_hint(); +#endif nvme_thread = kthread_run(nvme_kthread, NULL, "nvme"); if (IS_ERR(nvme_thread)) return PTR_ERR(nvme_thread);