diff options
| author | Olof Johansson <olof@lixom.net> | 2014-11-02 16:36:05 -0500 |
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2014-11-02 16:37:07 -0500 |
| commit | 4257412db57900e43716d0b7ddd4f4a51e6ed2f4 (patch) | |
| tree | 759963245a484422e9ad2639cb223b53f844ff15 /include | |
| parent | cc040ba269ae6972face1dc7376ab3eaab9f64c8 (diff) | |
| parent | 4b91f7f3c8b20e073b7bfc098625b37f99789508 (diff) | |
Merge tag 'fixes-against-v3.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes
Merge "omap fixes against v3.18-rc2" from Tony Lindgren:
Few fixes for omaps to enable NAND BCH so devices won't
produce errors when booted with omap2plus_defconfig, and
reduce bloat by making IPV6 a loadable module.
Also let's add a warning about legacy boot being deprecated
for omap3.
We now have things working with device tree, and only omap3 is
still booting in legacy mode. So hopefully this warning will
help move the remaining legacy mode users to boot with device
tree.
As the total reduction of code and static data is somewhere
around 20000 lines of code once we remove omap3 legacy mode
booting, we really do want to make omap3 to boot also in
device tree mode only over the next few merge cycles.
* tag 'fixes-against-v3.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: (407 commits)
ARM: OMAP2+: Warn about deprecated legacy booting mode
ARM: omap2plus_defconfig: Fix errors with NAND BCH
ARM: omap2plus_defconfig: Fix bloat caused by having ipv6 built-in
+ Linux 3.18-rc2
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'include')
44 files changed, 675 insertions, 58 deletions
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h index f97804bdf1ff..7461327e14e4 100644 --- a/include/acpi/acnames.h +++ b/include/acpi/acnames.h | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | #define METHOD_NAME__CBA "_CBA" | 52 | #define METHOD_NAME__CBA "_CBA" |
| 53 | #define METHOD_NAME__CID "_CID" | 53 | #define METHOD_NAME__CID "_CID" |
| 54 | #define METHOD_NAME__CRS "_CRS" | 54 | #define METHOD_NAME__CRS "_CRS" |
| 55 | #define METHOD_NAME__DDN "_DDN" | ||
| 55 | #define METHOD_NAME__HID "_HID" | 56 | #define METHOD_NAME__HID "_HID" |
| 56 | #define METHOD_NAME__INI "_INI" | 57 | #define METHOD_NAME__INI "_INI" |
| 57 | #define METHOD_NAME__PLD "_PLD" | 58 | #define METHOD_NAME__PLD "_PLD" |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 57ee0528aacb..f34a0835aa4f 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
| @@ -433,6 +433,7 @@ int acpi_device_set_power(struct acpi_device *device, int state); | |||
| 433 | int acpi_bus_init_power(struct acpi_device *device); | 433 | int acpi_bus_init_power(struct acpi_device *device); |
| 434 | int acpi_device_fix_up_power(struct acpi_device *device); | 434 | int acpi_device_fix_up_power(struct acpi_device *device); |
| 435 | int acpi_bus_update_power(acpi_handle handle, int *state_p); | 435 | int acpi_bus_update_power(acpi_handle handle, int *state_p); |
| 436 | int acpi_device_update_power(struct acpi_device *device, int *state_p); | ||
| 436 | bool acpi_bus_power_manageable(acpi_handle handle); | 437 | bool acpi_bus_power_manageable(acpi_handle handle); |
| 437 | 438 | ||
| 438 | #ifdef CONFIG_PM | 439 | #ifdef CONFIG_PM |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 9fc1d71c82bc..ab2acf629a64 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | 46 | ||
| 47 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 47 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
| 48 | 48 | ||
| 49 | #define ACPI_CA_VERSION 0x20140828 | 49 | #define ACPI_CA_VERSION 0x20140926 |
| 50 | 50 | ||
| 51 | #include <acpi/acconfig.h> | 51 | #include <acpi/acconfig.h> |
| 52 | #include <acpi/actypes.h> | 52 | #include <acpi/actypes.h> |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index ac03ec81d342..7000e66f768e 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
| @@ -721,7 +721,7 @@ typedef u32 acpi_event_type; | |||
| 721 | * | | | +--- Enabled for wake? | 721 | * | | | +--- Enabled for wake? |
| 722 | * | | +----- Set? | 722 | * | | +----- Set? |
| 723 | * | +------- Has a handler? | 723 | * | +------- Has a handler? |
| 724 | * +----------- <Reserved> | 724 | * +------------- <Reserved> |
| 725 | */ | 725 | */ |
| 726 | typedef u32 acpi_event_status; | 726 | typedef u32 acpi_event_status; |
| 727 | 727 | ||
| @@ -729,7 +729,7 @@ typedef u32 acpi_event_status; | |||
| 729 | #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 | 729 | #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 |
| 730 | #define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 | 730 | #define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 |
| 731 | #define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 | 731 | #define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 |
| 732 | #define ACPI_EVENT_FLAG_HANDLE (acpi_event_status) 0x08 | 732 | #define ACPI_EVENT_FLAG_HAS_HANDLER (acpi_event_status) 0x08 |
| 733 | 733 | ||
| 734 | /* Actions for acpi_set_gpe, acpi_gpe_wakeup, acpi_hw_low_set_gpe */ | 734 | /* Actions for acpi_set_gpe, acpi_gpe_wakeup, acpi_hw_low_set_gpe */ |
| 735 | 735 | ||
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index b7926bb9b444..407a12f663eb 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -432,6 +432,7 @@ static inline bool acpi_driver_match_device(struct device *dev, | |||
| 432 | int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *); | 432 | int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *); |
| 433 | int acpi_device_modalias(struct device *, char *, int); | 433 | int acpi_device_modalias(struct device *, char *, int); |
| 434 | 434 | ||
| 435 | struct platform_device *acpi_create_platform_device(struct acpi_device *); | ||
| 435 | #define ACPI_PTR(_ptr) (_ptr) | 436 | #define ACPI_PTR(_ptr) (_ptr) |
| 436 | 437 | ||
| 437 | #else /* !CONFIG_ACPI */ | 438 | #else /* !CONFIG_ACPI */ |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 36dffeccebdb..e58fe7df8b9c 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -90,7 +90,7 @@ extern unsigned compat_dir_class[]; | |||
| 90 | extern unsigned compat_chattr_class[]; | 90 | extern unsigned compat_chattr_class[]; |
| 91 | extern unsigned compat_signal_class[]; | 91 | extern unsigned compat_signal_class[]; |
| 92 | 92 | ||
| 93 | extern int __weak audit_classify_compat_syscall(int abi, unsigned syscall); | 93 | extern int audit_classify_compat_syscall(int abi, unsigned syscall); |
| 94 | 94 | ||
| 95 | /* audit_names->type values */ | 95 | /* audit_names->type values */ |
| 96 | #define AUDIT_TYPE_UNKNOWN 0 /* we don't know yet */ | 96 | #define AUDIT_TYPE_UNKNOWN 0 /* we don't know yet */ |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 324329ceea1e..73b45225a7ca 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
| @@ -175,12 +175,13 @@ void __wait_on_buffer(struct buffer_head *); | |||
| 175 | wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); | 175 | wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); |
| 176 | struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, | 176 | struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, |
| 177 | unsigned size); | 177 | unsigned size); |
| 178 | struct buffer_head *__getblk(struct block_device *bdev, sector_t block, | 178 | struct buffer_head *__getblk_gfp(struct block_device *bdev, sector_t block, |
| 179 | unsigned size); | 179 | unsigned size, gfp_t gfp); |
| 180 | void __brelse(struct buffer_head *); | 180 | void __brelse(struct buffer_head *); |
| 181 | void __bforget(struct buffer_head *); | 181 | void __bforget(struct buffer_head *); |
| 182 | void __breadahead(struct block_device *, sector_t block, unsigned int size); | 182 | void __breadahead(struct block_device *, sector_t block, unsigned int size); |
| 183 | struct buffer_head *__bread(struct block_device *, sector_t block, unsigned size); | 183 | struct buffer_head *__bread_gfp(struct block_device *, |
| 184 | sector_t block, unsigned size, gfp_t gfp); | ||
| 184 | void invalidate_bh_lrus(void); | 185 | void invalidate_bh_lrus(void); |
| 185 | struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); | 186 | struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); |
| 186 | void free_buffer_head(struct buffer_head * bh); | 187 | void free_buffer_head(struct buffer_head * bh); |
| @@ -295,7 +296,13 @@ static inline void bforget(struct buffer_head *bh) | |||
| 295 | static inline struct buffer_head * | 296 | static inline struct buffer_head * |
| 296 | sb_bread(struct super_block *sb, sector_t block) | 297 | sb_bread(struct super_block *sb, sector_t block) |
| 297 | { | 298 | { |
| 298 | return __bread(sb->s_bdev, block, sb->s_blocksize); | 299 | return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); |
| 300 | } | ||
| 301 | |||
| 302 | static inline struct buffer_head * | ||
| 303 | sb_bread_unmovable(struct super_block *sb, sector_t block) | ||
| 304 | { | ||
| 305 | return __bread_gfp(sb->s_bdev, block, sb->s_blocksize, 0); | ||
| 299 | } | 306 | } |
| 300 | 307 | ||
| 301 | static inline void | 308 | static inline void |
| @@ -307,7 +314,7 @@ sb_breadahead(struct super_block *sb, sector_t block) | |||
| 307 | static inline struct buffer_head * | 314 | static inline struct buffer_head * |
| 308 | sb_getblk(struct super_block *sb, sector_t block) | 315 | sb_getblk(struct super_block *sb, sector_t block) |
| 309 | { | 316 | { |
| 310 | return __getblk(sb->s_bdev, block, sb->s_blocksize); | 317 | return __getblk_gfp(sb->s_bdev, block, sb->s_blocksize, __GFP_MOVABLE); |
| 311 | } | 318 | } |
| 312 | 319 | ||
| 313 | static inline struct buffer_head * | 320 | static inline struct buffer_head * |
| @@ -344,6 +351,36 @@ static inline void lock_buffer(struct buffer_head *bh) | |||
| 344 | __lock_buffer(bh); | 351 | __lock_buffer(bh); |
| 345 | } | 352 | } |
| 346 | 353 | ||
| 354 | static inline struct buffer_head *getblk_unmovable(struct block_device *bdev, | ||
| 355 | sector_t block, | ||
| 356 | unsigned size) | ||
| 357 | { | ||
| 358 | return __getblk_gfp(bdev, block, size, 0); | ||
| 359 | } | ||
| 360 | |||
| 361 | static inline struct buffer_head *__getblk(struct block_device *bdev, | ||
| 362 | sector_t block, | ||
| 363 | unsigned size) | ||
| 364 | { | ||
| 365 | return __getblk_gfp(bdev, block, size, __GFP_MOVABLE); | ||
| 366 | } | ||
| 367 | |||
| 368 | /** | ||
| 369 | * __bread() - reads a specified block and returns the bh | ||
| 370 | * @bdev: the block_device to read from | ||
| 371 | * @block: number of block | ||
| 372 | * @size: size (in bytes) to read | ||
| 373 | * | ||
| 374 | * Reads a specified block, and returns buffer head that contains it. | ||
| 375 | * The page cache is allocated from movable area so that it can be migrated. | ||
| 376 | * It returns NULL if the block was unreadable. | ||
| 377 | */ | ||
| 378 | static inline struct buffer_head * | ||
| 379 | __bread(struct block_device *bdev, sector_t block, unsigned size) | ||
| 380 | { | ||
| 381 | return __bread_gfp(bdev, block, size, __GFP_MOVABLE); | ||
| 382 | } | ||
| 383 | |||
| 347 | extern int __set_page_dirty_buffers(struct page *page); | 384 | extern int __set_page_dirty_buffers(struct page *page); |
| 348 | 385 | ||
| 349 | #else /* CONFIG_BLOCK */ | 386 | #else /* CONFIG_BLOCK */ |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 653f0e2b6ca9..abcafaa20b86 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -287,7 +287,7 @@ extern struct clocksource* clocksource_get_next(void); | |||
| 287 | extern void clocksource_change_rating(struct clocksource *cs, int rating); | 287 | extern void clocksource_change_rating(struct clocksource *cs, int rating); |
| 288 | extern void clocksource_suspend(void); | 288 | extern void clocksource_suspend(void); |
| 289 | extern void clocksource_resume(void); | 289 | extern void clocksource_resume(void); |
| 290 | extern struct clocksource * __init __weak clocksource_default_clock(void); | 290 | extern struct clocksource * __init clocksource_default_clock(void); |
| 291 | extern void clocksource_mark_unstable(struct clocksource *cs); | 291 | extern void clocksource_mark_unstable(struct clocksource *cs); |
| 292 | 292 | ||
| 293 | extern u64 | 293 | extern u64 |
diff --git a/include/linux/cpufreq-dt.h b/include/linux/cpufreq-dt.h new file mode 100644 index 000000000000..0414009e2c30 --- /dev/null +++ b/include/linux/cpufreq-dt.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014 Marvell | ||
| 3 | * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __CPUFREQ_DT_H__ | ||
| 11 | #define __CPUFREQ_DT_H__ | ||
| 12 | |||
| 13 | struct cpufreq_dt_platform_data { | ||
| 14 | /* | ||
| 15 | * True when each CPU has its own clock to control its | ||
| 16 | * frequency, false when all CPUs are controlled by a single | ||
| 17 | * clock. | ||
| 18 | */ | ||
| 19 | bool independent_clocks; | ||
| 20 | }; | ||
| 21 | |||
| 22 | #endif /* __CPUFREQ_DT_H__ */ | ||
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 138336b6bb04..503b085b7832 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -219,6 +219,7 @@ __ATTR(_name, 0644, show_##_name, store_##_name) | |||
| 219 | struct cpufreq_driver { | 219 | struct cpufreq_driver { |
| 220 | char name[CPUFREQ_NAME_LEN]; | 220 | char name[CPUFREQ_NAME_LEN]; |
| 221 | u8 flags; | 221 | u8 flags; |
| 222 | void *driver_data; | ||
| 222 | 223 | ||
| 223 | /* needed by all drivers */ | 224 | /* needed by all drivers */ |
| 224 | int (*init) (struct cpufreq_policy *policy); | 225 | int (*init) (struct cpufreq_policy *policy); |
| @@ -312,6 +313,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data); | |||
| 312 | int cpufreq_unregister_driver(struct cpufreq_driver *driver_data); | 313 | int cpufreq_unregister_driver(struct cpufreq_driver *driver_data); |
| 313 | 314 | ||
| 314 | const char *cpufreq_get_current_driver(void); | 315 | const char *cpufreq_get_current_driver(void); |
| 316 | void *cpufreq_get_driver_data(void); | ||
| 315 | 317 | ||
| 316 | static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, | 318 | static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, |
| 317 | unsigned int min, unsigned int max) | 319 | unsigned int min, unsigned int max) |
diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index 72ab536ad3de..3849fce7ecfe 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h | |||
| @@ -14,14 +14,13 @@ | |||
| 14 | extern unsigned long long elfcorehdr_addr; | 14 | extern unsigned long long elfcorehdr_addr; |
| 15 | extern unsigned long long elfcorehdr_size; | 15 | extern unsigned long long elfcorehdr_size; |
| 16 | 16 | ||
| 17 | extern int __weak elfcorehdr_alloc(unsigned long long *addr, | 17 | extern int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size); |
| 18 | unsigned long long *size); | 18 | extern void elfcorehdr_free(unsigned long long addr); |
| 19 | extern void __weak elfcorehdr_free(unsigned long long addr); | 19 | extern ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos); |
| 20 | extern ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos); | 20 | extern ssize_t elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos); |
| 21 | extern ssize_t __weak elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos); | 21 | extern int remap_oldmem_pfn_range(struct vm_area_struct *vma, |
| 22 | extern int __weak remap_oldmem_pfn_range(struct vm_area_struct *vma, | 22 | unsigned long from, unsigned long pfn, |
| 23 | unsigned long from, unsigned long pfn, | 23 | unsigned long size, pgprot_t prot); |
| 24 | unsigned long size, pgprot_t prot); | ||
| 25 | 24 | ||
| 26 | extern ssize_t copy_oldmem_page(unsigned long, char *, size_t, | 25 | extern ssize_t copy_oldmem_page(unsigned long, char *, size_t, |
| 27 | unsigned long, int); | 26 | unsigned long, int); |
diff --git a/include/linux/efi.h b/include/linux/efi.h index 45cb4ffdea62..0949f9c7e872 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
| @@ -92,6 +92,7 @@ typedef struct { | |||
| 92 | #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ | 92 | #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ |
| 93 | #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ | 93 | #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ |
| 94 | #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ | 94 | #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ |
| 95 | #define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */ | ||
| 95 | #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ | 96 | #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ |
| 96 | #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ | 97 | #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ |
| 97 | #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ | 98 | #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ |
| @@ -502,6 +503,10 @@ typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char | |||
| 502 | typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, | 503 | typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, |
| 503 | u32 attr, unsigned long data_size, | 504 | u32 attr, unsigned long data_size, |
| 504 | void *data); | 505 | void *data); |
| 506 | typedef efi_status_t | ||
| 507 | efi_set_variable_nonblocking_t(efi_char16_t *name, efi_guid_t *vendor, | ||
| 508 | u32 attr, unsigned long data_size, void *data); | ||
| 509 | |||
| 505 | typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); | 510 | typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); |
| 506 | typedef void efi_reset_system_t (int reset_type, efi_status_t status, | 511 | typedef void efi_reset_system_t (int reset_type, efi_status_t status, |
| 507 | unsigned long data_size, efi_char16_t *data); | 512 | unsigned long data_size, efi_char16_t *data); |
| @@ -821,6 +826,7 @@ extern struct efi { | |||
| 821 | efi_get_variable_t *get_variable; | 826 | efi_get_variable_t *get_variable; |
| 822 | efi_get_next_variable_t *get_next_variable; | 827 | efi_get_next_variable_t *get_next_variable; |
| 823 | efi_set_variable_t *set_variable; | 828 | efi_set_variable_t *set_variable; |
| 829 | efi_set_variable_nonblocking_t *set_variable_nonblocking; | ||
| 824 | efi_query_variable_info_t *query_variable_info; | 830 | efi_query_variable_info_t *query_variable_info; |
| 825 | efi_update_capsule_t *update_capsule; | 831 | efi_update_capsule_t *update_capsule; |
| 826 | efi_query_capsule_caps_t *query_capsule_caps; | 832 | efi_query_capsule_caps_t *query_capsule_caps; |
| @@ -886,6 +892,13 @@ extern bool efi_poweroff_required(void); | |||
| 886 | (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ | 892 | (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ |
| 887 | (md) = (void *)(md) + (m)->desc_size) | 893 | (md) = (void *)(md) + (m)->desc_size) |
| 888 | 894 | ||
| 895 | /* | ||
| 896 | * Format an EFI memory descriptor's type and attributes to a user-provided | ||
| 897 | * character buffer, as per snprintf(), and return the buffer. | ||
| 898 | */ | ||
| 899 | char * __init efi_md_typeattr_format(char *buf, size_t size, | ||
| 900 | const efi_memory_desc_t *md); | ||
| 901 | |||
| 889 | /** | 902 | /** |
| 890 | * efi_range_is_wc - check the WC bit on an address range | 903 | * efi_range_is_wc - check the WC bit on an address range |
| 891 | * @start: starting kvirt address | 904 | * @start: starting kvirt address |
| @@ -1034,6 +1047,7 @@ struct efivar_operations { | |||
| 1034 | efi_get_variable_t *get_variable; | 1047 | efi_get_variable_t *get_variable; |
| 1035 | efi_get_next_variable_t *get_next_variable; | 1048 | efi_get_next_variable_t *get_next_variable; |
| 1036 | efi_set_variable_t *set_variable; | 1049 | efi_set_variable_t *set_variable; |
| 1050 | efi_set_variable_nonblocking_t *set_variable_nonblocking; | ||
| 1037 | efi_query_variable_store_t *query_variable_store; | 1051 | efi_query_variable_store_t *query_variable_store; |
| 1038 | }; | 1052 | }; |
| 1039 | 1053 | ||
| @@ -1227,4 +1241,7 @@ efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg, | |||
| 1227 | unsigned long *load_addr, | 1241 | unsigned long *load_addr, |
| 1228 | unsigned long *load_size); | 1242 | unsigned long *load_size); |
| 1229 | 1243 | ||
| 1244 | efi_status_t efi_parse_options(char *cmdline); | ||
| 1245 | |||
| 1246 | bool efi_runtime_disabled(void); | ||
| 1230 | #endif /* _LINUX_EFI_H */ | 1247 | #endif /* _LINUX_EFI_H */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index a957d4366c24..4e41a4a331bb 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -223,6 +223,13 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | |||
| 223 | #define ATTR_TIMES_SET (1 << 16) | 223 | #define ATTR_TIMES_SET (1 << 16) |
| 224 | 224 | ||
| 225 | /* | 225 | /* |
| 226 | * Whiteout is represented by a char device. The following constants define the | ||
| 227 | * mode and device number to use. | ||
| 228 | */ | ||
| 229 | #define WHITEOUT_MODE 0 | ||
| 230 | #define WHITEOUT_DEV 0 | ||
| 231 | |||
| 232 | /* | ||
| 226 | * This is the Inode Attributes structure, used for notify_change(). It | 233 | * This is the Inode Attributes structure, used for notify_change(). It |
| 227 | * uses the above definitions as flags, to know which values have changed. | 234 | * uses the above definitions as flags, to know which values have changed. |
| 228 | * Also, in this manner, a Filesystem can look at only the values it cares | 235 | * Also, in this manner, a Filesystem can look at only the values it cares |
| @@ -254,6 +261,12 @@ struct iattr { | |||
| 254 | */ | 261 | */ |
| 255 | #include <linux/quota.h> | 262 | #include <linux/quota.h> |
| 256 | 263 | ||
| 264 | /* | ||
| 265 | * Maximum number of layers of fs stack. Needs to be limited to | ||
| 266 | * prevent kernel stack overflow | ||
| 267 | */ | ||
| 268 | #define FILESYSTEM_MAX_STACK_DEPTH 2 | ||
| 269 | |||
| 257 | /** | 270 | /** |
| 258 | * enum positive_aop_returns - aop return codes with specific semantics | 271 | * enum positive_aop_returns - aop return codes with specific semantics |
| 259 | * | 272 | * |
| @@ -1266,6 +1279,11 @@ struct super_block { | |||
| 1266 | struct list_lru s_dentry_lru ____cacheline_aligned_in_smp; | 1279 | struct list_lru s_dentry_lru ____cacheline_aligned_in_smp; |
| 1267 | struct list_lru s_inode_lru ____cacheline_aligned_in_smp; | 1280 | struct list_lru s_inode_lru ____cacheline_aligned_in_smp; |
| 1268 | struct rcu_head rcu; | 1281 | struct rcu_head rcu; |
| 1282 | |||
| 1283 | /* | ||
| 1284 | * Indicates how deep in a filesystem stack this SB is | ||
| 1285 | */ | ||
| 1286 | int s_stack_depth; | ||
| 1269 | }; | 1287 | }; |
| 1270 | 1288 | ||
| 1271 | extern struct timespec current_fs_time(struct super_block *sb); | 1289 | extern struct timespec current_fs_time(struct super_block *sb); |
| @@ -1398,6 +1416,7 @@ extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct ino | |||
| 1398 | extern int vfs_rmdir(struct inode *, struct dentry *); | 1416 | extern int vfs_rmdir(struct inode *, struct dentry *); |
| 1399 | extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); | 1417 | extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); |
| 1400 | extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); | 1418 | extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); |
| 1419 | extern int vfs_whiteout(struct inode *, struct dentry *); | ||
| 1401 | 1420 | ||
| 1402 | /* | 1421 | /* |
| 1403 | * VFS dentry helper functions. | 1422 | * VFS dentry helper functions. |
| @@ -1528,6 +1547,9 @@ struct inode_operations { | |||
| 1528 | umode_t create_mode, int *opened); | 1547 | umode_t create_mode, int *opened); |
| 1529 | int (*tmpfile) (struct inode *, struct dentry *, umode_t); | 1548 | int (*tmpfile) (struct inode *, struct dentry *, umode_t); |
| 1530 | int (*set_acl)(struct inode *, struct posix_acl *, int); | 1549 | int (*set_acl)(struct inode *, struct posix_acl *, int); |
| 1550 | |||
| 1551 | /* WARNING: probably going away soon, do not use! */ | ||
| 1552 | int (*dentry_open)(struct dentry *, struct file *, const struct cred *); | ||
| 1531 | } ____cacheline_aligned; | 1553 | } ____cacheline_aligned; |
| 1532 | 1554 | ||
| 1533 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | 1555 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, |
| @@ -1625,6 +1647,9 @@ struct super_operations { | |||
| 1625 | #define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT) | 1647 | #define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT) |
| 1626 | #define IS_NOSEC(inode) ((inode)->i_flags & S_NOSEC) | 1648 | #define IS_NOSEC(inode) ((inode)->i_flags & S_NOSEC) |
| 1627 | 1649 | ||
| 1650 | #define IS_WHITEOUT(inode) (S_ISCHR(inode->i_mode) && \ | ||
| 1651 | (inode)->i_rdev == WHITEOUT_DEV) | ||
| 1652 | |||
| 1628 | /* | 1653 | /* |
| 1629 | * Inode state bits. Protected by inode->i_lock | 1654 | * Inode state bits. Protected by inode->i_lock |
| 1630 | * | 1655 | * |
| @@ -2040,6 +2065,7 @@ extern struct file *file_open_name(struct filename *, int, umode_t); | |||
| 2040 | extern struct file *filp_open(const char *, int, umode_t); | 2065 | extern struct file *filp_open(const char *, int, umode_t); |
| 2041 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, | 2066 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, |
| 2042 | const char *, int); | 2067 | const char *, int); |
| 2068 | extern int vfs_open(const struct path *, struct file *, const struct cred *); | ||
| 2043 | extern struct file * dentry_open(const struct path *, int, const struct cred *); | 2069 | extern struct file * dentry_open(const struct path *, int, const struct cred *); |
| 2044 | extern int filp_close(struct file *, fl_owner_t id); | 2070 | extern int filp_close(struct file *, fl_owner_t id); |
| 2045 | 2071 | ||
| @@ -2253,7 +2279,9 @@ extern sector_t bmap(struct inode *, sector_t); | |||
| 2253 | #endif | 2279 | #endif |
| 2254 | extern int notify_change(struct dentry *, struct iattr *, struct inode **); | 2280 | extern int notify_change(struct dentry *, struct iattr *, struct inode **); |
| 2255 | extern int inode_permission(struct inode *, int); | 2281 | extern int inode_permission(struct inode *, int); |
| 2282 | extern int __inode_permission(struct inode *, int); | ||
| 2256 | extern int generic_permission(struct inode *, int); | 2283 | extern int generic_permission(struct inode *, int); |
| 2284 | extern int __check_sticky(struct inode *dir, struct inode *inode); | ||
| 2257 | 2285 | ||
| 2258 | static inline bool execute_ok(struct inode *inode) | 2286 | static inline bool execute_ok(struct inode *inode) |
| 2259 | { | 2287 | { |
| @@ -2452,6 +2480,9 @@ extern ssize_t iter_file_splice_write(struct pipe_inode_info *, | |||
| 2452 | struct file *, loff_t *, size_t, unsigned int); | 2480 | struct file *, loff_t *, size_t, unsigned int); |
| 2453 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, | 2481 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, |
| 2454 | struct file *out, loff_t *, size_t len, unsigned int flags); | 2482 | struct file *out, loff_t *, size_t len, unsigned int flags); |
| 2483 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | ||
| 2484 | loff_t *opos, size_t len, unsigned int flags); | ||
| 2485 | |||
| 2455 | 2486 | ||
| 2456 | extern void | 2487 | extern void |
| 2457 | file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); | 2488 | file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); |
| @@ -2737,6 +2768,14 @@ static inline int is_sxid(umode_t mode) | |||
| 2737 | return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP)); | 2768 | return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP)); |
| 2738 | } | 2769 | } |
| 2739 | 2770 | ||
| 2771 | static inline int check_sticky(struct inode *dir, struct inode *inode) | ||
| 2772 | { | ||
| 2773 | if (!(dir->i_mode & S_ISVTX)) | ||
| 2774 | return 0; | ||
| 2775 | |||
| 2776 | return __check_sticky(dir, inode); | ||
| 2777 | } | ||
| 2778 | |||
| 2740 | static inline void inode_has_no_xattr(struct inode *inode) | 2779 | static inline void inode_has_no_xattr(struct inode *inode) |
| 2741 | { | 2780 | { |
| 2742 | if (!is_sxid(inode->i_mode) && (inode->i_sb->s_flags & MS_NOSEC)) | 2781 | if (!is_sxid(inode->i_mode) && (inode->i_sb->s_flags & MS_NOSEC)) |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 0dae71e9971c..704b9a599b26 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
| @@ -1042,7 +1042,7 @@ void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block); | |||
| 1042 | extern void jbd2_journal_commit_transaction(journal_t *); | 1042 | extern void jbd2_journal_commit_transaction(journal_t *); |
| 1043 | 1043 | ||
| 1044 | /* Checkpoint list management */ | 1044 | /* Checkpoint list management */ |
| 1045 | int __jbd2_journal_clean_checkpoint_list(journal_t *journal); | 1045 | void __jbd2_journal_clean_checkpoint_list(journal_t *journal); |
| 1046 | int __jbd2_journal_remove_checkpoint(struct journal_head *); | 1046 | int __jbd2_journal_remove_checkpoint(struct journal_head *); |
| 1047 | void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *); | 1047 | void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *); |
| 1048 | 1048 | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 40728cf1c452..3d770f5564b8 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -403,6 +403,7 @@ int vsscanf(const char *, const char *, va_list); | |||
| 403 | extern int get_option(char **str, int *pint); | 403 | extern int get_option(char **str, int *pint); |
| 404 | extern char *get_options(const char *str, int nints, int *ints); | 404 | extern char *get_options(const char *str, int nints, int *ints); |
| 405 | extern unsigned long long memparse(const char *ptr, char **retptr); | 405 | extern unsigned long long memparse(const char *ptr, char **retptr); |
| 406 | extern bool parse_option_str(const char *str, const char *option); | ||
| 406 | 407 | ||
| 407 | extern int core_kernel_text(unsigned long addr); | 408 | extern int core_kernel_text(unsigned long addr); |
| 408 | extern int core_kernel_data(unsigned long addr); | 409 | extern int core_kernel_data(unsigned long addr); |
diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 6b06d378f3df..e465bb15912d 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h | |||
| @@ -283,7 +283,7 @@ struct kgdb_io { | |||
| 283 | 283 | ||
| 284 | extern struct kgdb_arch arch_kgdb_ops; | 284 | extern struct kgdb_arch arch_kgdb_ops; |
| 285 | 285 | ||
| 286 | extern unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs); | 286 | extern unsigned long kgdb_arch_pc(int exception, struct pt_regs *regs); |
| 287 | 287 | ||
| 288 | #ifdef CONFIG_SERIAL_KGDB_NMI | 288 | #ifdef CONFIG_SERIAL_KGDB_NMI |
| 289 | extern int kgdb_register_nmi_console(void); | 289 | extern int kgdb_register_nmi_console(void); |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 28be31f49250..ea53b04993f2 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -1080,6 +1080,7 @@ void kvm_device_get(struct kvm_device *dev); | |||
| 1080 | void kvm_device_put(struct kvm_device *dev); | 1080 | void kvm_device_put(struct kvm_device *dev); |
| 1081 | struct kvm_device *kvm_device_from_filp(struct file *filp); | 1081 | struct kvm_device *kvm_device_from_filp(struct file *filp); |
| 1082 | int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type); | 1082 | int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type); |
| 1083 | void kvm_unregister_device_ops(u32 type); | ||
| 1083 | 1084 | ||
| 1084 | extern struct kvm_device_ops kvm_mpic_ops; | 1085 | extern struct kvm_device_ops kvm_mpic_ops; |
| 1085 | extern struct kvm_device_ops kvm_xics_ops; | 1086 | extern struct kvm_device_ops kvm_xics_ops; |
diff --git a/include/linux/leds.h b/include/linux/leds.h index e43686472197..a57611d0c94e 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | #define __LINUX_LEDS_H_INCLUDED | 13 | #define __LINUX_LEDS_H_INCLUDED |
| 14 | 14 | ||
| 15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
| 16 | #include <linux/spinlock.h> | ||
| 17 | #include <linux/rwsem.h> | 16 | #include <linux/rwsem.h> |
| 17 | #include <linux/spinlock.h> | ||
| 18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
| 19 | #include <linux/workqueue.h> | 19 | #include <linux/workqueue.h> |
| 20 | 20 | ||
| @@ -31,8 +31,8 @@ enum led_brightness { | |||
| 31 | 31 | ||
| 32 | struct led_classdev { | 32 | struct led_classdev { |
| 33 | const char *name; | 33 | const char *name; |
| 34 | int brightness; | 34 | enum led_brightness brightness; |
| 35 | int max_brightness; | 35 | enum led_brightness max_brightness; |
| 36 | int flags; | 36 | int flags; |
| 37 | 37 | ||
| 38 | /* Lower 16 bits reflect status */ | 38 | /* Lower 16 bits reflect status */ |
| @@ -140,6 +140,16 @@ extern void led_blink_set_oneshot(struct led_classdev *led_cdev, | |||
| 140 | */ | 140 | */ |
| 141 | extern void led_set_brightness(struct led_classdev *led_cdev, | 141 | extern void led_set_brightness(struct led_classdev *led_cdev, |
| 142 | enum led_brightness brightness); | 142 | enum led_brightness brightness); |
| 143 | /** | ||
| 144 | * led_update_brightness - update LED brightness | ||
| 145 | * @led_cdev: the LED to query | ||
| 146 | * | ||
| 147 | * Get an LED's current brightness and update led_cdev->brightness | ||
| 148 | * member with the obtained value. | ||
| 149 | * | ||
| 150 | * Returns: 0 on success or negative error value on failure | ||
| 151 | */ | ||
| 152 | extern int led_update_brightness(struct led_classdev *led_cdev); | ||
| 143 | 153 | ||
| 144 | /* | 154 | /* |
| 145 | * LED Triggers | 155 | * LED Triggers |
diff --git a/include/linux/mailbox_client.h b/include/linux/mailbox_client.h new file mode 100644 index 000000000000..307d9cab2026 --- /dev/null +++ b/include/linux/mailbox_client.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013-2014 Linaro Ltd. | ||
| 3 | * Author: Jassi Brar <jassisinghbrar@gmail.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __MAILBOX_CLIENT_H | ||
| 11 | #define __MAILBOX_CLIENT_H | ||
| 12 | |||
| 13 | #include <linux/of.h> | ||
| 14 | #include <linux/device.h> | ||
| 15 | |||
| 16 | struct mbox_chan; | ||
| 17 | |||
| 18 | /** | ||
| 19 | * struct mbox_client - User of a mailbox | ||
| 20 | * @dev: The client device | ||
| 21 | * @tx_block: If the mbox_send_message should block until data is | ||
| 22 | * transmitted. | ||
| 23 | * @tx_tout: Max block period in ms before TX is assumed failure | ||
| 24 | * @knows_txdone: If the client could run the TX state machine. Usually | ||
| 25 | * if the client receives some ACK packet for transmission. | ||
| 26 | * Unused if the controller already has TX_Done/RTR IRQ. | ||
| 27 | * @rx_callback: Atomic callback to provide client the data received | ||
| 28 | * @tx_done: Atomic callback to tell client of data transmission | ||
| 29 | */ | ||
| 30 | struct mbox_client { | ||
| 31 | struct device *dev; | ||
| 32 | bool tx_block; | ||
| 33 | unsigned long tx_tout; | ||
| 34 | bool knows_txdone; | ||
| 35 | |||
| 36 | void (*rx_callback)(struct mbox_client *cl, void *mssg); | ||
| 37 | void (*tx_done)(struct mbox_client *cl, void *mssg, int r); | ||
| 38 | }; | ||
| 39 | |||
| 40 | struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index); | ||
| 41 | int mbox_send_message(struct mbox_chan *chan, void *mssg); | ||
| 42 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ | ||
| 43 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ | ||
| 44 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ | ||
| 45 | |||
| 46 | #endif /* __MAILBOX_CLIENT_H */ | ||
diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h new file mode 100644 index 000000000000..d4cf96f07cfc --- /dev/null +++ b/include/linux/mailbox_controller.h | |||
| @@ -0,0 +1,133 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef __MAILBOX_CONTROLLER_H | ||
| 8 | #define __MAILBOX_CONTROLLER_H | ||
| 9 | |||
| 10 | #include <linux/of.h> | ||
| 11 | #include <linux/types.h> | ||
| 12 | #include <linux/timer.h> | ||
| 13 | #include <linux/device.h> | ||
| 14 | #include <linux/completion.h> | ||
| 15 | |||
| 16 | struct mbox_chan; | ||
| 17 | |||
| 18 | /** | ||
| 19 | * struct mbox_chan_ops - methods to control mailbox channels | ||
| 20 | * @send_data: The API asks the MBOX controller driver, in atomic | ||
| 21 | * context try to transmit a message on the bus. Returns 0 if | ||
| 22 | * data is accepted for transmission, -EBUSY while rejecting | ||
| 23 | * if the remote hasn't yet read the last data sent. Actual | ||
| 24 | * transmission of data is reported by the controller via | ||
| 25 | * mbox_chan_txdone (if it has some TX ACK irq). It must not | ||
| 26 | * sleep. | ||
| 27 | * @startup: Called when a client requests the chan. The controller | ||
| 28 | * could ask clients for additional parameters of communication | ||
| 29 | * to be provided via client's chan_data. This call may | ||
| 30 | * block. After this call the Controller must forward any | ||
| 31 | * data received on the chan by calling mbox_chan_received_data. | ||
| 32 | * The controller may do stuff that need to sleep. | ||
| 33 | * @shutdown: Called when a client relinquishes control of a chan. | ||
| 34 | * This call may block too. The controller must not forward | ||
| 35 | * any received data anymore. | ||
| 36 | * The controller may do stuff that need to sleep. | ||
| 37 | * @last_tx_done: If the controller sets 'txdone_poll', the API calls | ||
| 38 | * this to poll status of last TX. The controller must | ||
| 39 | * give priority to IRQ method over polling and never | ||
| 40 | * set both txdone_poll and txdone_irq. Only in polling | ||
| 41 | * mode 'send_data' is expected to return -EBUSY. | ||
| 42 | * The controller may do stuff that need to sleep/block. | ||
| 43 | * Used only if txdone_poll:=true && txdone_irq:=false | ||
| 44 | * @peek_data: Atomic check for any received data. Return true if controller | ||
| 45 | * has some data to push to the client. False otherwise. | ||
| 46 | */ | ||
| 47 | struct mbox_chan_ops { | ||
| 48 | int (*send_data)(struct mbox_chan *chan, void *data); | ||
| 49 | int (*startup)(struct mbox_chan *chan); | ||
| 50 | void (*shutdown)(struct mbox_chan *chan); | ||
| 51 | bool (*last_tx_done)(struct mbox_chan *chan); | ||
| 52 | bool (*peek_data)(struct mbox_chan *chan); | ||
| 53 | }; | ||
| 54 | |||
| 55 | /** | ||
| 56 | * struct mbox_controller - Controller of a class of communication channels | ||
| 57 | * @dev: Device backing this controller | ||
| 58 | * @ops: Operators that work on each communication chan | ||
| 59 | * @chans: Array of channels | ||
| 60 | * @num_chans: Number of channels in the 'chans' array. | ||
| 61 | * @txdone_irq: Indicates if the controller can report to API when | ||
| 62 | * the last transmitted data was read by the remote. | ||
| 63 | * Eg, if it has some TX ACK irq. | ||
| 64 | * @txdone_poll: If the controller can read but not report the TX | ||
| 65 | * done. Ex, some register shows the TX status but | ||
| 66 | * no interrupt rises. Ignored if 'txdone_irq' is set. | ||
| 67 | * @txpoll_period: If 'txdone_poll' is in effect, the API polls for | ||
| 68 | * last TX's status after these many millisecs | ||
| 69 | * @of_xlate: Controller driver specific mapping of channel via DT | ||
| 70 | * @poll: API private. Used to poll for TXDONE on all channels. | ||
| 71 | * @node: API private. To hook into list of controllers. | ||
| 72 | */ | ||
| 73 | struct mbox_controller { | ||
| 74 | struct device *dev; | ||
| 75 | struct mbox_chan_ops *ops; | ||
| 76 | struct mbox_chan *chans; | ||
| 77 | int num_chans; | ||
| 78 | bool txdone_irq; | ||
| 79 | bool txdone_poll; | ||
| 80 | unsigned txpoll_period; | ||
| 81 | struct mbox_chan *(*of_xlate)(struct mbox_controller *mbox, | ||
| 82 | const struct of_phandle_args *sp); | ||
| 83 | /* Internal to API */ | ||
| 84 | struct timer_list poll; | ||
| 85 | struct list_head node; | ||
| 86 | }; | ||
| 87 | |||
| 88 | /* | ||
| 89 | * The length of circular buffer for queuing messages from a client. | ||
| 90 | * 'msg_count' tracks the number of buffered messages while 'msg_free' | ||
| 91 | * is the index where the next message would be buffered. | ||
| 92 | * We shouldn't need it too big because every transfer is interrupt | ||
| 93 | * triggered and if we have lots of data to transfer, the interrupt | ||
| 94 | * latencies are going to be the bottleneck, not the buffer length. | ||
| 95 | * Besides, mbox_send_message could be called from atomic context and | ||
| 96 | * the client could also queue another message from the notifier 'tx_done' | ||
| 97 | * of the last transfer done. | ||
| 98 | * REVISIT: If too many platforms see the "Try increasing MBOX_TX_QUEUE_LEN" | ||
| 99 | * print, it needs to be taken from config option or somesuch. | ||
| 100 | */ | ||
| 101 | #define MBOX_TX_QUEUE_LEN 20 | ||
| 102 | |||
| 103 | /** | ||
| 104 | * struct mbox_chan - s/w representation of a communication chan | ||
| 105 | * @mbox: Pointer to the parent/provider of this channel | ||
| 106 | * @txdone_method: Way to detect TXDone chosen by the API | ||
| 107 | * @cl: Pointer to the current owner of this channel | ||
| 108 | * @tx_complete: Transmission completion | ||
| 109 | * @active_req: Currently active request hook | ||
| 110 | * @msg_count: No. of mssg currently queued | ||
| 111 | * @msg_free: Index of next available mssg slot | ||
| 112 | * @msg_data: Hook for data packet | ||
| 113 | * @lock: Serialise access to the channel | ||
| 114 | * @con_priv: Hook for controller driver to attach private data | ||
| 115 | */ | ||
| 116 | struct mbox_chan { | ||
| 117 | struct mbox_controller *mbox; | ||
| 118 | unsigned txdone_method; | ||
| 119 | struct mbox_client *cl; | ||
| 120 | struct completion tx_complete; | ||
| 121 | void *active_req; | ||
| 122 | unsigned msg_count, msg_free; | ||
| 123 | void *msg_data[MBOX_TX_QUEUE_LEN]; | ||
| 124 | spinlock_t lock; /* Serialise access to the channel */ | ||
| 125 | void *con_priv; | ||
| 126 | }; | ||
| 127 | |||
| 128 | int mbox_controller_register(struct mbox_controller *mbox); /* can sleep */ | ||
| 129 | void mbox_controller_unregister(struct mbox_controller *mbox); /* can sleep */ | ||
| 130 | void mbox_chan_received_data(struct mbox_chan *chan, void *data); /* atomic */ | ||
| 131 | void mbox_chan_txdone(struct mbox_chan *chan, int r); /* atomic */ | ||
| 132 | |||
| 133 | #endif /* __MAILBOX_CONTROLLER_H */ | ||
diff --git a/include/linux/memory.h b/include/linux/memory.h index bb7384e3c3d8..8b8d8d12348e 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
| @@ -35,7 +35,7 @@ struct memory_block { | |||
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | int arch_get_memory_phys_device(unsigned long start_pfn); | 37 | int arch_get_memory_phys_device(unsigned long start_pfn); |
| 38 | unsigned long __weak memory_block_size_bytes(void); | 38 | unsigned long memory_block_size_bytes(void); |
| 39 | 39 | ||
| 40 | /* These states are exposed to userspace as text strings in sysfs */ | 40 | /* These states are exposed to userspace as text strings in sysfs */ |
| 41 | #define MEM_ONLINE (1<<0) /* exposed to userspace */ | 41 | #define MEM_ONLINE (1<<0) /* exposed to userspace */ |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 02d11ee7f19d..27eb1bfbe704 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1176,6 +1176,7 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, | |||
| 1176 | 1176 | ||
| 1177 | extern void truncate_pagecache(struct inode *inode, loff_t new); | 1177 | extern void truncate_pagecache(struct inode *inode, loff_t new); |
| 1178 | extern void truncate_setsize(struct inode *inode, loff_t newsize); | 1178 | extern void truncate_setsize(struct inode *inode, loff_t newsize); |
| 1179 | void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to); | ||
| 1179 | void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end); | 1180 | void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end); |
| 1180 | int truncate_inode_page(struct address_space *mapping, struct page *page); | 1181 | int truncate_inode_page(struct address_space *mapping, struct page *page); |
| 1181 | int generic_error_remove_page(struct address_space *mapping, struct page *page); | 1182 | int generic_error_remove_page(struct address_space *mapping, struct page *page); |
diff --git a/include/linux/mount.h b/include/linux/mount.h index 9262e4bf0cc3..c2c561dc0114 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h | |||
| @@ -81,6 +81,9 @@ extern struct vfsmount *mntget(struct vfsmount *mnt); | |||
| 81 | extern struct vfsmount *mnt_clone_internal(struct path *path); | 81 | extern struct vfsmount *mnt_clone_internal(struct path *path); |
| 82 | extern int __mnt_is_readonly(struct vfsmount *mnt); | 82 | extern int __mnt_is_readonly(struct vfsmount *mnt); |
| 83 | 83 | ||
| 84 | struct path; | ||
| 85 | extern struct vfsmount *clone_private_mount(struct path *path); | ||
| 86 | |||
| 84 | struct file_system_type; | 87 | struct file_system_type; |
| 85 | extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, | 88 | extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, |
| 86 | int flags, const char *name, | 89 | int flags, const char *name, |
diff --git a/include/linux/oom.h b/include/linux/oom.h index 647395a1a550..e8d6e1058723 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h | |||
| @@ -50,6 +50,9 @@ static inline bool oom_task_origin(const struct task_struct *p) | |||
| 50 | extern unsigned long oom_badness(struct task_struct *p, | 50 | extern unsigned long oom_badness(struct task_struct *p, |
| 51 | struct mem_cgroup *memcg, const nodemask_t *nodemask, | 51 | struct mem_cgroup *memcg, const nodemask_t *nodemask, |
| 52 | unsigned long totalpages); | 52 | unsigned long totalpages); |
| 53 | |||
| 54 | extern int oom_kills_count(void); | ||
| 55 | extern void note_oom_kill(void); | ||
| 53 | extern void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | 56 | extern void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
| 54 | unsigned int points, unsigned long totalpages, | 57 | unsigned int points, unsigned long totalpages, |
| 55 | struct mem_cgroup *memcg, nodemask_t *nodemask, | 58 | struct mem_cgroup *memcg, nodemask_t *nodemask, |
diff --git a/include/linux/mailbox.h b/include/linux/pl320-ipc.h index 5161f63ec1c8..5161f63ec1c8 100644 --- a/include/linux/mailbox.h +++ b/include/linux/pl320-ipc.h | |||
diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index 9ab4bf7c4646..636e82834506 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h | |||
| @@ -15,6 +15,7 @@ enum { | |||
| 15 | PM_QOS_CPU_DMA_LATENCY, | 15 | PM_QOS_CPU_DMA_LATENCY, |
| 16 | PM_QOS_NETWORK_LATENCY, | 16 | PM_QOS_NETWORK_LATENCY, |
| 17 | PM_QOS_NETWORK_THROUGHPUT, | 17 | PM_QOS_NETWORK_THROUGHPUT, |
| 18 | PM_QOS_MEMORY_BANDWIDTH, | ||
| 18 | 19 | ||
| 19 | /* insert new class ID */ | 20 | /* insert new class ID */ |
| 20 | PM_QOS_NUM_CLASSES, | 21 | PM_QOS_NUM_CLASSES, |
| @@ -32,6 +33,7 @@ enum pm_qos_flags_status { | |||
| 32 | #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) | 33 | #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) |
| 33 | #define PM_QOS_NETWORK_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) | 34 | #define PM_QOS_NETWORK_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) |
| 34 | #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 | 35 | #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 |
| 36 | #define PM_QOS_MEMORY_BANDWIDTH_DEFAULT_VALUE 0 | ||
| 35 | #define PM_QOS_RESUME_LATENCY_DEFAULT_VALUE 0 | 37 | #define PM_QOS_RESUME_LATENCY_DEFAULT_VALUE 0 |
| 36 | #define PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE 0 | 38 | #define PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE 0 |
| 37 | #define PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT (-1) | 39 | #define PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT (-1) |
| @@ -69,7 +71,8 @@ struct dev_pm_qos_request { | |||
| 69 | enum pm_qos_type { | 71 | enum pm_qos_type { |
| 70 | PM_QOS_UNITIALIZED, | 72 | PM_QOS_UNITIALIZED, |
| 71 | PM_QOS_MAX, /* return the largest value */ | 73 | PM_QOS_MAX, /* return the largest value */ |
| 72 | PM_QOS_MIN /* return the smallest value */ | 74 | PM_QOS_MIN, /* return the smallest value */ |
| 75 | PM_QOS_SUM /* return the sum */ | ||
| 73 | }; | 76 | }; |
| 74 | 77 | ||
| 75 | /* | 78 | /* |
diff --git a/include/linux/pnfs_osd_xdr.h b/include/linux/pnfs_osd_xdr.h index fe25876c1a5d..17d7d0d20eca 100644 --- a/include/linux/pnfs_osd_xdr.h +++ b/include/linux/pnfs_osd_xdr.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * All rights reserved. | 5 | * All rights reserved. |
| 6 | * | 6 | * |
| 7 | * Benny Halevy <bhalevy@panasas.com> | 7 | * Benny Halevy <bhalevy@panasas.com> |
| 8 | * Boaz Harrosh <bharrosh@panasas.com> | 8 | * Boaz Harrosh <ooo@electrozaur.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 | 11 | * it under the terms of the GNU General Public License version 2 |
diff --git a/include/linux/string.h b/include/linux/string.h index e6edfe51575a..2e22a2e58f3a 100644 --- a/include/linux/string.h +++ b/include/linux/string.h | |||
| @@ -132,7 +132,7 @@ int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...) __printf(3, 4); | |||
| 132 | #endif | 132 | #endif |
| 133 | 133 | ||
| 134 | extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos, | 134 | extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos, |
| 135 | const void *from, size_t available); | 135 | const void *from, size_t available); |
| 136 | 136 | ||
| 137 | /** | 137 | /** |
| 138 | * strstarts - does @str start with @prefix? | 138 | * strstarts - does @str start with @prefix? |
| @@ -144,7 +144,8 @@ static inline bool strstarts(const char *str, const char *prefix) | |||
| 144 | return strncmp(str, prefix, strlen(prefix)) == 0; | 144 | return strncmp(str, prefix, strlen(prefix)) == 0; |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | extern size_t memweight(const void *ptr, size_t bytes); | 147 | size_t memweight(const void *ptr, size_t bytes); |
| 148 | void memzero_explicit(void *s, size_t count); | ||
| 148 | 149 | ||
| 149 | /** | 150 | /** |
| 150 | * kbasename - return the last part of a pathname. | 151 | * kbasename - return the last part of a pathname. |
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 0305cde21a74..ef90838b36a0 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
| @@ -44,6 +44,10 @@ | |||
| 44 | #define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \ | 44 | #define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \ |
| 45 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) | 45 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) |
| 46 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) | 46 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) |
| 47 | #define DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, off) (((t) - (off)) * 100) | ||
| 48 | #define DECI_KELVIN_TO_MILLICELSIUS(t) DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, 2732) | ||
| 49 | #define MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, off) (((t) / 100) + (off)) | ||
| 50 | #define MILLICELSIUS_TO_DECI_KELVIN(t) MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, 2732) | ||
| 47 | 51 | ||
| 48 | /* Adding event notification support elements */ | 52 | /* Adding event notification support elements */ |
| 49 | #define THERMAL_GENL_FAMILY_NAME "thermal_event" | 53 | #define THERMAL_GENL_FAMILY_NAME "thermal_event" |
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index 1ad4724458de..baa81718d985 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h | |||
| @@ -63,7 +63,17 @@ struct uio_port { | |||
| 63 | 63 | ||
| 64 | #define MAX_UIO_PORT_REGIONS 5 | 64 | #define MAX_UIO_PORT_REGIONS 5 |
| 65 | 65 | ||
| 66 | struct uio_device; | 66 | struct uio_device { |
| 67 | struct module *owner; | ||
| 68 | struct device *dev; | ||
| 69 | int minor; | ||
| 70 | atomic_t event; | ||
| 71 | struct fasync_struct *async_queue; | ||
| 72 | wait_queue_head_t wait; | ||
| 73 | struct uio_info *info; | ||
| 74 | struct kobject *map_dir; | ||
| 75 | struct kobject *portio_dir; | ||
| 76 | }; | ||
| 67 | 77 | ||
| 68 | /** | 78 | /** |
| 69 | * struct uio_info - UIO device capabilities | 79 | * struct uio_info - UIO device capabilities |
diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index 4f844c6b03ee..60beb5dc7977 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h | |||
| @@ -98,11 +98,11 @@ struct uprobes_state { | |||
| 98 | struct xol_area *xol_area; | 98 | struct xol_area *xol_area; |
| 99 | }; | 99 | }; |
| 100 | 100 | ||
| 101 | extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); | 101 | extern int set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); |
| 102 | extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); | 102 | extern int set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); |
| 103 | extern bool __weak is_swbp_insn(uprobe_opcode_t *insn); | 103 | extern bool is_swbp_insn(uprobe_opcode_t *insn); |
| 104 | extern bool __weak is_trap_insn(uprobe_opcode_t *insn); | 104 | extern bool is_trap_insn(uprobe_opcode_t *insn); |
| 105 | extern unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs); | 105 | extern unsigned long uprobe_get_swbp_addr(struct pt_regs *regs); |
| 106 | extern unsigned long uprobe_get_trap_addr(struct pt_regs *regs); | 106 | extern unsigned long uprobe_get_trap_addr(struct pt_regs *regs); |
| 107 | extern int uprobe_write_opcode(struct mm_struct *mm, unsigned long vaddr, uprobe_opcode_t); | 107 | extern int uprobe_write_opcode(struct mm_struct *mm, unsigned long vaddr, uprobe_opcode_t); |
| 108 | extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc); | 108 | extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc); |
| @@ -128,8 +128,8 @@ extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk); | |||
| 128 | extern int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data); | 128 | extern int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data); |
| 129 | extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs); | 129 | extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs); |
| 130 | extern unsigned long arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs *regs); | 130 | extern unsigned long arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs *regs); |
| 131 | extern bool __weak arch_uprobe_ignore(struct arch_uprobe *aup, struct pt_regs *regs); | 131 | extern bool arch_uprobe_ignore(struct arch_uprobe *aup, struct pt_regs *regs); |
| 132 | extern void __weak arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr, | 132 | extern void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr, |
| 133 | void *src, unsigned long len); | 133 | void *src, unsigned long len); |
| 134 | #else /* !CONFIG_UPROBES */ | 134 | #else /* !CONFIG_UPROBES */ |
| 135 | struct uprobes_state { | 135 | struct uprobes_state { |
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 2a3038ee17a3..395b70e0eccf 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h | |||
| @@ -97,13 +97,8 @@ struct watchdog_device { | |||
| 97 | #define WDOG_UNREGISTERED 4 /* Has the device been unregistered */ | 97 | #define WDOG_UNREGISTERED 4 /* Has the device been unregistered */ |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | #ifdef CONFIG_WATCHDOG_NOWAYOUT | 100 | #define WATCHDOG_NOWAYOUT IS_BUILTIN(CONFIG_WATCHDOG_NOWAYOUT) |
| 101 | #define WATCHDOG_NOWAYOUT 1 | 101 | #define WATCHDOG_NOWAYOUT_INIT_STATUS (WATCHDOG_NOWAYOUT << WDOG_NO_WAY_OUT) |
| 102 | #define WATCHDOG_NOWAYOUT_INIT_STATUS (1 << WDOG_NO_WAY_OUT) | ||
| 103 | #else | ||
| 104 | #define WATCHDOG_NOWAYOUT 0 | ||
| 105 | #define WATCHDOG_NOWAYOUT_INIT_STATUS 0 | ||
| 106 | #endif | ||
| 107 | 102 | ||
| 108 | /* Use the following function to check whether or not the watchdog is active */ | 103 | /* Use the following function to check whether or not the watchdog is active */ |
| 109 | static inline bool watchdog_active(struct watchdog_device *wdd) | 104 | static inline bool watchdog_active(struct watchdog_device *wdd) |
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h index b2e85fdd2ae0..a09cca829082 100644 --- a/include/scsi/osd_initiator.h +++ b/include/scsi/osd_initiator.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. | 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Authors: | 6 | * Authors: |
| 7 | * Boaz Harrosh <bharrosh@panasas.com> | 7 | * Boaz Harrosh <ooo@electrozaur.com> |
| 8 | * Benny Halevy <bhalevy@panasas.com> | 8 | * Benny Halevy <bhalevy@panasas.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h index 6ca3265a4dca..7a8d2cd30328 100644 --- a/include/scsi/osd_ore.h +++ b/include/scsi/osd_ore.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2011 | 2 | * Copyright (C) 2011 |
| 3 | * Boaz Harrosh <bharrosh@panasas.com> | 3 | * Boaz Harrosh <ooo@electrozaur.com> |
| 4 | * | 4 | * |
| 5 | * Public Declarations of the ORE API | 5 | * Public Declarations of the ORE API |
| 6 | * | 6 | * |
diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h index a2594afe05c7..e0ca835e7bf7 100644 --- a/include/scsi/osd_protocol.h +++ b/include/scsi/osd_protocol.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. | 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Authors: | 6 | * Authors: |
| 7 | * Boaz Harrosh <bharrosh@panasas.com> | 7 | * Boaz Harrosh <ooo@electrozaur.com> |
| 8 | * Benny Halevy <bhalevy@panasas.com> | 8 | * Benny Halevy <bhalevy@panasas.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| @@ -496,7 +496,7 @@ struct osd_timestamp { | |||
| 496 | */ | 496 | */ |
| 497 | 497 | ||
| 498 | struct osd_key_identifier { | 498 | struct osd_key_identifier { |
| 499 | u8 id[7]; /* if you know why 7 please email bharrosh@panasas.com */ | 499 | u8 id[7]; /* if you know why 7 please email ooo@electrozaur.com */ |
| 500 | } __packed; | 500 | } __packed; |
| 501 | 501 | ||
| 502 | /* for osd_capability.format */ | 502 | /* for osd_capability.format */ |
diff --git a/include/scsi/osd_sec.h b/include/scsi/osd_sec.h index f96151c9c9e8..7abeb0f0db30 100644 --- a/include/scsi/osd_sec.h +++ b/include/scsi/osd_sec.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. | 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Authors: | 6 | * Authors: |
| 7 | * Boaz Harrosh <bharrosh@panasas.com> | 7 | * Boaz Harrosh <ooo@electrozaur.com> |
| 8 | * Benny Halevy <bhalevy@panasas.com> | 8 | * Benny Halevy <bhalevy@panasas.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/scsi/osd_sense.h b/include/scsi/osd_sense.h index 91db543a5502..d52aa93a0b2d 100644 --- a/include/scsi/osd_sense.h +++ b/include/scsi/osd_sense.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. | 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Authors: | 6 | * Authors: |
| 7 | * Boaz Harrosh <bharrosh@panasas.com> | 7 | * Boaz Harrosh <ooo@electrozaur.com> |
| 8 | * Benny Halevy <bhalevy@panasas.com> | 8 | * Benny Halevy <bhalevy@panasas.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/scsi/osd_types.h b/include/scsi/osd_types.h index bd0be7ed4bcf..48e8a165e136 100644 --- a/include/scsi/osd_types.h +++ b/include/scsi/osd_types.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. | 4 | * Copyright (C) 2008 Panasas Inc. All rights reserved. |
| 5 | * | 5 | * |
| 6 | * Authors: | 6 | * Authors: |
| 7 | * Boaz Harrosh <bharrosh@panasas.com> | 7 | * Boaz Harrosh <ooo@electrozaur.com> |
| 8 | * Benny Halevy <bhalevy@panasas.com> | 8 | * Benny Halevy <bhalevy@panasas.com> |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 9ec9864ecf38..23c518a0340c 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -108,6 +108,8 @@ | |||
| 108 | #define DA_EMULATE_ALUA 0 | 108 | #define DA_EMULATE_ALUA 0 |
| 109 | /* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */ | 109 | /* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */ |
| 110 | #define DA_ENFORCE_PR_ISIDS 1 | 110 | #define DA_ENFORCE_PR_ISIDS 1 |
| 111 | /* Force SPC-3 PR Activate Persistence across Target Power Loss */ | ||
| 112 | #define DA_FORCE_PR_APTPL 0 | ||
| 111 | #define DA_STATUS_MAX_SECTORS_MIN 16 | 113 | #define DA_STATUS_MAX_SECTORS_MIN 16 |
| 112 | #define DA_STATUS_MAX_SECTORS_MAX 8192 | 114 | #define DA_STATUS_MAX_SECTORS_MAX 8192 |
| 113 | /* By default don't report non-rotating (solid state) medium */ | 115 | /* By default don't report non-rotating (solid state) medium */ |
| @@ -680,6 +682,7 @@ struct se_dev_attrib { | |||
| 680 | enum target_prot_type pi_prot_type; | 682 | enum target_prot_type pi_prot_type; |
| 681 | enum target_prot_type hw_pi_prot_type; | 683 | enum target_prot_type hw_pi_prot_type; |
| 682 | int enforce_pr_isids; | 684 | int enforce_pr_isids; |
| 685 | int force_pr_aptpl; | ||
| 683 | int is_nonrot; | 686 | int is_nonrot; |
| 684 | int emulate_rest_reord; | 687 | int emulate_rest_reord; |
| 685 | u32 hw_block_size; | 688 | u32 hw_block_size; |
| @@ -903,4 +906,18 @@ struct se_wwn { | |||
| 903 | struct config_group fabric_stat_group; | 906 | struct config_group fabric_stat_group; |
| 904 | }; | 907 | }; |
| 905 | 908 | ||
| 909 | static inline void atomic_inc_mb(atomic_t *v) | ||
| 910 | { | ||
| 911 | smp_mb__before_atomic(); | ||
| 912 | atomic_inc(v); | ||
| 913 | smp_mb__after_atomic(); | ||
| 914 | } | ||
| 915 | |||
| 916 | static inline void atomic_dec_mb(atomic_t *v) | ||
| 917 | { | ||
| 918 | smp_mb__before_atomic(); | ||
| 919 | atomic_dec(v); | ||
| 920 | smp_mb__after_atomic(); | ||
| 921 | } | ||
| 922 | |||
| 906 | #endif /* TARGET_CORE_BASE_H */ | 923 | #endif /* TARGET_CORE_BASE_H */ |
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index d4f70a7fe876..ff4bd1b35246 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -2369,7 +2369,7 @@ TRACE_EVENT(ext4_es_lookup_extent_exit, | |||
| 2369 | show_extent_status(__entry->found ? __entry->status : 0)) | 2369 | show_extent_status(__entry->found ? __entry->status : 0)) |
| 2370 | ); | 2370 | ); |
| 2371 | 2371 | ||
| 2372 | TRACE_EVENT(ext4_es_shrink_enter, | 2372 | DECLARE_EVENT_CLASS(ext4__es_shrink_enter, |
| 2373 | TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), | 2373 | TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), |
| 2374 | 2374 | ||
| 2375 | TP_ARGS(sb, nr_to_scan, cache_cnt), | 2375 | TP_ARGS(sb, nr_to_scan, cache_cnt), |
| @@ -2391,26 +2391,38 @@ TRACE_EVENT(ext4_es_shrink_enter, | |||
| 2391 | __entry->nr_to_scan, __entry->cache_cnt) | 2391 | __entry->nr_to_scan, __entry->cache_cnt) |
| 2392 | ); | 2392 | ); |
| 2393 | 2393 | ||
| 2394 | TRACE_EVENT(ext4_es_shrink_exit, | 2394 | DEFINE_EVENT(ext4__es_shrink_enter, ext4_es_shrink_count, |
| 2395 | TP_PROTO(struct super_block *sb, int shrunk_nr, int cache_cnt), | 2395 | TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), |
| 2396 | 2396 | ||
| 2397 | TP_ARGS(sb, shrunk_nr, cache_cnt), | 2397 | TP_ARGS(sb, nr_to_scan, cache_cnt) |
| 2398 | ); | ||
| 2399 | |||
| 2400 | DEFINE_EVENT(ext4__es_shrink_enter, ext4_es_shrink_scan_enter, | ||
| 2401 | TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), | ||
| 2402 | |||
| 2403 | TP_ARGS(sb, nr_to_scan, cache_cnt) | ||
| 2404 | ); | ||
| 2405 | |||
| 2406 | TRACE_EVENT(ext4_es_shrink_scan_exit, | ||
| 2407 | TP_PROTO(struct super_block *sb, int nr_shrunk, int cache_cnt), | ||
| 2408 | |||
| 2409 | TP_ARGS(sb, nr_shrunk, cache_cnt), | ||
| 2398 | 2410 | ||
| 2399 | TP_STRUCT__entry( | 2411 | TP_STRUCT__entry( |
| 2400 | __field( dev_t, dev ) | 2412 | __field( dev_t, dev ) |
| 2401 | __field( int, shrunk_nr ) | 2413 | __field( int, nr_shrunk ) |
| 2402 | __field( int, cache_cnt ) | 2414 | __field( int, cache_cnt ) |
| 2403 | ), | 2415 | ), |
| 2404 | 2416 | ||
| 2405 | TP_fast_assign( | 2417 | TP_fast_assign( |
| 2406 | __entry->dev = sb->s_dev; | 2418 | __entry->dev = sb->s_dev; |
| 2407 | __entry->shrunk_nr = shrunk_nr; | 2419 | __entry->nr_shrunk = nr_shrunk; |
| 2408 | __entry->cache_cnt = cache_cnt; | 2420 | __entry->cache_cnt = cache_cnt; |
| 2409 | ), | 2421 | ), |
| 2410 | 2422 | ||
| 2411 | TP_printk("dev %d,%d shrunk_nr %d cache_cnt %d", | 2423 | TP_printk("dev %d,%d nr_shrunk %d cache_cnt %d", |
| 2412 | MAJOR(__entry->dev), MINOR(__entry->dev), | 2424 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 2413 | __entry->shrunk_nr, __entry->cache_cnt) | 2425 | __entry->nr_shrunk, __entry->cache_cnt) |
| 2414 | ); | 2426 | ); |
| 2415 | 2427 | ||
| 2416 | TRACE_EVENT(ext4_collapse_range, | 2428 | TRACE_EVENT(ext4_collapse_range, |
| @@ -2438,6 +2450,37 @@ TRACE_EVENT(ext4_collapse_range, | |||
| 2438 | __entry->offset, __entry->len) | 2450 | __entry->offset, __entry->len) |
| 2439 | ); | 2451 | ); |
| 2440 | 2452 | ||
| 2453 | TRACE_EVENT(ext4_es_shrink, | ||
| 2454 | TP_PROTO(struct super_block *sb, int nr_shrunk, u64 scan_time, | ||
| 2455 | int skip_precached, int nr_skipped, int retried), | ||
| 2456 | |||
| 2457 | TP_ARGS(sb, nr_shrunk, scan_time, skip_precached, nr_skipped, retried), | ||
| 2458 | |||
| 2459 | TP_STRUCT__entry( | ||
| 2460 | __field( dev_t, dev ) | ||
| 2461 | __field( int, nr_shrunk ) | ||
| 2462 | __field( unsigned long long, scan_time ) | ||
| 2463 | __field( int, skip_precached ) | ||
| 2464 | __field( int, nr_skipped ) | ||
| 2465 | __field( int, retried ) | ||
| 2466 | ), | ||
| 2467 | |||
| 2468 | TP_fast_assign( | ||
| 2469 | __entry->dev = sb->s_dev; | ||
| 2470 | __entry->nr_shrunk = nr_shrunk; | ||
| 2471 | __entry->scan_time = div_u64(scan_time, 1000); | ||
| 2472 | __entry->skip_precached = skip_precached; | ||
| 2473 | __entry->nr_skipped = nr_skipped; | ||
| 2474 | __entry->retried = retried; | ||
| 2475 | ), | ||
| 2476 | |||
| 2477 | TP_printk("dev %d,%d nr_shrunk %d, scan_time %llu skip_precached %d " | ||
| 2478 | "nr_skipped %d retried %d", | ||
| 2479 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->nr_shrunk, | ||
| 2480 | __entry->scan_time, __entry->skip_precached, | ||
| 2481 | __entry->nr_skipped, __entry->retried) | ||
| 2482 | ); | ||
| 2483 | |||
| 2441 | #endif /* _TRACE_EXT4_H */ | 2484 | #endif /* _TRACE_EXT4_H */ |
| 2442 | 2485 | ||
| 2443 | /* This part must be outside protection */ | 2486 | /* This part must be outside protection */ |
diff --git a/include/trace/events/thermal.h b/include/trace/events/thermal.h new file mode 100644 index 000000000000..0f4f95d63c03 --- /dev/null +++ b/include/trace/events/thermal.h | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM thermal | ||
| 3 | |||
| 4 | #if !defined(_TRACE_THERMAL_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_THERMAL_H | ||
| 6 | |||
| 7 | #include <linux/thermal.h> | ||
| 8 | #include <linux/tracepoint.h> | ||
| 9 | |||
| 10 | TRACE_EVENT(thermal_temperature, | ||
| 11 | |||
| 12 | TP_PROTO(struct thermal_zone_device *tz), | ||
| 13 | |||
| 14 | TP_ARGS(tz), | ||
| 15 | |||
| 16 | TP_STRUCT__entry( | ||
| 17 | __string(thermal_zone, tz->type) | ||
| 18 | __field(int, id) | ||
| 19 | __field(int, temp_prev) | ||
| 20 | __field(int, temp) | ||
| 21 | ), | ||
| 22 | |||
| 23 | TP_fast_assign( | ||
| 24 | __assign_str(thermal_zone, tz->type); | ||
| 25 | __entry->id = tz->id; | ||
| 26 | __entry->temp_prev = tz->last_temperature; | ||
| 27 | __entry->temp = tz->temperature; | ||
| 28 | ), | ||
| 29 | |||
| 30 | TP_printk("thermal_zone=%s id=%d temp_prev=%d temp=%d", | ||
| 31 | __get_str(thermal_zone), __entry->id, __entry->temp_prev, | ||
| 32 | __entry->temp) | ||
| 33 | ); | ||
| 34 | |||
| 35 | TRACE_EVENT(cdev_update, | ||
| 36 | |||
| 37 | TP_PROTO(struct thermal_cooling_device *cdev, unsigned long target), | ||
| 38 | |||
| 39 | TP_ARGS(cdev, target), | ||
| 40 | |||
| 41 | TP_STRUCT__entry( | ||
| 42 | __string(type, cdev->type) | ||
| 43 | __field(unsigned long, target) | ||
| 44 | ), | ||
| 45 | |||
| 46 | TP_fast_assign( | ||
| 47 | __assign_str(type, cdev->type); | ||
| 48 | __entry->target = target; | ||
| 49 | ), | ||
| 50 | |||
| 51 | TP_printk("type=%s target=%lu", __get_str(type), __entry->target) | ||
| 52 | ); | ||
| 53 | |||
| 54 | TRACE_EVENT(thermal_zone_trip, | ||
| 55 | |||
| 56 | TP_PROTO(struct thermal_zone_device *tz, int trip, | ||
| 57 | enum thermal_trip_type trip_type), | ||
| 58 | |||
| 59 | TP_ARGS(tz, trip, trip_type), | ||
| 60 | |||
| 61 | TP_STRUCT__entry( | ||
| 62 | __string(thermal_zone, tz->type) | ||
| 63 | __field(int, id) | ||
| 64 | __field(int, trip) | ||
| 65 | __field(enum thermal_trip_type, trip_type) | ||
| 66 | ), | ||
| 67 | |||
| 68 | TP_fast_assign( | ||
| 69 | __assign_str(thermal_zone, tz->type); | ||
| 70 | __entry->id = tz->id; | ||
| 71 | __entry->trip = trip; | ||
| 72 | __entry->trip_type = trip_type; | ||
| 73 | ), | ||
| 74 | |||
| 75 | TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%d", | ||
| 76 | __get_str(thermal_zone), __entry->id, __entry->trip, | ||
| 77 | __entry->trip_type) | ||
| 78 | ); | ||
| 79 | |||
| 80 | #endif /* _TRACE_THERMAL_H */ | ||
| 81 | |||
| 82 | /* This part must be outside protection */ | ||
| 83 | #include <trace/define_trace.h> | ||
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 6cad97485bad..b70237e8bc37 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -374,6 +374,7 @@ header-y += swab.h | |||
| 374 | header-y += synclink.h | 374 | header-y += synclink.h |
| 375 | header-y += sysctl.h | 375 | header-y += sysctl.h |
| 376 | header-y += sysinfo.h | 376 | header-y += sysinfo.h |
| 377 | header-y += target_core_user.h | ||
| 377 | header-y += taskstats.h | 378 | header-y += taskstats.h |
| 378 | header-y += tcp.h | 379 | header-y += tcp.h |
| 379 | header-y += tcp_metrics.h | 380 | header-y += tcp_metrics.h |
diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index ca1a11bb4443..3735fa0a6784 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #define RENAME_NOREPLACE (1 << 0) /* Don't overwrite target */ | 38 | #define RENAME_NOREPLACE (1 << 0) /* Don't overwrite target */ |
| 39 | #define RENAME_EXCHANGE (1 << 1) /* Exchange source and dest */ | 39 | #define RENAME_EXCHANGE (1 << 1) /* Exchange source and dest */ |
| 40 | #define RENAME_WHITEOUT (1 << 2) /* Whiteout source */ | ||
| 40 | 41 | ||
| 41 | struct fstrim_range { | 42 | struct fstrim_range { |
| 42 | __u64 start; | 43 | __u64 start; |
diff --git a/include/uapi/linux/target_core_user.h b/include/uapi/linux/target_core_user.h new file mode 100644 index 000000000000..7dcfbe6771b1 --- /dev/null +++ b/include/uapi/linux/target_core_user.h | |||
| @@ -0,0 +1,142 @@ | |||
| 1 | #ifndef __TARGET_CORE_USER_H | ||
| 2 | #define __TARGET_CORE_USER_H | ||
| 3 | |||
| 4 | /* This header will be used by application too */ | ||
| 5 | |||
| 6 | #include <linux/types.h> | ||
| 7 | #include <linux/uio.h> | ||
| 8 | |||
| 9 | #ifndef __packed | ||
| 10 | #define __packed __attribute__((packed)) | ||
| 11 | #endif | ||
| 12 | |||
| 13 | #define TCMU_VERSION "1.0" | ||
| 14 | |||
| 15 | /* | ||
| 16 | * Ring Design | ||
| 17 | * ----------- | ||
| 18 | * | ||
| 19 | * The mmaped area is divided into three parts: | ||
| 20 | * 1) The mailbox (struct tcmu_mailbox, below) | ||
| 21 | * 2) The command ring | ||
| 22 | * 3) Everything beyond the command ring (data) | ||
| 23 | * | ||
| 24 | * The mailbox tells userspace the offset of the command ring from the | ||
| 25 | * start of the shared memory region, and how big the command ring is. | ||
| 26 | * | ||
| 27 | * The kernel passes SCSI commands to userspace by putting a struct | ||
| 28 | * tcmu_cmd_entry in the ring, updating mailbox->cmd_head, and poking | ||
| 29 | * userspace via uio's interrupt mechanism. | ||
| 30 | * | ||
| 31 | * tcmu_cmd_entry contains a header. If the header type is PAD, | ||
| 32 | * userspace should skip hdr->length bytes (mod cmdr_size) to find the | ||
| 33 | * next cmd_entry. | ||
| 34 | * | ||
| 35 | * Otherwise, the entry will contain offsets into the mmaped area that | ||
| 36 | * contain the cdb and data buffers -- the latter accessible via the | ||
| 37 | * iov array. iov addresses are also offsets into the shared area. | ||
| 38 | * | ||
| 39 | * When userspace is completed handling the command, set | ||
| 40 | * entry->rsp.scsi_status, fill in rsp.sense_buffer if appropriate, | ||
| 41 | * and also set mailbox->cmd_tail equal to the old cmd_tail plus | ||
| 42 | * hdr->length, mod cmdr_size. If cmd_tail doesn't equal cmd_head, it | ||
| 43 | * should process the next packet the same way, and so on. | ||
| 44 | */ | ||
| 45 | |||
| 46 | #define TCMU_MAILBOX_VERSION 1 | ||
| 47 | #define ALIGN_SIZE 64 /* Should be enough for most CPUs */ | ||
| 48 | |||
| 49 | struct tcmu_mailbox { | ||
| 50 | __u16 version; | ||
| 51 | __u16 flags; | ||
| 52 | __u32 cmdr_off; | ||
| 53 | __u32 cmdr_size; | ||
| 54 | |||
| 55 | __u32 cmd_head; | ||
| 56 | |||
| 57 | /* Updated by user. On its own cacheline */ | ||
| 58 | __u32 cmd_tail __attribute__((__aligned__(ALIGN_SIZE))); | ||
| 59 | |||
| 60 | } __packed; | ||
| 61 | |||
| 62 | enum tcmu_opcode { | ||
| 63 | TCMU_OP_PAD = 0, | ||
| 64 | TCMU_OP_CMD, | ||
| 65 | }; | ||
| 66 | |||
| 67 | /* | ||
| 68 | * Only a few opcodes, and length is 8-byte aligned, so use low bits for opcode. | ||
| 69 | */ | ||
| 70 | struct tcmu_cmd_entry_hdr { | ||
| 71 | __u32 len_op; | ||
| 72 | } __packed; | ||
| 73 | |||
| 74 | #define TCMU_OP_MASK 0x7 | ||
| 75 | |||
| 76 | static inline enum tcmu_opcode tcmu_hdr_get_op(struct tcmu_cmd_entry_hdr *hdr) | ||
| 77 | { | ||
| 78 | return hdr->len_op & TCMU_OP_MASK; | ||
| 79 | } | ||
| 80 | |||
| 81 | static inline void tcmu_hdr_set_op(struct tcmu_cmd_entry_hdr *hdr, enum tcmu_opcode op) | ||
| 82 | { | ||
| 83 | hdr->len_op &= ~TCMU_OP_MASK; | ||
| 84 | hdr->len_op |= (op & TCMU_OP_MASK); | ||
| 85 | } | ||
| 86 | |||
| 87 | static inline __u32 tcmu_hdr_get_len(struct tcmu_cmd_entry_hdr *hdr) | ||
| 88 | { | ||
| 89 | return hdr->len_op & ~TCMU_OP_MASK; | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline void tcmu_hdr_set_len(struct tcmu_cmd_entry_hdr *hdr, __u32 len) | ||
| 93 | { | ||
| 94 | hdr->len_op &= TCMU_OP_MASK; | ||
| 95 | hdr->len_op |= len; | ||
| 96 | } | ||
| 97 | |||
| 98 | /* Currently the same as SCSI_SENSE_BUFFERSIZE */ | ||
| 99 | #define TCMU_SENSE_BUFFERSIZE 96 | ||
| 100 | |||
| 101 | struct tcmu_cmd_entry { | ||
| 102 | struct tcmu_cmd_entry_hdr hdr; | ||
| 103 | |||
| 104 | uint16_t cmd_id; | ||
| 105 | uint16_t __pad1; | ||
| 106 | |||
| 107 | union { | ||
| 108 | struct { | ||
| 109 | uint64_t cdb_off; | ||
| 110 | uint64_t iov_cnt; | ||
| 111 | struct iovec iov[0]; | ||
| 112 | } req; | ||
| 113 | struct { | ||
| 114 | uint8_t scsi_status; | ||
| 115 | uint8_t __pad1; | ||
| 116 | uint16_t __pad2; | ||
| 117 | uint32_t __pad3; | ||
| 118 | char sense_buffer[TCMU_SENSE_BUFFERSIZE]; | ||
| 119 | } rsp; | ||
| 120 | }; | ||
| 121 | |||
| 122 | } __packed; | ||
| 123 | |||
| 124 | #define TCMU_OP_ALIGN_SIZE sizeof(uint64_t) | ||
| 125 | |||
| 126 | enum tcmu_genl_cmd { | ||
| 127 | TCMU_CMD_UNSPEC, | ||
| 128 | TCMU_CMD_ADDED_DEVICE, | ||
| 129 | TCMU_CMD_REMOVED_DEVICE, | ||
| 130 | __TCMU_CMD_MAX, | ||
| 131 | }; | ||
| 132 | #define TCMU_CMD_MAX (__TCMU_CMD_MAX - 1) | ||
| 133 | |||
| 134 | enum tcmu_genl_attr { | ||
| 135 | TCMU_ATTR_UNSPEC, | ||
| 136 | TCMU_ATTR_DEVICE, | ||
| 137 | TCMU_ATTR_MINOR, | ||
| 138 | __TCMU_ATTR_MAX, | ||
| 139 | }; | ||
| 140 | #define TCMU_ATTR_MAX (__TCMU_ATTR_MAX - 1) | ||
| 141 | |||
| 142 | #endif | ||
