diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/Kbuild | 5 | ||||
| -rw-r--r-- | include/asm-avr32/arch-at32ap/board.h | 10 | ||||
| -rw-r--r-- | include/asm-generic/vmlinux.lds.h | 4 | ||||
| -rw-r--r-- | include/asm-powerpc/kvm_ppc.h | 3 | ||||
| -rw-r--r-- | include/asm-s390/kvm_host.h | 4 | ||||
| -rw-r--r-- | include/asm-x86/kvm_host.h | 1 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 | ||||
| -rw-r--r-- | include/linux/sched.h | 19 | ||||
| -rw-r--r-- | include/linux/task_io_accounting.h | 27 | ||||
| -rw-r--r-- | include/linux/task_io_accounting_ops.h | 56 | ||||
| -rw-r--r-- | include/net/ipv6.h | 2 | ||||
| -rw-r--r-- | include/net/route.h | 2 | ||||
| -rw-r--r-- | include/scsi/scsi.h | 3 | ||||
| -rw-r--r-- | include/scsi/scsi_cmnd.h | 86 | ||||
| -rw-r--r-- | include/scsi/scsi_device.h | 17 | ||||
| -rw-r--r-- | include/scsi/scsi_dh.h | 11 | ||||
| -rw-r--r-- | include/scsi/scsi_eh.h | 2 | ||||
| -rw-r--r-- | include/scsi/scsi_host.h | 86 |
18 files changed, 301 insertions, 38 deletions
diff --git a/include/Kbuild b/include/Kbuild index bdca155028ec..d8c3e3cbf416 100644 --- a/include/Kbuild +++ b/include/Kbuild | |||
| @@ -1,3 +1,6 @@ | |||
| 1 | # Top-level Makefile calls into asm-$(ARCH) | ||
| 2 | # List only non-arch directories below | ||
| 3 | |||
| 1 | header-y += asm-generic/ | 4 | header-y += asm-generic/ |
| 2 | header-y += linux/ | 5 | header-y += linux/ |
| 3 | header-y += sound/ | 6 | header-y += sound/ |
| @@ -5,5 +8,3 @@ header-y += mtd/ | |||
| 5 | header-y += rdma/ | 8 | header-y += rdma/ |
| 6 | header-y += video/ | 9 | header-y += video/ |
| 7 | header-y += drm/ | 10 | header-y += drm/ |
| 8 | |||
| 9 | header-y += asm-$(ARCH)/ | ||
diff --git a/include/asm-avr32/arch-at32ap/board.h b/include/asm-avr32/arch-at32ap/board.h index 893aa6d0cd11..e60e9076544d 100644 --- a/include/asm-avr32/arch-at32ap/board.h +++ b/include/asm-avr32/arch-at32ap/board.h | |||
| @@ -82,7 +82,15 @@ struct mci_platform_data; | |||
| 82 | struct platform_device * | 82 | struct platform_device * |
| 83 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data); | 83 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data); |
| 84 | 84 | ||
| 85 | struct platform_device *at32_add_device_ac97c(unsigned int id); | 85 | struct ac97c_platform_data { |
| 86 | unsigned short dma_rx_periph_id; | ||
| 87 | unsigned short dma_tx_periph_id; | ||
| 88 | unsigned short dma_controller_id; | ||
| 89 | int reset_pin; | ||
| 90 | }; | ||
| 91 | struct platform_device * | ||
| 92 | at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data); | ||
| 93 | |||
| 86 | struct platform_device *at32_add_device_abdac(unsigned int id); | 94 | struct platform_device *at32_add_device_abdac(unsigned int id); |
| 87 | struct platform_device *at32_add_device_psif(unsigned int id); | 95 | struct platform_device *at32_add_device_psif(unsigned int id); |
| 88 | 96 | ||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 9cd44b162ba1..6d88a923c945 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -221,6 +221,7 @@ | |||
| 221 | * during second ld run in second ld pass when generating System.map */ | 221 | * during second ld run in second ld pass when generating System.map */ |
| 222 | #define TEXT_TEXT \ | 222 | #define TEXT_TEXT \ |
| 223 | ALIGN_FUNCTION(); \ | 223 | ALIGN_FUNCTION(); \ |
| 224 | *(.text.hot) \ | ||
| 224 | *(.text) \ | 225 | *(.text) \ |
| 225 | *(.ref.text) \ | 226 | *(.ref.text) \ |
| 226 | *(.text.init.refok) \ | 227 | *(.text.init.refok) \ |
| @@ -230,7 +231,8 @@ | |||
| 230 | CPU_KEEP(init.text) \ | 231 | CPU_KEEP(init.text) \ |
| 231 | CPU_KEEP(exit.text) \ | 232 | CPU_KEEP(exit.text) \ |
| 232 | MEM_KEEP(init.text) \ | 233 | MEM_KEEP(init.text) \ |
| 233 | MEM_KEEP(exit.text) | 234 | MEM_KEEP(exit.text) \ |
| 235 | *(.text.unlikely) | ||
| 234 | 236 | ||
| 235 | 237 | ||
| 236 | /* sched.text is aling to function alignment to secure we have same | 238 | /* sched.text is aling to function alignment to secure we have same |
diff --git a/include/asm-powerpc/kvm_ppc.h b/include/asm-powerpc/kvm_ppc.h index 5a21115228af..a8b068792260 100644 --- a/include/asm-powerpc/kvm_ppc.h +++ b/include/asm-powerpc/kvm_ppc.h | |||
| @@ -61,7 +61,8 @@ extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu); | |||
| 61 | 61 | ||
| 62 | extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gfn_t gfn, | 62 | extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gfn_t gfn, |
| 63 | u64 asid, u32 flags); | 63 | u64 asid, u32 flags); |
| 64 | extern void kvmppc_mmu_invalidate(struct kvm_vcpu *vcpu, u64 eaddr, u64 asid); | 64 | extern void kvmppc_mmu_invalidate(struct kvm_vcpu *vcpu, gva_t eaddr, |
| 65 | gva_t eend, u32 asid); | ||
| 65 | extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode); | 66 | extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode); |
| 66 | 67 | ||
| 67 | extern void kvmppc_check_and_deliver_interrupts(struct kvm_vcpu *vcpu); | 68 | extern void kvmppc_check_and_deliver_interrupts(struct kvm_vcpu *vcpu); |
diff --git a/include/asm-s390/kvm_host.h b/include/asm-s390/kvm_host.h index 3234dd5b3511..3c55e4107dcc 100644 --- a/include/asm-s390/kvm_host.h +++ b/include/asm-s390/kvm_host.h | |||
| @@ -111,7 +111,7 @@ struct kvm_vcpu_stat { | |||
| 111 | u32 exit_validity; | 111 | u32 exit_validity; |
| 112 | u32 exit_instruction; | 112 | u32 exit_instruction; |
| 113 | u32 instruction_lctl; | 113 | u32 instruction_lctl; |
| 114 | u32 instruction_lctg; | 114 | u32 instruction_lctlg; |
| 115 | u32 exit_program_interruption; | 115 | u32 exit_program_interruption; |
| 116 | u32 exit_instr_and_program; | 116 | u32 exit_instr_and_program; |
| 117 | u32 deliver_emergency_signal; | 117 | u32 deliver_emergency_signal; |
| @@ -231,5 +231,5 @@ struct kvm_arch{ | |||
| 231 | struct kvm_s390_float_interrupt float_int; | 231 | struct kvm_s390_float_interrupt float_int; |
| 232 | }; | 232 | }; |
| 233 | 233 | ||
| 234 | extern int sie64a(struct kvm_s390_sie_block *, __u64 *); | 234 | extern int sie64a(struct kvm_s390_sie_block *, unsigned long *); |
| 235 | #endif | 235 | #endif |
diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h index fdde0bedaa90..bc34dc21f178 100644 --- a/include/asm-x86/kvm_host.h +++ b/include/asm-x86/kvm_host.h | |||
| @@ -556,6 +556,7 @@ int kvm_fix_hypercall(struct kvm_vcpu *vcpu); | |||
| 556 | int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code); | 556 | int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code); |
| 557 | 557 | ||
| 558 | void kvm_enable_tdp(void); | 558 | void kvm_enable_tdp(void); |
| 559 | void kvm_disable_tdp(void); | ||
| 559 | 560 | ||
| 560 | int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3); | 561 | int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3); |
| 561 | int complete_pio(struct kvm_vcpu *vcpu); | 562 | int complete_pio(struct kvm_vcpu *vcpu); |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index ffe479ba0779..35a78415accc 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -748,6 +748,7 @@ | |||
| 748 | #define PCI_VENDOR_ID_TI 0x104c | 748 | #define PCI_VENDOR_ID_TI 0x104c |
| 749 | #define PCI_DEVICE_ID_TI_TVP4020 0x3d07 | 749 | #define PCI_DEVICE_ID_TI_TVP4020 0x3d07 |
| 750 | #define PCI_DEVICE_ID_TI_4450 0x8011 | 750 | #define PCI_DEVICE_ID_TI_4450 0x8011 |
| 751 | #define PCI_DEVICE_ID_TI_TSB43AB22 0x8023 | ||
| 751 | #define PCI_DEVICE_ID_TI_XX21_XX11 0x8031 | 752 | #define PCI_DEVICE_ID_TI_XX21_XX11 0x8031 |
| 752 | #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 | 753 | #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 |
| 753 | #define PCI_DEVICE_ID_TI_XX21_XX11_SD 0x8034 | 754 | #define PCI_DEVICE_ID_TI_XX21_XX11_SD 0x8034 |
diff --git a/include/linux/sched.h b/include/linux/sched.h index f59318a0099b..034c1ca6b332 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -505,10 +505,7 @@ struct signal_struct { | |||
| 505 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; | 505 | unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; |
| 506 | unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt; | 506 | unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt; |
| 507 | unsigned long inblock, oublock, cinblock, coublock; | 507 | unsigned long inblock, oublock, cinblock, coublock; |
| 508 | #ifdef CONFIG_TASK_XACCT | 508 | struct proc_io_accounting ioac; |
| 509 | u64 rchar, wchar, syscr, syscw; | ||
| 510 | #endif | ||
| 511 | struct task_io_accounting ioac; | ||
| 512 | 509 | ||
| 513 | /* | 510 | /* |
| 514 | * Cumulative ns of scheduled CPU time for dead threads in the | 511 | * Cumulative ns of scheduled CPU time for dead threads in the |
| @@ -1256,11 +1253,7 @@ struct task_struct { | |||
| 1256 | 1253 | ||
| 1257 | unsigned long ptrace_message; | 1254 | unsigned long ptrace_message; |
| 1258 | siginfo_t *last_siginfo; /* For ptrace use. */ | 1255 | siginfo_t *last_siginfo; /* For ptrace use. */ |
| 1259 | #ifdef CONFIG_TASK_XACCT | 1256 | struct proc_io_accounting ioac; |
| 1260 | /* i/o counters(bytes read/written, #syscalls */ | ||
| 1261 | u64 rchar, wchar, syscr, syscw; | ||
| 1262 | #endif | ||
| 1263 | struct task_io_accounting ioac; | ||
| 1264 | #if defined(CONFIG_TASK_XACCT) | 1257 | #if defined(CONFIG_TASK_XACCT) |
| 1265 | u64 acct_rss_mem1; /* accumulated rss usage */ | 1258 | u64 acct_rss_mem1; /* accumulated rss usage */ |
| 1266 | u64 acct_vm_mem1; /* accumulated virtual memory usage */ | 1259 | u64 acct_vm_mem1; /* accumulated virtual memory usage */ |
| @@ -2190,22 +2183,22 @@ extern long sched_group_rt_period(struct task_group *tg); | |||
| 2190 | #ifdef CONFIG_TASK_XACCT | 2183 | #ifdef CONFIG_TASK_XACCT |
| 2191 | static inline void add_rchar(struct task_struct *tsk, ssize_t amt) | 2184 | static inline void add_rchar(struct task_struct *tsk, ssize_t amt) |
| 2192 | { | 2185 | { |
| 2193 | tsk->rchar += amt; | 2186 | tsk->ioac.chr.rchar += amt; |
| 2194 | } | 2187 | } |
| 2195 | 2188 | ||
| 2196 | static inline void add_wchar(struct task_struct *tsk, ssize_t amt) | 2189 | static inline void add_wchar(struct task_struct *tsk, ssize_t amt) |
| 2197 | { | 2190 | { |
| 2198 | tsk->wchar += amt; | 2191 | tsk->ioac.chr.wchar += amt; |
| 2199 | } | 2192 | } |
| 2200 | 2193 | ||
| 2201 | static inline void inc_syscr(struct task_struct *tsk) | 2194 | static inline void inc_syscr(struct task_struct *tsk) |
| 2202 | { | 2195 | { |
| 2203 | tsk->syscr++; | 2196 | tsk->ioac.chr.syscr++; |
| 2204 | } | 2197 | } |
| 2205 | 2198 | ||
| 2206 | static inline void inc_syscw(struct task_struct *tsk) | 2199 | static inline void inc_syscw(struct task_struct *tsk) |
| 2207 | { | 2200 | { |
| 2208 | tsk->syscw++; | 2201 | tsk->ioac.chr.syscw++; |
| 2209 | } | 2202 | } |
| 2210 | #else | 2203 | #else |
| 2211 | static inline void add_rchar(struct task_struct *tsk, ssize_t amt) | 2204 | static inline void add_rchar(struct task_struct *tsk, ssize_t amt) |
diff --git a/include/linux/task_io_accounting.h b/include/linux/task_io_accounting.h index 44d00e9cceea..165390f8b936 100644 --- a/include/linux/task_io_accounting.h +++ b/include/linux/task_io_accounting.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * task_io_accounting: a structure which is used for recording a single task's | 2 | * proc_io_accounting: a structure which is used for recording a single task's |
| 3 | * IO statistics. | 3 | * IO statistics. |
| 4 | * | 4 | * |
| 5 | * Don't include this header file directly - it is designed to be dragged in via | 5 | * Don't include this header file directly - it is designed to be dragged in via |
| @@ -8,6 +8,22 @@ | |||
| 8 | * Blame akpm@osdl.org for all this. | 8 | * Blame akpm@osdl.org for all this. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_TASK_XACCT | ||
| 12 | struct task_chr_io_accounting { | ||
| 13 | /* bytes read */ | ||
| 14 | u64 rchar; | ||
| 15 | /* bytes written */ | ||
| 16 | u64 wchar; | ||
| 17 | /* # of read syscalls */ | ||
| 18 | u64 syscr; | ||
| 19 | /* # of write syscalls */ | ||
| 20 | u64 syscw; | ||
| 21 | }; | ||
| 22 | #else /* CONFIG_TASK_XACCT */ | ||
| 23 | struct task_chr_io_accounting { | ||
| 24 | }; | ||
| 25 | #endif /* CONFIG_TASK_XACCT */ | ||
| 26 | |||
| 11 | #ifdef CONFIG_TASK_IO_ACCOUNTING | 27 | #ifdef CONFIG_TASK_IO_ACCOUNTING |
| 12 | struct task_io_accounting { | 28 | struct task_io_accounting { |
| 13 | /* | 29 | /* |
| @@ -31,7 +47,12 @@ struct task_io_accounting { | |||
| 31 | */ | 47 | */ |
| 32 | u64 cancelled_write_bytes; | 48 | u64 cancelled_write_bytes; |
| 33 | }; | 49 | }; |
| 34 | #else | 50 | #else /* CONFIG_TASK_IO_ACCOUNTING */ |
| 35 | struct task_io_accounting { | 51 | struct task_io_accounting { |
| 36 | }; | 52 | }; |
| 37 | #endif | 53 | #endif /* CONFIG_TASK_IO_ACCOUNTING */ |
| 54 | |||
| 55 | struct proc_io_accounting { | ||
| 56 | struct task_chr_io_accounting chr; | ||
| 57 | struct task_io_accounting blk; | ||
| 58 | }; | ||
diff --git a/include/linux/task_io_accounting_ops.h b/include/linux/task_io_accounting_ops.h index ff46c6fad79d..e6f958ebe97f 100644 --- a/include/linux/task_io_accounting_ops.h +++ b/include/linux/task_io_accounting_ops.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #ifdef CONFIG_TASK_IO_ACCOUNTING | 9 | #ifdef CONFIG_TASK_IO_ACCOUNTING |
| 10 | static inline void task_io_account_read(size_t bytes) | 10 | static inline void task_io_account_read(size_t bytes) |
| 11 | { | 11 | { |
| 12 | current->ioac.read_bytes += bytes; | 12 | current->ioac.blk.read_bytes += bytes; |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | /* | 15 | /* |
| @@ -18,12 +18,12 @@ static inline void task_io_account_read(size_t bytes) | |||
| 18 | */ | 18 | */ |
| 19 | static inline unsigned long task_io_get_inblock(const struct task_struct *p) | 19 | static inline unsigned long task_io_get_inblock(const struct task_struct *p) |
| 20 | { | 20 | { |
| 21 | return p->ioac.read_bytes >> 9; | 21 | return p->ioac.blk.read_bytes >> 9; |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | static inline void task_io_account_write(size_t bytes) | 24 | static inline void task_io_account_write(size_t bytes) |
| 25 | { | 25 | { |
| 26 | current->ioac.write_bytes += bytes; | 26 | current->ioac.blk.write_bytes += bytes; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | /* | 29 | /* |
| @@ -32,17 +32,25 @@ static inline void task_io_account_write(size_t bytes) | |||
| 32 | */ | 32 | */ |
| 33 | static inline unsigned long task_io_get_oublock(const struct task_struct *p) | 33 | static inline unsigned long task_io_get_oublock(const struct task_struct *p) |
| 34 | { | 34 | { |
| 35 | return p->ioac.write_bytes >> 9; | 35 | return p->ioac.blk.write_bytes >> 9; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | static inline void task_io_account_cancelled_write(size_t bytes) | 38 | static inline void task_io_account_cancelled_write(size_t bytes) |
| 39 | { | 39 | { |
| 40 | current->ioac.cancelled_write_bytes += bytes; | 40 | current->ioac.blk.cancelled_write_bytes += bytes; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | static inline void task_io_accounting_init(struct task_struct *tsk) | 43 | static inline void task_io_accounting_init(struct proc_io_accounting *ioac) |
| 44 | { | 44 | { |
| 45 | memset(&tsk->ioac, 0, sizeof(tsk->ioac)); | 45 | memset(ioac, 0, sizeof(*ioac)); |
| 46 | } | ||
| 47 | |||
| 48 | static inline void task_blk_io_accounting_add(struct proc_io_accounting *dst, | ||
| 49 | struct proc_io_accounting *src) | ||
| 50 | { | ||
| 51 | dst->blk.read_bytes += src->blk.read_bytes; | ||
| 52 | dst->blk.write_bytes += src->blk.write_bytes; | ||
| 53 | dst->blk.cancelled_write_bytes += src->blk.cancelled_write_bytes; | ||
| 46 | } | 54 | } |
| 47 | 55 | ||
| 48 | #else | 56 | #else |
| @@ -69,9 +77,37 @@ static inline void task_io_account_cancelled_write(size_t bytes) | |||
| 69 | { | 77 | { |
| 70 | } | 78 | } |
| 71 | 79 | ||
| 72 | static inline void task_io_accounting_init(struct task_struct *tsk) | 80 | static inline void task_io_accounting_init(struct proc_io_accounting *ioac) |
| 81 | { | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline void task_blk_io_accounting_add(struct proc_io_accounting *dst, | ||
| 85 | struct proc_io_accounting *src) | ||
| 73 | { | 86 | { |
| 74 | } | 87 | } |
| 75 | 88 | ||
| 76 | #endif /* CONFIG_TASK_IO_ACCOUNTING */ | 89 | #endif /* CONFIG_TASK_IO_ACCOUNTING */ |
| 77 | #endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */ | 90 | |
| 91 | #ifdef CONFIG_TASK_XACCT | ||
| 92 | static inline void task_chr_io_accounting_add(struct proc_io_accounting *dst, | ||
| 93 | struct proc_io_accounting *src) | ||
| 94 | { | ||
| 95 | dst->chr.rchar += src->chr.rchar; | ||
| 96 | dst->chr.wchar += src->chr.wchar; | ||
| 97 | dst->chr.syscr += src->chr.syscr; | ||
| 98 | dst->chr.syscw += src->chr.syscw; | ||
| 99 | } | ||
| 100 | #else | ||
| 101 | static inline void task_chr_io_accounting_add(struct proc_io_accounting *dst, | ||
| 102 | struct proc_io_accounting *src) | ||
| 103 | { | ||
| 104 | } | ||
| 105 | #endif /* CONFIG_TASK_XACCT */ | ||
| 106 | |||
| 107 | static inline void task_io_accounting_add(struct proc_io_accounting *dst, | ||
| 108 | struct proc_io_accounting *src) | ||
| 109 | { | ||
| 110 | task_chr_io_accounting_add(dst, src); | ||
| 111 | task_blk_io_accounting_add(dst, src); | ||
| 112 | } | ||
| 113 | #endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */ | ||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 2d5c18514a2d..113028fb8f66 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -608,6 +608,8 @@ extern struct ctl_table *ipv6_icmp_sysctl_init(struct net *net); | |||
| 608 | extern struct ctl_table *ipv6_route_sysctl_init(struct net *net); | 608 | extern struct ctl_table *ipv6_route_sysctl_init(struct net *net); |
| 609 | extern int ipv6_sysctl_register(void); | 609 | extern int ipv6_sysctl_register(void); |
| 610 | extern void ipv6_sysctl_unregister(void); | 610 | extern void ipv6_sysctl_unregister(void); |
| 611 | extern int ipv6_static_sysctl_register(void); | ||
| 612 | extern void ipv6_static_sysctl_unregister(void); | ||
| 611 | #endif | 613 | #endif |
| 612 | 614 | ||
| 613 | #endif /* __KERNEL__ */ | 615 | #endif /* __KERNEL__ */ |
diff --git a/include/net/route.h b/include/net/route.h index 3140cc500854..4f0d8c14736c 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -204,6 +204,4 @@ static inline struct inet_peer *rt_get_peer(struct rtable *rt) | |||
| 204 | return rt->peer; | 204 | return rt->peer; |
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | extern ctl_table ipv4_route_table[]; | ||
| 208 | |||
| 209 | #endif /* _ROUTE_H */ | 207 | #endif /* _ROUTE_H */ |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 00137a7769ee..5c40cc537d4c 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
| @@ -106,6 +106,7 @@ | |||
| 106 | #define VARIABLE_LENGTH_CMD 0x7f | 106 | #define VARIABLE_LENGTH_CMD 0x7f |
| 107 | #define REPORT_LUNS 0xa0 | 107 | #define REPORT_LUNS 0xa0 |
| 108 | #define MAINTENANCE_IN 0xa3 | 108 | #define MAINTENANCE_IN 0xa3 |
| 109 | #define MAINTENANCE_OUT 0xa4 | ||
| 109 | #define MOVE_MEDIUM 0xa5 | 110 | #define MOVE_MEDIUM 0xa5 |
| 110 | #define EXCHANGE_MEDIUM 0xa6 | 111 | #define EXCHANGE_MEDIUM 0xa6 |
| 111 | #define READ_12 0xa8 | 112 | #define READ_12 0xa8 |
| @@ -125,6 +126,8 @@ | |||
| 125 | #define SAI_READ_CAPACITY_16 0x10 | 126 | #define SAI_READ_CAPACITY_16 0x10 |
| 126 | /* values for maintenance in */ | 127 | /* values for maintenance in */ |
| 127 | #define MI_REPORT_TARGET_PGS 0x0a | 128 | #define MI_REPORT_TARGET_PGS 0x0a |
| 129 | /* values for maintenance out */ | ||
| 130 | #define MO_SET_TARGET_PGS 0x0a | ||
| 128 | 131 | ||
| 129 | /* Values for T10/04-262r7 */ | 132 | /* Values for T10/04-262r7 */ |
| 130 | #define ATA_16 0x85 /* 16-byte pass-thru */ | 133 | #define ATA_16 0x85 /* 16-byte pass-thru */ |
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 66c944849d6b..f9f6e793575c 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h | |||
| @@ -77,6 +77,9 @@ struct scsi_cmnd { | |||
| 77 | int allowed; | 77 | int allowed; |
| 78 | int timeout_per_command; | 78 | int timeout_per_command; |
| 79 | 79 | ||
| 80 | unsigned char prot_op; | ||
| 81 | unsigned char prot_type; | ||
| 82 | |||
| 80 | unsigned short cmd_len; | 83 | unsigned short cmd_len; |
| 81 | enum dma_data_direction sc_data_direction; | 84 | enum dma_data_direction sc_data_direction; |
| 82 | 85 | ||
| @@ -87,6 +90,8 @@ struct scsi_cmnd { | |||
| 87 | 90 | ||
| 88 | /* These elements define the operation we ultimately want to perform */ | 91 | /* These elements define the operation we ultimately want to perform */ |
| 89 | struct scsi_data_buffer sdb; | 92 | struct scsi_data_buffer sdb; |
| 93 | struct scsi_data_buffer *prot_sdb; | ||
| 94 | |||
| 90 | unsigned underflow; /* Return error if less than | 95 | unsigned underflow; /* Return error if less than |
| 91 | this amount is transferred */ | 96 | this amount is transferred */ |
| 92 | 97 | ||
| @@ -208,4 +213,85 @@ static inline int scsi_sg_copy_to_buffer(struct scsi_cmnd *cmd, | |||
| 208 | buf, buflen); | 213 | buf, buflen); |
| 209 | } | 214 | } |
| 210 | 215 | ||
| 216 | /* | ||
| 217 | * The operations below are hints that tell the controller driver how | ||
| 218 | * to handle I/Os with DIF or similar types of protection information. | ||
| 219 | */ | ||
| 220 | enum scsi_prot_operations { | ||
| 221 | /* Normal I/O */ | ||
| 222 | SCSI_PROT_NORMAL = 0, | ||
| 223 | |||
| 224 | /* OS-HBA: Protected, HBA-Target: Unprotected */ | ||
| 225 | SCSI_PROT_READ_INSERT, | ||
| 226 | SCSI_PROT_WRITE_STRIP, | ||
| 227 | |||
| 228 | /* OS-HBA: Unprotected, HBA-Target: Protected */ | ||
| 229 | SCSI_PROT_READ_STRIP, | ||
| 230 | SCSI_PROT_WRITE_INSERT, | ||
| 231 | |||
| 232 | /* OS-HBA: Protected, HBA-Target: Protected */ | ||
| 233 | SCSI_PROT_READ_PASS, | ||
| 234 | SCSI_PROT_WRITE_PASS, | ||
| 235 | |||
| 236 | /* OS-HBA: Protected, HBA-Target: Protected, checksum conversion */ | ||
| 237 | SCSI_PROT_READ_CONVERT, | ||
| 238 | SCSI_PROT_WRITE_CONVERT, | ||
| 239 | }; | ||
| 240 | |||
| 241 | static inline void scsi_set_prot_op(struct scsi_cmnd *scmd, unsigned char op) | ||
| 242 | { | ||
| 243 | scmd->prot_op = op; | ||
| 244 | } | ||
| 245 | |||
| 246 | static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd) | ||
| 247 | { | ||
| 248 | return scmd->prot_op; | ||
| 249 | } | ||
| 250 | |||
| 251 | /* | ||
| 252 | * The controller usually does not know anything about the target it | ||
| 253 | * is communicating with. However, when DIX is enabled the controller | ||
| 254 | * must be know target type so it can verify the protection | ||
| 255 | * information passed along with the I/O. | ||
| 256 | */ | ||
| 257 | enum scsi_prot_target_type { | ||
| 258 | SCSI_PROT_DIF_TYPE0 = 0, | ||
| 259 | SCSI_PROT_DIF_TYPE1, | ||
| 260 | SCSI_PROT_DIF_TYPE2, | ||
| 261 | SCSI_PROT_DIF_TYPE3, | ||
| 262 | }; | ||
| 263 | |||
| 264 | static inline void scsi_set_prot_type(struct scsi_cmnd *scmd, unsigned char type) | ||
| 265 | { | ||
| 266 | scmd->prot_type = type; | ||
| 267 | } | ||
| 268 | |||
| 269 | static inline unsigned char scsi_get_prot_type(struct scsi_cmnd *scmd) | ||
| 270 | { | ||
| 271 | return scmd->prot_type; | ||
| 272 | } | ||
| 273 | |||
| 274 | static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd) | ||
| 275 | { | ||
| 276 | return scmd->request->sector; | ||
| 277 | } | ||
| 278 | |||
| 279 | static inline unsigned scsi_prot_sg_count(struct scsi_cmnd *cmd) | ||
| 280 | { | ||
| 281 | return cmd->prot_sdb ? cmd->prot_sdb->table.nents : 0; | ||
| 282 | } | ||
| 283 | |||
| 284 | static inline struct scatterlist *scsi_prot_sglist(struct scsi_cmnd *cmd) | ||
| 285 | { | ||
| 286 | return cmd->prot_sdb ? cmd->prot_sdb->table.sgl : NULL; | ||
| 287 | } | ||
| 288 | |||
| 289 | static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd) | ||
| 290 | { | ||
| 291 | return cmd->prot_sdb; | ||
| 292 | } | ||
| 293 | |||
| 294 | #define scsi_for_each_prot_sg(cmd, sg, nseg, __i) \ | ||
| 295 | for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i) | ||
| 296 | |||
| 211 | #endif /* _SCSI_SCSI_CMND_H */ | 297 | #endif /* _SCSI_SCSI_CMND_H */ |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 6467f78b191f..291d56a19167 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
| @@ -140,7 +140,8 @@ struct scsi_device { | |||
| 140 | unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */ | 140 | unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */ |
| 141 | unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */ | 141 | unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */ |
| 142 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ | 142 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ |
| 143 | unsigned last_sector_bug:1; /* Always read last sector in a 1 sector read */ | 143 | unsigned last_sector_bug:1; /* do not use multisector accesses on |
| 144 | SD_LAST_BUGGY_SECTORS */ | ||
| 144 | 145 | ||
| 145 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ | 146 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ |
| 146 | struct list_head event_list; /* asserted events */ | 147 | struct list_head event_list; /* asserted events */ |
| @@ -167,15 +168,22 @@ struct scsi_device { | |||
| 167 | unsigned long sdev_data[0]; | 168 | unsigned long sdev_data[0]; |
| 168 | } __attribute__((aligned(sizeof(unsigned long)))); | 169 | } __attribute__((aligned(sizeof(unsigned long)))); |
| 169 | 170 | ||
| 171 | struct scsi_dh_devlist { | ||
| 172 | char *vendor; | ||
| 173 | char *model; | ||
| 174 | }; | ||
| 175 | |||
| 170 | struct scsi_device_handler { | 176 | struct scsi_device_handler { |
| 171 | /* Used by the infrastructure */ | 177 | /* Used by the infrastructure */ |
| 172 | struct list_head list; /* list of scsi_device_handlers */ | 178 | struct list_head list; /* list of scsi_device_handlers */ |
| 173 | struct notifier_block nb; | ||
| 174 | 179 | ||
| 175 | /* Filled by the hardware handler */ | 180 | /* Filled by the hardware handler */ |
| 176 | struct module *module; | 181 | struct module *module; |
| 177 | const char *name; | 182 | const char *name; |
| 183 | const struct scsi_dh_devlist *devlist; | ||
| 178 | int (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *); | 184 | int (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *); |
| 185 | int (*attach)(struct scsi_device *); | ||
| 186 | void (*detach)(struct scsi_device *); | ||
| 179 | int (*activate)(struct scsi_device *); | 187 | int (*activate)(struct scsi_device *); |
| 180 | int (*prep_fn)(struct scsi_device *, struct request *); | 188 | int (*prep_fn)(struct scsi_device *, struct request *); |
| 181 | }; | 189 | }; |
| @@ -416,6 +424,11 @@ static inline int scsi_device_enclosure(struct scsi_device *sdev) | |||
| 416 | return sdev->inquiry[6] & (1<<6); | 424 | return sdev->inquiry[6] & (1<<6); |
| 417 | } | 425 | } |
| 418 | 426 | ||
| 427 | static inline int scsi_device_protection(struct scsi_device *sdev) | ||
| 428 | { | ||
| 429 | return sdev->inquiry[5] & (1<<0); | ||
| 430 | } | ||
| 431 | |||
| 419 | #define MODULE_ALIAS_SCSI_DEVICE(type) \ | 432 | #define MODULE_ALIAS_SCSI_DEVICE(type) \ |
| 420 | MODULE_ALIAS("scsi:t-" __stringify(type) "*") | 433 | MODULE_ALIAS("scsi:t-" __stringify(type) "*") |
| 421 | #define SCSI_DEVICE_MODALIAS_FMT "scsi:t-0x%02x" | 434 | #define SCSI_DEVICE_MODALIAS_FMT "scsi:t-0x%02x" |
diff --git a/include/scsi/scsi_dh.h b/include/scsi/scsi_dh.h index 3ad2303d1a16..33efce20c26c 100644 --- a/include/scsi/scsi_dh.h +++ b/include/scsi/scsi_dh.h | |||
| @@ -32,6 +32,7 @@ enum { | |||
| 32 | */ | 32 | */ |
| 33 | SCSI_DH_DEV_FAILED, /* generic device error */ | 33 | SCSI_DH_DEV_FAILED, /* generic device error */ |
| 34 | SCSI_DH_DEV_TEMP_BUSY, | 34 | SCSI_DH_DEV_TEMP_BUSY, |
| 35 | SCSI_DH_DEV_UNSUPP, /* device handler not supported */ | ||
| 35 | SCSI_DH_DEVICE_MAX, /* max device blkerr definition */ | 36 | SCSI_DH_DEVICE_MAX, /* max device blkerr definition */ |
| 36 | 37 | ||
| 37 | /* | 38 | /* |
| @@ -57,6 +58,8 @@ enum { | |||
| 57 | #if defined(CONFIG_SCSI_DH) || defined(CONFIG_SCSI_DH_MODULE) | 58 | #if defined(CONFIG_SCSI_DH) || defined(CONFIG_SCSI_DH_MODULE) |
| 58 | extern int scsi_dh_activate(struct request_queue *); | 59 | extern int scsi_dh_activate(struct request_queue *); |
| 59 | extern int scsi_dh_handler_exist(const char *); | 60 | extern int scsi_dh_handler_exist(const char *); |
| 61 | extern int scsi_dh_attach(struct request_queue *, const char *); | ||
| 62 | extern void scsi_dh_detach(struct request_queue *); | ||
| 60 | #else | 63 | #else |
| 61 | static inline int scsi_dh_activate(struct request_queue *req) | 64 | static inline int scsi_dh_activate(struct request_queue *req) |
| 62 | { | 65 | { |
| @@ -66,4 +69,12 @@ static inline int scsi_dh_handler_exist(const char *name) | |||
| 66 | { | 69 | { |
| 67 | return 0; | 70 | return 0; |
| 68 | } | 71 | } |
| 72 | static inline int scsi_dh_attach(struct request_queue *req, const char *name) | ||
| 73 | { | ||
| 74 | return SCSI_DH_NOSYS; | ||
| 75 | } | ||
| 76 | static inline void scsi_dh_detach(struct request_queue *q) | ||
| 77 | { | ||
| 78 | return; | ||
| 79 | } | ||
| 69 | #endif | 80 | #endif |
diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h index 2a9add21267d..06a8790893ef 100644 --- a/include/scsi/scsi_eh.h +++ b/include/scsi/scsi_eh.h | |||
| @@ -74,7 +74,9 @@ struct scsi_eh_save { | |||
| 74 | /* saved state */ | 74 | /* saved state */ |
| 75 | int result; | 75 | int result; |
| 76 | enum dma_data_direction data_direction; | 76 | enum dma_data_direction data_direction; |
| 77 | unsigned underflow; | ||
| 77 | unsigned char cmd_len; | 78 | unsigned char cmd_len; |
| 79 | unsigned char prot_op; | ||
| 78 | unsigned char *cmnd; | 80 | unsigned char *cmnd; |
| 79 | struct scsi_data_buffer sdb; | 81 | struct scsi_data_buffer sdb; |
| 80 | struct request *next_rq; | 82 | struct request *next_rq; |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index a594bac4a77d..44a55d1bf530 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
| @@ -547,7 +547,7 @@ struct Scsi_Host { | |||
| 547 | unsigned int host_failed; /* commands that failed. */ | 547 | unsigned int host_failed; /* commands that failed. */ |
| 548 | unsigned int host_eh_scheduled; /* EH scheduled without command */ | 548 | unsigned int host_eh_scheduled; /* EH scheduled without command */ |
| 549 | 549 | ||
| 550 | unsigned short host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ | 550 | unsigned int host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ |
| 551 | int resetting; /* if set, it means that last_reset is a valid value */ | 551 | int resetting; /* if set, it means that last_reset is a valid value */ |
| 552 | unsigned long last_reset; | 552 | unsigned long last_reset; |
| 553 | 553 | ||
| @@ -636,6 +636,10 @@ struct Scsi_Host { | |||
| 636 | */ | 636 | */ |
| 637 | unsigned int max_host_blocked; | 637 | unsigned int max_host_blocked; |
| 638 | 638 | ||
| 639 | /* Protection Information */ | ||
| 640 | unsigned int prot_capabilities; | ||
| 641 | unsigned char prot_guard_type; | ||
| 642 | |||
| 639 | /* | 643 | /* |
| 640 | * q used for scsi_tgt msgs, async events or any other requests that | 644 | * q used for scsi_tgt msgs, async events or any other requests that |
| 641 | * need to be processed in userspace | 645 | * need to be processed in userspace |
| @@ -756,6 +760,86 @@ extern struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost, | |||
| 756 | extern void scsi_free_host_dev(struct scsi_device *); | 760 | extern void scsi_free_host_dev(struct scsi_device *); |
| 757 | extern struct scsi_device *scsi_get_host_dev(struct Scsi_Host *); | 761 | extern struct scsi_device *scsi_get_host_dev(struct Scsi_Host *); |
| 758 | 762 | ||
| 763 | /* | ||
| 764 | * DIF defines the exchange of protection information between | ||
| 765 | * initiator and SBC block device. | ||
| 766 | * | ||
| 767 | * DIX defines the exchange of protection information between OS and | ||
| 768 | * initiator. | ||
| 769 | */ | ||
| 770 | enum scsi_host_prot_capabilities { | ||
| 771 | SHOST_DIF_TYPE1_PROTECTION = 1 << 0, /* T10 DIF Type 1 */ | ||
| 772 | SHOST_DIF_TYPE2_PROTECTION = 1 << 1, /* T10 DIF Type 2 */ | ||
| 773 | SHOST_DIF_TYPE3_PROTECTION = 1 << 2, /* T10 DIF Type 3 */ | ||
| 774 | |||
| 775 | SHOST_DIX_TYPE0_PROTECTION = 1 << 3, /* DIX between OS and HBA only */ | ||
| 776 | SHOST_DIX_TYPE1_PROTECTION = 1 << 4, /* DIX with DIF Type 1 */ | ||
| 777 | SHOST_DIX_TYPE2_PROTECTION = 1 << 5, /* DIX with DIF Type 2 */ | ||
| 778 | SHOST_DIX_TYPE3_PROTECTION = 1 << 6, /* DIX with DIF Type 3 */ | ||
| 779 | }; | ||
| 780 | |||
| 781 | /* | ||
| 782 | * SCSI hosts which support the Data Integrity Extensions must | ||
| 783 | * indicate their capabilities by setting the prot_capabilities using | ||
| 784 | * this call. | ||
| 785 | */ | ||
| 786 | static inline void scsi_host_set_prot(struct Scsi_Host *shost, unsigned int mask) | ||
| 787 | { | ||
| 788 | shost->prot_capabilities = mask; | ||
| 789 | } | ||
| 790 | |||
| 791 | static inline unsigned int scsi_host_get_prot(struct Scsi_Host *shost) | ||
| 792 | { | ||
| 793 | return shost->prot_capabilities; | ||
| 794 | } | ||
| 795 | |||
| 796 | static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) | ||
| 797 | { | ||
| 798 | switch (target_type) { | ||
| 799 | case 1: return shost->prot_capabilities & SHOST_DIF_TYPE1_PROTECTION; | ||
| 800 | case 2: return shost->prot_capabilities & SHOST_DIF_TYPE2_PROTECTION; | ||
| 801 | case 3: return shost->prot_capabilities & SHOST_DIF_TYPE3_PROTECTION; | ||
| 802 | } | ||
| 803 | |||
| 804 | return 0; | ||
| 805 | } | ||
| 806 | |||
| 807 | static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsigned int target_type) | ||
| 808 | { | ||
| 809 | switch (target_type) { | ||
| 810 | case 0: return shost->prot_capabilities & SHOST_DIX_TYPE0_PROTECTION; | ||
| 811 | case 1: return shost->prot_capabilities & SHOST_DIX_TYPE1_PROTECTION; | ||
| 812 | case 2: return shost->prot_capabilities & SHOST_DIX_TYPE2_PROTECTION; | ||
| 813 | case 3: return shost->prot_capabilities & SHOST_DIX_TYPE3_PROTECTION; | ||
| 814 | } | ||
| 815 | |||
| 816 | return 0; | ||
| 817 | } | ||
| 818 | |||
| 819 | /* | ||
| 820 | * All DIX-capable initiators must support the T10-mandated CRC | ||
| 821 | * checksum. Controllers can optionally implement the IP checksum | ||
| 822 | * scheme which has much lower impact on system performance. Note | ||
| 823 | * that the main rationale for the checksum is to match integrity | ||
| 824 | * metadata with data. Detecting bit errors are a job for ECC memory | ||
| 825 | * and buses. | ||
| 826 | */ | ||
| 827 | |||
| 828 | enum scsi_host_guard_type { | ||
| 829 | SHOST_DIX_GUARD_CRC = 1 << 0, | ||
| 830 | SHOST_DIX_GUARD_IP = 1 << 1, | ||
| 831 | }; | ||
| 832 | |||
| 833 | static inline void scsi_host_set_guard(struct Scsi_Host *shost, unsigned char type) | ||
| 834 | { | ||
| 835 | shost->prot_guard_type = type; | ||
| 836 | } | ||
| 837 | |||
| 838 | static inline unsigned char scsi_host_get_guard(struct Scsi_Host *shost) | ||
| 839 | { | ||
| 840 | return shost->prot_guard_type; | ||
| 841 | } | ||
| 842 | |||
| 759 | /* legacy interfaces */ | 843 | /* legacy interfaces */ |
| 760 | extern struct Scsi_Host *scsi_register(struct scsi_host_template *, int); | 844 | extern struct Scsi_Host *scsi_register(struct scsi_host_template *, int); |
| 761 | extern void scsi_unregister(struct Scsi_Host *); | 845 | extern void scsi_unregister(struct Scsi_Host *); |
