diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2011-08-08 00:45:28 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2011-08-08 00:45:28 -0400 |
| commit | 77c7ee51a062bb595c501ec098125a68999c20c3 (patch) | |
| tree | c5060ca5786ef353e005dae04b61d2c49967284d /include | |
| parent | 1ba762209491e2496e58baffa3fd65d661f54404 (diff) | |
| parent | 322a8b034003c0d46d39af85bf24fee27b902f48 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into sh-latest
Conflicts:
drivers/tty/serial/sh-sci.c
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'include')
39 files changed, 581 insertions, 196 deletions
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index 3090471b2a5e..e49c36d38d7e 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h | |||
| @@ -128,7 +128,7 @@ extern int is_dock_device(acpi_handle handle); | |||
| 128 | extern int register_dock_notifier(struct notifier_block *nb); | 128 | extern int register_dock_notifier(struct notifier_block *nb); |
| 129 | extern void unregister_dock_notifier(struct notifier_block *nb); | 129 | extern void unregister_dock_notifier(struct notifier_block *nb); |
| 130 | extern int register_hotplug_dock_device(acpi_handle handle, | 130 | extern int register_hotplug_dock_device(acpi_handle handle, |
| 131 | struct acpi_dock_ops *ops, | 131 | const struct acpi_dock_ops *ops, |
| 132 | void *context); | 132 | void *context); |
| 133 | extern void unregister_hotplug_dock_device(acpi_handle handle); | 133 | extern void unregister_hotplug_dock_device(acpi_handle handle); |
| 134 | #else | 134 | #else |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 2ed0a8486c19..f554a9313b43 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | 47 | ||
| 48 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 48 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
| 49 | 49 | ||
| 50 | #define ACPI_CA_VERSION 0x20110413 | 50 | #define ACPI_CA_VERSION 0x20110623 |
| 51 | 51 | ||
| 52 | #include "actypes.h" | 52 | #include "actypes.h" |
| 53 | #include "actbl.h" | 53 | #include "actbl.h" |
| @@ -69,6 +69,7 @@ extern u32 acpi_gbl_trace_flags; | |||
| 69 | extern u32 acpi_gbl_enable_aml_debug_object; | 69 | extern u32 acpi_gbl_enable_aml_debug_object; |
| 70 | extern u8 acpi_gbl_copy_dsdt_locally; | 70 | extern u8 acpi_gbl_copy_dsdt_locally; |
| 71 | extern u8 acpi_gbl_truncate_io_addresses; | 71 | extern u8 acpi_gbl_truncate_io_addresses; |
| 72 | extern u8 acpi_gbl_disable_auto_repair; | ||
| 72 | 73 | ||
| 73 | extern u32 acpi_current_gpe_count; | 74 | extern u32 acpi_current_gpe_count; |
| 74 | extern struct acpi_table_fadt acpi_gbl_FADT; | 75 | extern struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/include/acpi/apei.h b/include/acpi/apei.h index e67b523a50e1..51a527d24a8a 100644 --- a/include/acpi/apei.h +++ b/include/acpi/apei.h | |||
| @@ -18,6 +18,11 @@ | |||
| 18 | 18 | ||
| 19 | extern int hest_disable; | 19 | extern int hest_disable; |
| 20 | extern int erst_disable; | 20 | extern int erst_disable; |
| 21 | #ifdef CONFIG_ACPI_APEI_GHES | ||
| 22 | extern int ghes_disable; | ||
| 23 | #else | ||
| 24 | #define ghes_disable 1 | ||
| 25 | #endif | ||
| 21 | 26 | ||
| 22 | #ifdef CONFIG_ACPI_APEI | 27 | #ifdef CONFIG_ACPI_APEI |
| 23 | void __init acpi_hest_init(void); | 28 | void __init acpi_hest_init(void); |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index ba4928cae473..67055f180330 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -337,7 +337,7 @@ extern struct cpuidle_driver acpi_idle_driver; | |||
| 337 | 337 | ||
| 338 | /* in processor_thermal.c */ | 338 | /* in processor_thermal.c */ |
| 339 | int acpi_processor_get_limit_info(struct acpi_processor *pr); | 339 | int acpi_processor_get_limit_info(struct acpi_processor *pr); |
| 340 | extern struct thermal_cooling_device_ops processor_cooling_ops; | 340 | extern const struct thermal_cooling_device_ops processor_cooling_ops; |
| 341 | #ifdef CONFIG_CPU_FREQ | 341 | #ifdef CONFIG_CPU_FREQ |
| 342 | void acpi_thermal_cpufreq_init(void); | 342 | void acpi_thermal_cpufreq_init(void); |
| 343 | void acpi_thermal_cpufreq_exit(void); | 343 | void acpi_thermal_cpufreq_exit(void); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 33d12f87f0e0..44335e57eaaa 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -205,6 +205,8 @@ struct drm_display_info { | |||
| 205 | enum subpixel_order subpixel_order; | 205 | enum subpixel_order subpixel_order; |
| 206 | u32 color_formats; | 206 | u32 color_formats; |
| 207 | 207 | ||
| 208 | u8 cea_rev; | ||
| 209 | |||
| 208 | char *raw_edid; /* if any */ | 210 | char *raw_edid; /* if any */ |
| 209 | }; | 211 | }; |
| 210 | 212 | ||
| @@ -802,6 +804,7 @@ extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | |||
| 802 | extern int drm_add_modes_noedid(struct drm_connector *connector, | 804 | extern int drm_add_modes_noedid(struct drm_connector *connector, |
| 803 | int hdisplay, int vdisplay); | 805 | int hdisplay, int vdisplay); |
| 804 | 806 | ||
| 807 | extern int drm_edid_header_is_valid(const u8 *raw_edid); | ||
| 805 | extern bool drm_edid_is_valid(struct edid *edid); | 808 | extern bool drm_edid_is_valid(struct edid *edid); |
| 806 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, | 809 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, |
| 807 | int hsize, int vsize, int fresh); | 810 | int hsize, int vsize, int fresh); |
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index c4d6dbfa3ff4..28c0d114cb52 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
| @@ -237,7 +237,7 @@ typedef struct _drm_i915_sarea { | |||
| 237 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) | 237 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) |
| 238 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) | 238 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) |
| 239 | #define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) | 239 | #define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) |
| 240 | #define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_IOCTL_I915_OVERLAY_ATTRS, struct drm_intel_overlay_put_image) | 240 | #define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image) |
| 241 | #define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) | 241 | #define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) |
| 242 | 242 | ||
| 243 | /* Allow drivers to submit batchbuffers directly to hardware, relying | 243 | /* Allow drivers to submit batchbuffers directly to hardware, relying |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 1deb2a73c2da..6001b4da39dd 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -238,7 +238,6 @@ extern int acpi_paddr_to_node(u64 start_addr, u64 size); | |||
| 238 | extern int pnpacpi_disabled; | 238 | extern int pnpacpi_disabled; |
| 239 | 239 | ||
| 240 | #define PXM_INVAL (-1) | 240 | #define PXM_INVAL (-1) |
| 241 | #define NID_INVAL (-1) | ||
| 242 | 241 | ||
| 243 | int acpi_check_resource_conflict(const struct resource *res); | 242 | int acpi_check_resource_conflict(const struct resource *res); |
| 244 | 243 | ||
| @@ -280,6 +279,8 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context); | |||
| 280 | #define OSC_SB_CPUHP_OST_SUPPORT 8 | 279 | #define OSC_SB_CPUHP_OST_SUPPORT 8 |
| 281 | #define OSC_SB_APEI_SUPPORT 16 | 280 | #define OSC_SB_APEI_SUPPORT 16 |
| 282 | 281 | ||
| 282 | extern bool osc_sb_apei_support_acked; | ||
| 283 | |||
| 283 | /* PCI defined _OSC bits */ | 284 | /* PCI defined _OSC bits */ |
| 284 | /* _OSC DW1 Definition (OS Support Fields) */ | 285 | /* _OSC DW1 Definition (OS Support Fields) */ |
| 285 | #define OSC_EXT_PCI_CONFIG_SUPPORT 1 | 286 | #define OSC_EXT_PCI_CONFIG_SUPPORT 1 |
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 3bac44cce142..7ad634501e48 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h | |||
| @@ -146,6 +146,7 @@ extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order); | |||
| 146 | extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits); | 146 | extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits); |
| 147 | extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits); | 147 | extern int bitmap_ord_to_pos(const unsigned long *bitmap, int n, int bits); |
| 148 | 148 | ||
| 149 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG)) | ||
| 149 | #define BITMAP_LAST_WORD_MASK(nbits) \ | 150 | #define BITMAP_LAST_WORD_MASK(nbits) \ |
| 150 | ( \ | 151 | ( \ |
| 151 | ((nbits) % BITS_PER_LONG) ? \ | 152 | ((nbits) % BITS_PER_LONG) ? \ |
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 36719ead50e8..b51629e15cfc 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
| @@ -122,6 +122,8 @@ struct cpuidle_driver { | |||
| 122 | }; | 122 | }; |
| 123 | 123 | ||
| 124 | #ifdef CONFIG_CPU_IDLE | 124 | #ifdef CONFIG_CPU_IDLE |
| 125 | extern void disable_cpuidle(void); | ||
| 126 | extern int cpuidle_idle_call(void); | ||
| 125 | 127 | ||
| 126 | extern int cpuidle_register_driver(struct cpuidle_driver *drv); | 128 | extern int cpuidle_register_driver(struct cpuidle_driver *drv); |
| 127 | struct cpuidle_driver *cpuidle_get_driver(void); | 129 | struct cpuidle_driver *cpuidle_get_driver(void); |
| @@ -135,6 +137,8 @@ extern int cpuidle_enable_device(struct cpuidle_device *dev); | |||
| 135 | extern void cpuidle_disable_device(struct cpuidle_device *dev); | 137 | extern void cpuidle_disable_device(struct cpuidle_device *dev); |
| 136 | 138 | ||
| 137 | #else | 139 | #else |
| 140 | static inline void disable_cpuidle(void) { } | ||
| 141 | static inline int cpuidle_idle_call(void) { return -ENODEV; } | ||
| 138 | 142 | ||
| 139 | static inline int cpuidle_register_driver(struct cpuidle_driver *drv) | 143 | static inline int cpuidle_register_driver(struct cpuidle_driver *drv) |
| 140 | {return -ENODEV; } | 144 | {return -ENODEV; } |
diff --git a/include/linux/cred.h b/include/linux/cred.h index 48e82af1159b..98f46efbe2d2 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
| @@ -265,10 +265,11 @@ static inline void put_cred(const struct cred *_cred) | |||
| 265 | /** | 265 | /** |
| 266 | * current_cred - Access the current task's subjective credentials | 266 | * current_cred - Access the current task's subjective credentials |
| 267 | * | 267 | * |
| 268 | * Access the subjective credentials of the current task. | 268 | * Access the subjective credentials of the current task. RCU-safe, |
| 269 | * since nobody else can modify it. | ||
| 269 | */ | 270 | */ |
| 270 | #define current_cred() \ | 271 | #define current_cred() \ |
| 271 | (current->cred) | 272 | (*(__force struct cred **)¤t->cred) |
| 272 | 273 | ||
| 273 | /** | 274 | /** |
| 274 | * __task_cred - Access a task's objective credentials | 275 | * __task_cred - Access a task's objective credentials |
| @@ -307,7 +308,7 @@ static inline void put_cred(const struct cred *_cred) | |||
| 307 | ({ \ | 308 | ({ \ |
| 308 | struct user_struct *__u; \ | 309 | struct user_struct *__u; \ |
| 309 | struct cred *__cred; \ | 310 | struct cred *__cred; \ |
| 310 | __cred = (struct cred *) current_cred(); \ | 311 | __cred = current_cred(); \ |
| 311 | __u = get_uid(__cred->user); \ | 312 | __u = get_uid(__cred->user); \ |
| 312 | __u; \ | 313 | __u; \ |
| 313 | }) | 314 | }) |
| @@ -322,7 +323,7 @@ static inline void put_cred(const struct cred *_cred) | |||
| 322 | ({ \ | 323 | ({ \ |
| 323 | struct group_info *__groups; \ | 324 | struct group_info *__groups; \ |
| 324 | struct cred *__cred; \ | 325 | struct cred *__cred; \ |
| 325 | __cred = (struct cred *) current_cred(); \ | 326 | __cred = current_cred(); \ |
| 326 | __groups = get_group_info(__cred->group_info); \ | 327 | __groups = get_group_info(__cred->group_info); \ |
| 327 | __groups; \ | 328 | __groups; \ |
| 328 | }) | 329 | }) |
| @@ -341,7 +342,7 @@ static inline void put_cred(const struct cred *_cred) | |||
| 341 | 342 | ||
| 342 | #define current_cred_xxx(xxx) \ | 343 | #define current_cred_xxx(xxx) \ |
| 343 | ({ \ | 344 | ({ \ |
| 344 | current->cred->xxx; \ | 345 | current_cred()->xxx; \ |
| 345 | }) | 346 | }) |
| 346 | 347 | ||
| 347 | #define current_uid() (current_cred_xxx(uid)) | 348 | #define current_uid() (current_cred_xxx(uid)) |
diff --git a/include/linux/cryptohash.h b/include/linux/cryptohash.h index ec78a4bbe1d5..2cd9f1cf9fa3 100644 --- a/include/linux/cryptohash.h +++ b/include/linux/cryptohash.h | |||
| @@ -3,11 +3,16 @@ | |||
| 3 | 3 | ||
| 4 | #define SHA_DIGEST_WORDS 5 | 4 | #define SHA_DIGEST_WORDS 5 |
| 5 | #define SHA_MESSAGE_BYTES (512 /*bits*/ / 8) | 5 | #define SHA_MESSAGE_BYTES (512 /*bits*/ / 8) |
| 6 | #define SHA_WORKSPACE_WORDS 80 | 6 | #define SHA_WORKSPACE_WORDS 16 |
| 7 | 7 | ||
| 8 | void sha_init(__u32 *buf); | 8 | void sha_init(__u32 *buf); |
| 9 | void sha_transform(__u32 *digest, const char *data, __u32 *W); | 9 | void sha_transform(__u32 *digest, const char *data, __u32 *W); |
| 10 | 10 | ||
| 11 | #define MD5_DIGEST_WORDS 4 | ||
| 12 | #define MD5_MESSAGE_BYTES 64 | ||
| 13 | |||
| 14 | void md5_transform(__u32 *hash, __u32 const *in); | ||
| 15 | |||
| 11 | __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]); | 16 | __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]); |
| 12 | 17 | ||
| 13 | #endif | 18 | #endif |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d37d2a793099..62157c03caf7 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -180,12 +180,12 @@ struct dentry_operations { | |||
| 180 | */ | 180 | */ |
| 181 | 181 | ||
| 182 | /* d_flags entries */ | 182 | /* d_flags entries */ |
| 183 | #define DCACHE_AUTOFS_PENDING 0x0001 /* autofs: "under construction" */ | 183 | #define DCACHE_OP_HASH 0x0001 |
| 184 | #define DCACHE_NFSFS_RENAMED 0x0002 | 184 | #define DCACHE_OP_COMPARE 0x0002 |
| 185 | /* this dentry has been "silly renamed" and has to be deleted on the last | 185 | #define DCACHE_OP_REVALIDATE 0x0004 |
| 186 | * dput() */ | 186 | #define DCACHE_OP_DELETE 0x0008 |
| 187 | 187 | ||
| 188 | #define DCACHE_DISCONNECTED 0x0004 | 188 | #define DCACHE_DISCONNECTED 0x0010 |
| 189 | /* This dentry is possibly not currently connected to the dcache tree, in | 189 | /* This dentry is possibly not currently connected to the dcache tree, in |
| 190 | * which case its parent will either be itself, or will have this flag as | 190 | * which case its parent will either be itself, or will have this flag as |
| 191 | * well. nfsd will not use a dentry with this bit set, but will first | 191 | * well. nfsd will not use a dentry with this bit set, but will first |
| @@ -196,22 +196,18 @@ struct dentry_operations { | |||
| 196 | * dentry into place and return that dentry rather than the passed one, | 196 | * dentry into place and return that dentry rather than the passed one, |
| 197 | * typically using d_splice_alias. */ | 197 | * typically using d_splice_alias. */ |
| 198 | 198 | ||
| 199 | #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ | 199 | #define DCACHE_REFERENCED 0x0020 /* Recently used, don't discard. */ |
| 200 | #define DCACHE_RCUACCESS 0x0010 /* Entry has ever been RCU-visible */ | 200 | #define DCACHE_RCUACCESS 0x0040 /* Entry has ever been RCU-visible */ |
| 201 | #define DCACHE_INOTIFY_PARENT_WATCHED 0x0020 | ||
| 202 | /* Parent inode is watched by inotify */ | ||
| 203 | |||
| 204 | #define DCACHE_COOKIE 0x0040 /* For use by dcookie subsystem */ | ||
| 205 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x0080 | ||
| 206 | /* Parent inode is watched by some fsnotify listener */ | ||
| 207 | 201 | ||
| 208 | #define DCACHE_CANT_MOUNT 0x0100 | 202 | #define DCACHE_CANT_MOUNT 0x0100 |
| 209 | #define DCACHE_GENOCIDE 0x0200 | 203 | #define DCACHE_GENOCIDE 0x0200 |
| 210 | 204 | ||
| 211 | #define DCACHE_OP_HASH 0x1000 | 205 | #define DCACHE_NFSFS_RENAMED 0x1000 |
| 212 | #define DCACHE_OP_COMPARE 0x2000 | 206 | /* this dentry has been "silly renamed" and has to be deleted on the last |
| 213 | #define DCACHE_OP_REVALIDATE 0x4000 | 207 | * dput() */ |
| 214 | #define DCACHE_OP_DELETE 0x8000 | 208 | #define DCACHE_COOKIE 0x2000 /* For use by dcookie subsystem */ |
| 209 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x4000 | ||
| 210 | /* Parent inode is watched by some fsnotify listener */ | ||
| 215 | 211 | ||
| 216 | #define DCACHE_MOUNTED 0x10000 /* is a mountpoint */ | 212 | #define DCACHE_MOUNTED 0x10000 /* is a mountpoint */ |
| 217 | #define DCACHE_NEED_AUTOMOUNT 0x20000 /* handle automount on this dir */ | 213 | #define DCACHE_NEED_AUTOMOUNT 0x20000 /* handle automount on this dir */ |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 4427e0454051..3fa1f3d90ce0 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -208,6 +208,49 @@ struct dm_target_callbacks { | |||
| 208 | int dm_register_target(struct target_type *t); | 208 | int dm_register_target(struct target_type *t); |
| 209 | void dm_unregister_target(struct target_type *t); | 209 | void dm_unregister_target(struct target_type *t); |
| 210 | 210 | ||
| 211 | /* | ||
| 212 | * Target argument parsing. | ||
| 213 | */ | ||
| 214 | struct dm_arg_set { | ||
| 215 | unsigned argc; | ||
| 216 | char **argv; | ||
| 217 | }; | ||
| 218 | |||
| 219 | /* | ||
| 220 | * The minimum and maximum value of a numeric argument, together with | ||
| 221 | * the error message to use if the number is found to be outside that range. | ||
| 222 | */ | ||
| 223 | struct dm_arg { | ||
| 224 | unsigned min; | ||
| 225 | unsigned max; | ||
| 226 | char *error; | ||
| 227 | }; | ||
| 228 | |||
| 229 | /* | ||
| 230 | * Validate the next argument, either returning it as *value or, if invalid, | ||
| 231 | * returning -EINVAL and setting *error. | ||
| 232 | */ | ||
| 233 | int dm_read_arg(struct dm_arg *arg, struct dm_arg_set *arg_set, | ||
| 234 | unsigned *value, char **error); | ||
| 235 | |||
| 236 | /* | ||
| 237 | * Process the next argument as the start of a group containing between | ||
| 238 | * arg->min and arg->max further arguments. Either return the size as | ||
| 239 | * *num_args or, if invalid, return -EINVAL and set *error. | ||
| 240 | */ | ||
| 241 | int dm_read_arg_group(struct dm_arg *arg, struct dm_arg_set *arg_set, | ||
| 242 | unsigned *num_args, char **error); | ||
| 243 | |||
| 244 | /* | ||
| 245 | * Return the current argument and shift to the next. | ||
| 246 | */ | ||
| 247 | const char *dm_shift_arg(struct dm_arg_set *as); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * Move through num_args arguments. | ||
| 251 | */ | ||
| 252 | void dm_consume_args(struct dm_arg_set *as, unsigned num_args); | ||
| 253 | |||
| 211 | /*----------------------------------------------------------------- | 254 | /*----------------------------------------------------------------- |
| 212 | * Functions for creating and manipulating mapped devices. | 255 | * Functions for creating and manipulating mapped devices. |
| 213 | * Drop the reference with dm_put when you finish with the object. | 256 | * Drop the reference with dm_put when you finish with the object. |
diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index 3708455ee6c3..0cb8eff76bd6 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h | |||
| @@ -267,9 +267,9 @@ enum { | |||
| 267 | #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) | 267 | #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) |
| 268 | 268 | ||
| 269 | #define DM_VERSION_MAJOR 4 | 269 | #define DM_VERSION_MAJOR 4 |
| 270 | #define DM_VERSION_MINOR 20 | 270 | #define DM_VERSION_MINOR 21 |
| 271 | #define DM_VERSION_PATCHLEVEL 0 | 271 | #define DM_VERSION_PATCHLEVEL 0 |
| 272 | #define DM_VERSION_EXTRA "-ioctl (2011-02-02)" | 272 | #define DM_VERSION_EXTRA "-ioctl (2011-07-06)" |
| 273 | 273 | ||
| 274 | /* Status bits */ | 274 | /* Status bits */ |
| 275 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ | 275 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ |
diff --git a/include/linux/dm-kcopyd.h b/include/linux/dm-kcopyd.h index 298d587e349b..5e54458e920f 100644 --- a/include/linux/dm-kcopyd.h +++ b/include/linux/dm-kcopyd.h | |||
| @@ -42,5 +42,20 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from, | |||
| 42 | unsigned num_dests, struct dm_io_region *dests, | 42 | unsigned num_dests, struct dm_io_region *dests, |
| 43 | unsigned flags, dm_kcopyd_notify_fn fn, void *context); | 43 | unsigned flags, dm_kcopyd_notify_fn fn, void *context); |
| 44 | 44 | ||
| 45 | /* | ||
| 46 | * Prepare a callback and submit it via the kcopyd thread. | ||
| 47 | * | ||
| 48 | * dm_kcopyd_prepare_callback allocates a callback structure and returns it. | ||
| 49 | * It must not be called from interrupt context. | ||
| 50 | * The returned value should be passed into dm_kcopyd_do_callback. | ||
| 51 | * | ||
| 52 | * dm_kcopyd_do_callback submits the callback. | ||
| 53 | * It may be called from interrupt context. | ||
| 54 | * The callback is issued from the kcopyd thread. | ||
| 55 | */ | ||
| 56 | void *dm_kcopyd_prepare_callback(struct dm_kcopyd_client *kc, | ||
| 57 | dm_kcopyd_notify_fn fn, void *context); | ||
| 58 | void dm_kcopyd_do_callback(void *job, int read_err, unsigned long write_err); | ||
| 59 | |||
| 45 | #endif /* __KERNEL__ */ | 60 | #endif /* __KERNEL__ */ |
| 46 | #endif /* _LINUX_DM_KCOPYD_H */ | 61 | #endif /* _LINUX_DM_KCOPYD_H */ |
diff --git a/include/linux/fault-inject.h b/include/linux/fault-inject.h index 3ff060ac7810..c6f996f2abb6 100644 --- a/include/linux/fault-inject.h +++ b/include/linux/fault-inject.h | |||
| @@ -25,10 +25,6 @@ struct fault_attr { | |||
| 25 | unsigned long reject_end; | 25 | unsigned long reject_end; |
| 26 | 26 | ||
| 27 | unsigned long count; | 27 | unsigned long count; |
| 28 | |||
| 29 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | ||
| 30 | struct dentry *dir; | ||
| 31 | #endif | ||
| 32 | }; | 28 | }; |
| 33 | 29 | ||
| 34 | #define FAULT_ATTR_INITIALIZER { \ | 30 | #define FAULT_ATTR_INITIALIZER { \ |
| @@ -45,19 +41,15 @@ bool should_fail(struct fault_attr *attr, ssize_t size); | |||
| 45 | 41 | ||
| 46 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | 42 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS |
| 47 | 43 | ||
| 48 | int init_fault_attr_dentries(struct fault_attr *attr, const char *name); | 44 | struct dentry *fault_create_debugfs_attr(const char *name, |
| 49 | void cleanup_fault_attr_dentries(struct fault_attr *attr); | 45 | struct dentry *parent, struct fault_attr *attr); |
| 50 | 46 | ||
| 51 | #else /* CONFIG_FAULT_INJECTION_DEBUG_FS */ | 47 | #else /* CONFIG_FAULT_INJECTION_DEBUG_FS */ |
| 52 | 48 | ||
| 53 | static inline int init_fault_attr_dentries(struct fault_attr *attr, | 49 | static inline struct dentry *fault_create_debugfs_attr(const char *name, |
| 54 | const char *name) | 50 | struct dentry *parent, struct fault_attr *attr) |
| 55 | { | ||
| 56 | return -ENODEV; | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline void cleanup_fault_attr_dentries(struct fault_attr *attr) | ||
| 60 | { | 51 | { |
| 52 | return ERR_PTR(-ENODEV); | ||
| 61 | } | 53 | } |
| 62 | 54 | ||
| 63 | #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ | 55 | #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 786b3b1113cf..178cdb4f1d4a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -738,22 +738,54 @@ static inline int mapping_writably_mapped(struct address_space *mapping) | |||
| 738 | struct posix_acl; | 738 | struct posix_acl; |
| 739 | #define ACL_NOT_CACHED ((void *)(-1)) | 739 | #define ACL_NOT_CACHED ((void *)(-1)) |
| 740 | 740 | ||
| 741 | #define IOP_FASTPERM 0x0001 | ||
| 742 | #define IOP_LOOKUP 0x0002 | ||
| 743 | #define IOP_NOFOLLOW 0x0004 | ||
| 744 | |||
| 745 | /* | ||
| 746 | * Keep mostly read-only and often accessed (especially for | ||
| 747 | * the RCU path lookup and 'stat' data) fields at the beginning | ||
| 748 | * of the 'struct inode' | ||
| 749 | */ | ||
| 741 | struct inode { | 750 | struct inode { |
| 742 | /* RCU path lookup touches following: */ | ||
| 743 | umode_t i_mode; | 751 | umode_t i_mode; |
| 752 | unsigned short i_opflags; | ||
| 744 | uid_t i_uid; | 753 | uid_t i_uid; |
| 745 | gid_t i_gid; | 754 | gid_t i_gid; |
| 755 | unsigned int i_flags; | ||
| 756 | |||
| 757 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 758 | struct posix_acl *i_acl; | ||
| 759 | struct posix_acl *i_default_acl; | ||
| 760 | #endif | ||
| 761 | |||
| 746 | const struct inode_operations *i_op; | 762 | const struct inode_operations *i_op; |
| 747 | struct super_block *i_sb; | 763 | struct super_block *i_sb; |
| 764 | struct address_space *i_mapping; | ||
| 748 | 765 | ||
| 749 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
| 750 | unsigned int i_flags; | ||
| 751 | unsigned long i_state; | ||
| 752 | #ifdef CONFIG_SECURITY | 766 | #ifdef CONFIG_SECURITY |
| 753 | void *i_security; | 767 | void *i_security; |
| 754 | #endif | 768 | #endif |
| 755 | struct mutex i_mutex; | ||
| 756 | 769 | ||
| 770 | /* Stat data, not accessed from path walking */ | ||
| 771 | unsigned long i_ino; | ||
| 772 | unsigned int i_nlink; | ||
| 773 | dev_t i_rdev; | ||
| 774 | loff_t i_size; | ||
| 775 | struct timespec i_atime; | ||
| 776 | struct timespec i_mtime; | ||
| 777 | struct timespec i_ctime; | ||
| 778 | unsigned int i_blkbits; | ||
| 779 | blkcnt_t i_blocks; | ||
| 780 | |||
| 781 | #ifdef __NEED_I_SIZE_ORDERED | ||
| 782 | seqcount_t i_size_seqcount; | ||
| 783 | #endif | ||
| 784 | |||
| 785 | /* Misc */ | ||
| 786 | unsigned long i_state; | ||
| 787 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
| 788 | struct mutex i_mutex; | ||
| 757 | 789 | ||
| 758 | unsigned long dirtied_when; /* jiffies of first dirtying */ | 790 | unsigned long dirtied_when; /* jiffies of first dirtying */ |
| 759 | 791 | ||
| @@ -765,25 +797,12 @@ struct inode { | |||
| 765 | struct list_head i_dentry; | 797 | struct list_head i_dentry; |
| 766 | struct rcu_head i_rcu; | 798 | struct rcu_head i_rcu; |
| 767 | }; | 799 | }; |
| 768 | unsigned long i_ino; | ||
| 769 | atomic_t i_count; | 800 | atomic_t i_count; |
| 770 | unsigned int i_nlink; | ||
| 771 | dev_t i_rdev; | ||
| 772 | unsigned int i_blkbits; | ||
| 773 | u64 i_version; | 801 | u64 i_version; |
| 774 | loff_t i_size; | ||
| 775 | #ifdef __NEED_I_SIZE_ORDERED | ||
| 776 | seqcount_t i_size_seqcount; | ||
| 777 | #endif | ||
| 778 | struct timespec i_atime; | ||
| 779 | struct timespec i_mtime; | ||
| 780 | struct timespec i_ctime; | ||
| 781 | blkcnt_t i_blocks; | ||
| 782 | unsigned short i_bytes; | 802 | unsigned short i_bytes; |
| 783 | atomic_t i_dio_count; | 803 | atomic_t i_dio_count; |
| 784 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ | 804 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ |
| 785 | struct file_lock *i_flock; | 805 | struct file_lock *i_flock; |
| 786 | struct address_space *i_mapping; | ||
| 787 | struct address_space i_data; | 806 | struct address_space i_data; |
| 788 | #ifdef CONFIG_QUOTA | 807 | #ifdef CONFIG_QUOTA |
| 789 | struct dquot *i_dquot[MAXQUOTAS]; | 808 | struct dquot *i_dquot[MAXQUOTAS]; |
| @@ -806,10 +825,6 @@ struct inode { | |||
| 806 | atomic_t i_readcount; /* struct files open RO */ | 825 | atomic_t i_readcount; /* struct files open RO */ |
| 807 | #endif | 826 | #endif |
| 808 | atomic_t i_writecount; | 827 | atomic_t i_writecount; |
| 809 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 810 | struct posix_acl *i_acl; | ||
| 811 | struct posix_acl *i_default_acl; | ||
| 812 | #endif | ||
| 813 | void *i_private; /* fs or device private pointer */ | 828 | void *i_private; /* fs or device private pointer */ |
| 814 | }; | 829 | }; |
| 815 | 830 | ||
diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 5bbebda78b02..5e98eeb2af3b 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h | |||
| @@ -1,8 +1,26 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Basic general purpose allocator for managing special purpose memory | 2 | * Basic general purpose allocator for managing special purpose |
| 3 | * not managed by the regular kmalloc/kfree interface. | 3 | * memory, for example, memory that is not managed by the regular |
| 4 | * Uses for this includes on-device special memory, uncached memory | 4 | * kmalloc/kfree interface. Uses for this includes on-device special |
| 5 | * etc. | 5 | * memory, uncached memory etc. |
| 6 | * | ||
| 7 | * It is safe to use the allocator in NMI handlers and other special | ||
| 8 | * unblockable contexts that could otherwise deadlock on locks. This | ||
| 9 | * is implemented by using atomic operations and retries on any | ||
| 10 | * conflicts. The disadvantage is that there may be livelocks in | ||
| 11 | * extreme cases. For better scalability, one allocator can be used | ||
| 12 | * for each CPU. | ||
| 13 | * | ||
| 14 | * The lockless operation only works if there is enough memory | ||
| 15 | * available. If new memory is added to the pool a lock has to be | ||
| 16 | * still taken. So any user relying on locklessness has to ensure | ||
| 17 | * that sufficient memory is preallocated. | ||
| 18 | * | ||
| 19 | * The basic atomic operation of this allocator is cmpxchg on long. | ||
| 20 | * On architectures that don't have NMI-safe cmpxchg implementation, | ||
| 21 | * the allocator can NOT be used in NMI handler. So code uses the | ||
| 22 | * allocator in NMI handler should depend on | ||
| 23 | * CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG. | ||
| 6 | * | 24 | * |
| 7 | * This source code is licensed under the GNU General Public License, | 25 | * This source code is licensed under the GNU General Public License, |
| 8 | * Version 2. See the file COPYING for more details. | 26 | * Version 2. See the file COPYING for more details. |
| @@ -15,7 +33,7 @@ | |||
| 15 | * General purpose special memory pool descriptor. | 33 | * General purpose special memory pool descriptor. |
| 16 | */ | 34 | */ |
| 17 | struct gen_pool { | 35 | struct gen_pool { |
| 18 | rwlock_t lock; | 36 | spinlock_t lock; |
| 19 | struct list_head chunks; /* list of chunks in this pool */ | 37 | struct list_head chunks; /* list of chunks in this pool */ |
| 20 | int min_alloc_order; /* minimum allocation order */ | 38 | int min_alloc_order; /* minimum allocation order */ |
| 21 | }; | 39 | }; |
| @@ -24,8 +42,8 @@ struct gen_pool { | |||
| 24 | * General purpose special memory pool chunk descriptor. | 42 | * General purpose special memory pool chunk descriptor. |
| 25 | */ | 43 | */ |
| 26 | struct gen_pool_chunk { | 44 | struct gen_pool_chunk { |
| 27 | spinlock_t lock; | ||
| 28 | struct list_head next_chunk; /* next chunk in pool */ | 45 | struct list_head next_chunk; /* next chunk in pool */ |
| 46 | atomic_t avail; | ||
| 29 | phys_addr_t phys_addr; /* physical starting address of memory chunk */ | 47 | phys_addr_t phys_addr; /* physical starting address of memory chunk */ |
| 30 | unsigned long start_addr; /* starting address of memory chunk */ | 48 | unsigned long start_addr; /* starting address of memory chunk */ |
| 31 | unsigned long end_addr; /* ending address of memory chunk */ | 49 | unsigned long end_addr; /* ending address of memory chunk */ |
| @@ -56,4 +74,8 @@ static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr, | |||
| 56 | extern void gen_pool_destroy(struct gen_pool *); | 74 | extern void gen_pool_destroy(struct gen_pool *); |
| 57 | extern unsigned long gen_pool_alloc(struct gen_pool *, size_t); | 75 | extern unsigned long gen_pool_alloc(struct gen_pool *, size_t); |
| 58 | extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); | 76 | extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); |
| 77 | extern void gen_pool_for_each_chunk(struct gen_pool *, | ||
| 78 | void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *); | ||
| 79 | extern size_t gen_pool_avail(struct gen_pool *); | ||
| 80 | extern size_t gen_pool_size(struct gen_pool *); | ||
| 59 | #endif /* __GENALLOC_H__ */ | 81 | #endif /* __GENALLOC_H__ */ |
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index cb4089254f01..3a76faf6a3ee 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
| @@ -92,7 +92,7 @@ struct vm_area_struct; | |||
| 92 | */ | 92 | */ |
| 93 | #define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK) | 93 | #define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK) |
| 94 | 94 | ||
| 95 | #define __GFP_BITS_SHIFT 23 /* Room for 23 __GFP_FOO bits */ | 95 | #define __GFP_BITS_SHIFT 24 /* Room for N __GFP_FOO bits */ |
| 96 | #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) | 96 | #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) |
| 97 | 97 | ||
| 98 | /* This equals 0, but use constants in case they ever change */ | 98 | /* This equals 0, but use constants in case they ever change */ |
diff --git a/include/linux/idr.h b/include/linux/idr.h index 13a801f3d028..255491cf522e 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h | |||
| @@ -146,6 +146,10 @@ void ida_remove(struct ida *ida, int id); | |||
| 146 | void ida_destroy(struct ida *ida); | 146 | void ida_destroy(struct ida *ida); |
| 147 | void ida_init(struct ida *ida); | 147 | void ida_init(struct ida *ida); |
| 148 | 148 | ||
| 149 | int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, | ||
| 150 | gfp_t gfp_mask); | ||
| 151 | void ida_simple_remove(struct ida *ida, unsigned int id); | ||
| 152 | |||
| 149 | void __init idr_init_cache(void); | 153 | void __init idr_init_cache(void); |
| 150 | 154 | ||
| 151 | #endif /* __IDR_H__ */ | 155 | #endif /* __IDR_H__ */ |
diff --git a/include/linux/input.h b/include/linux/input.h index 068784e17972..a637e7814334 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -438,6 +438,8 @@ struct input_keymap_entry { | |||
| 438 | #define KEY_WIMAX 246 | 438 | #define KEY_WIMAX 246 |
| 439 | #define KEY_RFKILL 247 /* Key that controls all radios */ | 439 | #define KEY_RFKILL 247 /* Key that controls all radios */ |
| 440 | 440 | ||
| 441 | #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ | ||
| 442 | |||
| 441 | /* Code 255 is reserved for special needs of AT keyboard driver */ | 443 | /* Code 255 is reserved for special needs of AT keyboard driver */ |
| 442 | 444 | ||
| 443 | #define BTN_MISC 0x100 | 445 | #define BTN_MISC 0x100 |
diff --git a/include/linux/llist.h b/include/linux/llist.h new file mode 100644 index 000000000000..aa0c8b5b3cd0 --- /dev/null +++ b/include/linux/llist.h | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | #ifndef LLIST_H | ||
| 2 | #define LLIST_H | ||
| 3 | /* | ||
| 4 | * Lock-less NULL terminated single linked list | ||
| 5 | * | ||
| 6 | * If there are multiple producers and multiple consumers, llist_add | ||
| 7 | * can be used in producers and llist_del_all can be used in | ||
| 8 | * consumers. They can work simultaneously without lock. But | ||
| 9 | * llist_del_first can not be used here. Because llist_del_first | ||
| 10 | * depends on list->first->next does not changed if list->first is not | ||
| 11 | * changed during its operation, but llist_del_first, llist_add, | ||
| 12 | * llist_add (or llist_del_all, llist_add, llist_add) sequence in | ||
| 13 | * another consumer may violate that. | ||
| 14 | * | ||
| 15 | * If there are multiple producers and one consumer, llist_add can be | ||
| 16 | * used in producers and llist_del_all or llist_del_first can be used | ||
| 17 | * in the consumer. | ||
| 18 | * | ||
| 19 | * This can be summarized as follow: | ||
| 20 | * | ||
| 21 | * | add | del_first | del_all | ||
| 22 | * add | - | - | - | ||
| 23 | * del_first | | L | L | ||
| 24 | * del_all | | | - | ||
| 25 | * | ||
| 26 | * Where "-" stands for no lock is needed, while "L" stands for lock | ||
| 27 | * is needed. | ||
| 28 | * | ||
| 29 | * The list entries deleted via llist_del_all can be traversed with | ||
| 30 | * traversing function such as llist_for_each etc. But the list | ||
| 31 | * entries can not be traversed safely before deleted from the list. | ||
| 32 | * The order of deleted entries is from the newest to the oldest added | ||
| 33 | * one. If you want to traverse from the oldest to the newest, you | ||
| 34 | * must reverse the order by yourself before traversing. | ||
| 35 | * | ||
| 36 | * The basic atomic operation of this list is cmpxchg on long. On | ||
| 37 | * architectures that don't have NMI-safe cmpxchg implementation, the | ||
| 38 | * list can NOT be used in NMI handler. So code uses the list in NMI | ||
| 39 | * handler should depend on CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG. | ||
| 40 | */ | ||
| 41 | |||
| 42 | struct llist_head { | ||
| 43 | struct llist_node *first; | ||
| 44 | }; | ||
| 45 | |||
| 46 | struct llist_node { | ||
| 47 | struct llist_node *next; | ||
| 48 | }; | ||
| 49 | |||
| 50 | #define LLIST_HEAD_INIT(name) { NULL } | ||
| 51 | #define LLIST_HEAD(name) struct llist_head name = LLIST_HEAD_INIT(name) | ||
| 52 | |||
| 53 | /** | ||
| 54 | * init_llist_head - initialize lock-less list head | ||
| 55 | * @head: the head for your lock-less list | ||
| 56 | */ | ||
| 57 | static inline void init_llist_head(struct llist_head *list) | ||
| 58 | { | ||
| 59 | list->first = NULL; | ||
| 60 | } | ||
| 61 | |||
| 62 | /** | ||
| 63 | * llist_entry - get the struct of this entry | ||
| 64 | * @ptr: the &struct llist_node pointer. | ||
| 65 | * @type: the type of the struct this is embedded in. | ||
| 66 | * @member: the name of the llist_node within the struct. | ||
| 67 | */ | ||
| 68 | #define llist_entry(ptr, type, member) \ | ||
| 69 | container_of(ptr, type, member) | ||
| 70 | |||
| 71 | /** | ||
| 72 | * llist_for_each - iterate over some deleted entries of a lock-less list | ||
| 73 | * @pos: the &struct llist_node to use as a loop cursor | ||
| 74 | * @node: the first entry of deleted list entries | ||
| 75 | * | ||
| 76 | * In general, some entries of the lock-less list can be traversed | ||
| 77 | * safely only after being deleted from list, so start with an entry | ||
| 78 | * instead of list head. | ||
| 79 | * | ||
| 80 | * If being used on entries deleted from lock-less list directly, the | ||
| 81 | * traverse order is from the newest to the oldest added entry. If | ||
| 82 | * you want to traverse from the oldest to the newest, you must | ||
| 83 | * reverse the order by yourself before traversing. | ||
| 84 | */ | ||
| 85 | #define llist_for_each(pos, node) \ | ||
| 86 | for ((pos) = (node); pos; (pos) = (pos)->next) | ||
| 87 | |||
| 88 | /** | ||
| 89 | * llist_for_each_entry - iterate over some deleted entries of lock-less list of given type | ||
| 90 | * @pos: the type * to use as a loop cursor. | ||
| 91 | * @node: the fist entry of deleted list entries. | ||
| 92 | * @member: the name of the llist_node with the struct. | ||
| 93 | * | ||
| 94 | * In general, some entries of the lock-less list can be traversed | ||
| 95 | * safely only after being removed from list, so start with an entry | ||
| 96 | * instead of list head. | ||
| 97 | * | ||
| 98 | * If being used on entries deleted from lock-less list directly, the | ||
| 99 | * traverse order is from the newest to the oldest added entry. If | ||
| 100 | * you want to traverse from the oldest to the newest, you must | ||
| 101 | * reverse the order by yourself before traversing. | ||
| 102 | */ | ||
| 103 | #define llist_for_each_entry(pos, node, member) \ | ||
| 104 | for ((pos) = llist_entry((node), typeof(*(pos)), member); \ | ||
| 105 | &(pos)->member != NULL; \ | ||
| 106 | (pos) = llist_entry((pos)->member.next, typeof(*(pos)), member)) | ||
| 107 | |||
| 108 | /** | ||
| 109 | * llist_empty - tests whether a lock-less list is empty | ||
| 110 | * @head: the list to test | ||
| 111 | * | ||
| 112 | * Not guaranteed to be accurate or up to date. Just a quick way to | ||
| 113 | * test whether the list is empty without deleting something from the | ||
| 114 | * list. | ||
| 115 | */ | ||
| 116 | static inline int llist_empty(const struct llist_head *head) | ||
| 117 | { | ||
| 118 | return ACCESS_ONCE(head->first) == NULL; | ||
| 119 | } | ||
| 120 | |||
| 121 | void llist_add(struct llist_node *new, struct llist_head *head); | ||
| 122 | void llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, | ||
| 123 | struct llist_head *head); | ||
| 124 | struct llist_node *llist_del_first(struct llist_head *head); | ||
| 125 | struct llist_node *llist_del_all(struct llist_head *head); | ||
| 126 | #endif /* LLIST_H */ | ||
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index b96600786913..3b535db00a94 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -86,8 +86,6 @@ extern void mem_cgroup_uncharge_end(void); | |||
| 86 | 86 | ||
| 87 | extern void mem_cgroup_uncharge_page(struct page *page); | 87 | extern void mem_cgroup_uncharge_page(struct page *page); |
| 88 | extern void mem_cgroup_uncharge_cache_page(struct page *page); | 88 | extern void mem_cgroup_uncharge_cache_page(struct page *page); |
| 89 | extern int mem_cgroup_shmem_charge_fallback(struct page *page, | ||
| 90 | struct mm_struct *mm, gfp_t gfp_mask); | ||
| 91 | 89 | ||
| 92 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); | 90 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); |
| 93 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); | 91 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); |
| @@ -225,12 +223,6 @@ static inline void mem_cgroup_uncharge_cache_page(struct page *page) | |||
| 225 | { | 223 | { |
| 226 | } | 224 | } |
| 227 | 225 | ||
| 228 | static inline int mem_cgroup_shmem_charge_fallback(struct page *page, | ||
| 229 | struct mm_struct *mm, gfp_t gfp_mask) | ||
| 230 | { | ||
| 231 | return 0; | ||
| 232 | } | ||
| 233 | |||
| 234 | static inline void mem_cgroup_add_lru_list(struct page *page, int lru) | 226 | static inline void mem_cgroup_add_lru_list(struct page *page, int lru) |
| 235 | { | 227 | { |
| 236 | } | 228 | } |
diff --git a/include/linux/mfd/aat2870.h b/include/linux/mfd/aat2870.h index 89212df05622..f7316c29bdec 100644 --- a/include/linux/mfd/aat2870.h +++ b/include/linux/mfd/aat2870.h | |||
| @@ -89,7 +89,7 @@ enum aat2870_id { | |||
| 89 | 89 | ||
| 90 | /* Backlight current magnitude (mA) */ | 90 | /* Backlight current magnitude (mA) */ |
| 91 | enum aat2870_current { | 91 | enum aat2870_current { |
| 92 | AAT2870_CURRENT_0_45, | 92 | AAT2870_CURRENT_0_45 = 1, |
| 93 | AAT2870_CURRENT_0_90, | 93 | AAT2870_CURRENT_0_90, |
| 94 | AAT2870_CURRENT_1_80, | 94 | AAT2870_CURRENT_1_80, |
| 95 | AAT2870_CURRENT_2_70, | 95 | AAT2870_CURRENT_2_70, |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 3172a1c0f08e..f2690cf49827 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1600,6 +1600,7 @@ enum mf_flags { | |||
| 1600 | }; | 1600 | }; |
| 1601 | extern void memory_failure(unsigned long pfn, int trapno); | 1601 | extern void memory_failure(unsigned long pfn, int trapno); |
| 1602 | extern int __memory_failure(unsigned long pfn, int trapno, int flags); | 1602 | extern int __memory_failure(unsigned long pfn, int trapno, int flags); |
| 1603 | extern void memory_failure_queue(unsigned long pfn, int trapno, int flags); | ||
| 1603 | extern int unpoison_memory(unsigned long pfn); | 1604 | extern int unpoison_memory(unsigned long pfn); |
| 1604 | extern int sysctl_memory_failure_early_kill; | 1605 | extern int sysctl_memory_failure_early_kill; |
| 1605 | extern int sysctl_memory_failure_recovery; | 1606 | extern int sysctl_memory_failure_recovery; |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 569ea5b76fda..abd615d74a29 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -773,6 +773,11 @@ struct nfs3_getaclres { | |||
| 773 | struct posix_acl * acl_default; | 773 | struct posix_acl * acl_default; |
| 774 | }; | 774 | }; |
| 775 | 775 | ||
| 776 | struct nfs4_string { | ||
| 777 | unsigned int len; | ||
| 778 | char *data; | ||
| 779 | }; | ||
| 780 | |||
| 776 | #ifdef CONFIG_NFS_V4 | 781 | #ifdef CONFIG_NFS_V4 |
| 777 | 782 | ||
| 778 | typedef u64 clientid4; | 783 | typedef u64 clientid4; |
| @@ -963,11 +968,6 @@ struct nfs4_server_caps_res { | |||
| 963 | struct nfs4_sequence_res seq_res; | 968 | struct nfs4_sequence_res seq_res; |
| 964 | }; | 969 | }; |
| 965 | 970 | ||
| 966 | struct nfs4_string { | ||
| 967 | unsigned int len; | ||
| 968 | char *data; | ||
| 969 | }; | ||
| 970 | |||
| 971 | #define NFS4_PATHNAME_MAXCOMPONENTS 512 | 971 | #define NFS4_PATHNAME_MAXCOMPONENTS 512 |
| 972 | struct nfs4_pathname { | 972 | struct nfs4_pathname { |
| 973 | unsigned int ncomponents; | 973 | unsigned int ncomponents; |
diff --git a/include/linux/of.h b/include/linux/of.h index bd716f8908de..0085bb01c041 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
| @@ -196,12 +196,13 @@ extern struct property *of_find_property(const struct device_node *np, | |||
| 196 | const char *name, | 196 | const char *name, |
| 197 | int *lenp); | 197 | int *lenp); |
| 198 | extern int of_property_read_u32_array(const struct device_node *np, | 198 | extern int of_property_read_u32_array(const struct device_node *np, |
| 199 | char *propname, | 199 | const char *propname, |
| 200 | u32 *out_values, | 200 | u32 *out_values, |
| 201 | size_t sz); | 201 | size_t sz); |
| 202 | 202 | ||
| 203 | extern int of_property_read_string(struct device_node *np, char *propname, | 203 | extern int of_property_read_string(struct device_node *np, |
| 204 | const char **out_string); | 204 | const char *propname, |
| 205 | const char **out_string); | ||
| 205 | extern int of_device_is_compatible(const struct device_node *device, | 206 | extern int of_device_is_compatible(const struct device_node *device, |
| 206 | const char *); | 207 | const char *); |
| 207 | extern int of_device_is_available(const struct device_node *device); | 208 | extern int of_device_is_available(const struct device_node *device); |
| @@ -242,13 +243,15 @@ static inline bool of_have_populated_dt(void) | |||
| 242 | } | 243 | } |
| 243 | 244 | ||
| 244 | static inline int of_property_read_u32_array(const struct device_node *np, | 245 | static inline int of_property_read_u32_array(const struct device_node *np, |
| 245 | char *propname, u32 *out_values, size_t sz) | 246 | const char *propname, |
| 247 | u32 *out_values, size_t sz) | ||
| 246 | { | 248 | { |
| 247 | return -ENOSYS; | 249 | return -ENOSYS; |
| 248 | } | 250 | } |
| 249 | 251 | ||
| 250 | static inline int of_property_read_string(struct device_node *np, | 252 | static inline int of_property_read_string(struct device_node *np, |
| 251 | char *propname, const char **out_string) | 253 | const char *propname, |
| 254 | const char **out_string) | ||
| 252 | { | 255 | { |
| 253 | return -ENOSYS; | 256 | return -ENOSYS; |
| 254 | } | 257 | } |
| @@ -256,7 +259,7 @@ static inline int of_property_read_string(struct device_node *np, | |||
| 256 | #endif /* CONFIG_OF */ | 259 | #endif /* CONFIG_OF */ |
| 257 | 260 | ||
| 258 | static inline int of_property_read_u32(const struct device_node *np, | 261 | static inline int of_property_read_u32(const struct device_node *np, |
| 259 | char *propname, | 262 | const char *propname, |
| 260 | u32 *out_value) | 263 | u32 *out_value) |
| 261 | { | 264 | { |
| 262 | return of_property_read_u32_array(np, propname, out_value, 1); | 265 | return of_property_read_u32_array(np, propname, out_value, 1); |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index b00c4ec5056e..ae96bbe54518 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2709,6 +2709,16 @@ | |||
| 2709 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 | 2709 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 |
| 2710 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 | 2710 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 |
| 2711 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f | 2711 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f |
| 2712 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB0 0x3c20 | ||
| 2713 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB1 0x3c21 | ||
| 2714 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB2 0x3c22 | ||
| 2715 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB3 0x3c23 | ||
| 2716 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB4 0x3c24 | ||
| 2717 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB5 0x3c25 | ||
| 2718 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB6 0x3c26 | ||
| 2719 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB7 0x3c27 | ||
| 2720 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB8 0x3c2e | ||
| 2721 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB9 0x3c2f | ||
| 2712 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f | 2722 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f |
| 2713 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 | 2723 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 |
| 2714 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 | 2724 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 |
diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 951bba82d50d..b7681102a4b9 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #define __LINUX_POSIX_ACL_H | 9 | #define __LINUX_POSIX_ACL_H |
| 10 | 10 | ||
| 11 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
| 12 | #include <linux/rcupdate.h> | ||
| 12 | 13 | ||
| 13 | #define ACL_UNDEFINED_ID (-1) | 14 | #define ACL_UNDEFINED_ID (-1) |
| 14 | 15 | ||
| @@ -38,7 +39,10 @@ struct posix_acl_entry { | |||
| 38 | }; | 39 | }; |
| 39 | 40 | ||
| 40 | struct posix_acl { | 41 | struct posix_acl { |
| 41 | atomic_t a_refcount; | 42 | union { |
| 43 | atomic_t a_refcount; | ||
| 44 | struct rcu_head a_rcu; | ||
| 45 | }; | ||
| 42 | unsigned int a_count; | 46 | unsigned int a_count; |
| 43 | struct posix_acl_entry a_entries[0]; | 47 | struct posix_acl_entry a_entries[0]; |
| 44 | }; | 48 | }; |
| @@ -65,7 +69,7 @@ static inline void | |||
| 65 | posix_acl_release(struct posix_acl *acl) | 69 | posix_acl_release(struct posix_acl *acl) |
| 66 | { | 70 | { |
| 67 | if (acl && atomic_dec_and_test(&acl->a_refcount)) | 71 | if (acl && atomic_dec_and_test(&acl->a_refcount)) |
| 68 | kfree(acl); | 72 | kfree_rcu(acl, a_rcu); |
| 69 | } | 73 | } |
| 70 | 74 | ||
| 71 | 75 | ||
| @@ -84,20 +88,22 @@ extern struct posix_acl *get_posix_acl(struct inode *, int); | |||
| 84 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); | 88 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); |
| 85 | 89 | ||
| 86 | #ifdef CONFIG_FS_POSIX_ACL | 90 | #ifdef CONFIG_FS_POSIX_ACL |
| 87 | static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | 91 | static inline struct posix_acl **acl_by_type(struct inode *inode, int type) |
| 88 | { | 92 | { |
| 89 | struct posix_acl **p, *acl; | ||
| 90 | switch (type) { | 93 | switch (type) { |
| 91 | case ACL_TYPE_ACCESS: | 94 | case ACL_TYPE_ACCESS: |
| 92 | p = &inode->i_acl; | 95 | return &inode->i_acl; |
| 93 | break; | ||
| 94 | case ACL_TYPE_DEFAULT: | 96 | case ACL_TYPE_DEFAULT: |
| 95 | p = &inode->i_default_acl; | 97 | return &inode->i_default_acl; |
| 96 | break; | ||
| 97 | default: | 98 | default: |
| 98 | return ERR_PTR(-EINVAL); | 99 | BUG(); |
| 99 | } | 100 | } |
| 100 | acl = ACCESS_ONCE(*p); | 101 | } |
| 102 | |||
| 103 | static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | ||
| 104 | { | ||
| 105 | struct posix_acl **p = acl_by_type(inode, type); | ||
| 106 | struct posix_acl *acl = ACCESS_ONCE(*p); | ||
| 101 | if (acl) { | 107 | if (acl) { |
| 102 | spin_lock(&inode->i_lock); | 108 | spin_lock(&inode->i_lock); |
| 103 | acl = *p; | 109 | acl = *p; |
| @@ -108,41 +114,20 @@ static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | |||
| 108 | return acl; | 114 | return acl; |
| 109 | } | 115 | } |
| 110 | 116 | ||
| 111 | static inline int negative_cached_acl(struct inode *inode, int type) | 117 | static inline struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) |
| 112 | { | 118 | { |
| 113 | struct posix_acl **p, *acl; | 119 | return rcu_dereference(*acl_by_type(inode, type)); |
| 114 | switch (type) { | ||
| 115 | case ACL_TYPE_ACCESS: | ||
| 116 | p = &inode->i_acl; | ||
| 117 | break; | ||
| 118 | case ACL_TYPE_DEFAULT: | ||
| 119 | p = &inode->i_default_acl; | ||
| 120 | break; | ||
| 121 | default: | ||
| 122 | BUG(); | ||
| 123 | } | ||
| 124 | acl = ACCESS_ONCE(*p); | ||
| 125 | if (acl) | ||
| 126 | return 0; | ||
| 127 | return 1; | ||
| 128 | } | 120 | } |
| 129 | 121 | ||
| 130 | static inline void set_cached_acl(struct inode *inode, | 122 | static inline void set_cached_acl(struct inode *inode, |
| 131 | int type, | 123 | int type, |
| 132 | struct posix_acl *acl) | 124 | struct posix_acl *acl) |
| 133 | { | 125 | { |
| 134 | struct posix_acl *old = NULL; | 126 | struct posix_acl **p = acl_by_type(inode, type); |
| 127 | struct posix_acl *old; | ||
| 135 | spin_lock(&inode->i_lock); | 128 | spin_lock(&inode->i_lock); |
| 136 | switch (type) { | 129 | old = *p; |
| 137 | case ACL_TYPE_ACCESS: | 130 | rcu_assign_pointer(*p, posix_acl_dup(acl)); |
| 138 | old = inode->i_acl; | ||
| 139 | inode->i_acl = posix_acl_dup(acl); | ||
| 140 | break; | ||
| 141 | case ACL_TYPE_DEFAULT: | ||
| 142 | old = inode->i_default_acl; | ||
| 143 | inode->i_default_acl = posix_acl_dup(acl); | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | spin_unlock(&inode->i_lock); | 131 | spin_unlock(&inode->i_lock); |
| 147 | if (old != ACL_NOT_CACHED) | 132 | if (old != ACL_NOT_CACHED) |
| 148 | posix_acl_release(old); | 133 | posix_acl_release(old); |
| @@ -150,18 +135,11 @@ static inline void set_cached_acl(struct inode *inode, | |||
| 150 | 135 | ||
| 151 | static inline void forget_cached_acl(struct inode *inode, int type) | 136 | static inline void forget_cached_acl(struct inode *inode, int type) |
| 152 | { | 137 | { |
| 153 | struct posix_acl *old = NULL; | 138 | struct posix_acl **p = acl_by_type(inode, type); |
| 139 | struct posix_acl *old; | ||
| 154 | spin_lock(&inode->i_lock); | 140 | spin_lock(&inode->i_lock); |
| 155 | switch (type) { | 141 | old = *p; |
| 156 | case ACL_TYPE_ACCESS: | 142 | *p = ACL_NOT_CACHED; |
| 157 | old = inode->i_acl; | ||
| 158 | inode->i_acl = ACL_NOT_CACHED; | ||
| 159 | break; | ||
| 160 | case ACL_TYPE_DEFAULT: | ||
| 161 | old = inode->i_default_acl; | ||
| 162 | inode->i_default_acl = ACL_NOT_CACHED; | ||
| 163 | break; | ||
| 164 | } | ||
| 165 | spin_unlock(&inode->i_lock); | 143 | spin_unlock(&inode->i_lock); |
| 166 | if (old != ACL_NOT_CACHED) | 144 | if (old != ACL_NOT_CACHED) |
| 167 | posix_acl_release(old); | 145 | posix_acl_release(old); |
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index 23241c2fecce..9d4539c52e53 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
| @@ -39,7 +39,15 @@ | |||
| 39 | * when it is shrunk, before we rcu free the node. See shrink code for | 39 | * when it is shrunk, before we rcu free the node. See shrink code for |
| 40 | * details. | 40 | * details. |
| 41 | */ | 41 | */ |
| 42 | #define RADIX_TREE_INDIRECT_PTR 1 | 42 | #define RADIX_TREE_INDIRECT_PTR 1 |
| 43 | /* | ||
| 44 | * A common use of the radix tree is to store pointers to struct pages; | ||
| 45 | * but shmem/tmpfs needs also to store swap entries in the same tree: | ||
| 46 | * those are marked as exceptional entries to distinguish them. | ||
| 47 | * EXCEPTIONAL_ENTRY tests the bit, EXCEPTIONAL_SHIFT shifts content past it. | ||
| 48 | */ | ||
| 49 | #define RADIX_TREE_EXCEPTIONAL_ENTRY 2 | ||
| 50 | #define RADIX_TREE_EXCEPTIONAL_SHIFT 2 | ||
| 43 | 51 | ||
| 44 | #define radix_tree_indirect_to_ptr(ptr) \ | 52 | #define radix_tree_indirect_to_ptr(ptr) \ |
| 45 | radix_tree_indirect_to_ptr((void __force *)(ptr)) | 53 | radix_tree_indirect_to_ptr((void __force *)(ptr)) |
| @@ -174,6 +182,28 @@ static inline int radix_tree_deref_retry(void *arg) | |||
| 174 | } | 182 | } |
| 175 | 183 | ||
| 176 | /** | 184 | /** |
| 185 | * radix_tree_exceptional_entry - radix_tree_deref_slot gave exceptional entry? | ||
| 186 | * @arg: value returned by radix_tree_deref_slot | ||
| 187 | * Returns: 0 if well-aligned pointer, non-0 if exceptional entry. | ||
| 188 | */ | ||
| 189 | static inline int radix_tree_exceptional_entry(void *arg) | ||
| 190 | { | ||
| 191 | /* Not unlikely because radix_tree_exception often tested first */ | ||
| 192 | return (unsigned long)arg & RADIX_TREE_EXCEPTIONAL_ENTRY; | ||
| 193 | } | ||
| 194 | |||
| 195 | /** | ||
| 196 | * radix_tree_exception - radix_tree_deref_slot returned either exception? | ||
| 197 | * @arg: value returned by radix_tree_deref_slot | ||
| 198 | * Returns: 0 if well-aligned pointer, non-0 if either kind of exception. | ||
| 199 | */ | ||
| 200 | static inline int radix_tree_exception(void *arg) | ||
| 201 | { | ||
| 202 | return unlikely((unsigned long)arg & | ||
| 203 | (RADIX_TREE_INDIRECT_PTR | RADIX_TREE_EXCEPTIONAL_ENTRY)); | ||
| 204 | } | ||
| 205 | |||
| 206 | /** | ||
| 177 | * radix_tree_replace_slot - replace item in a slot | 207 | * radix_tree_replace_slot - replace item in a slot |
| 178 | * @pslot: pointer to slot, returned by radix_tree_lookup_slot | 208 | * @pslot: pointer to slot, returned by radix_tree_lookup_slot |
| 179 | * @item: new item to store in the slot. | 209 | * @item: new item to store in the slot. |
| @@ -194,8 +224,8 @@ void *radix_tree_delete(struct radix_tree_root *, unsigned long); | |||
| 194 | unsigned int | 224 | unsigned int |
| 195 | radix_tree_gang_lookup(struct radix_tree_root *root, void **results, | 225 | radix_tree_gang_lookup(struct radix_tree_root *root, void **results, |
| 196 | unsigned long first_index, unsigned int max_items); | 226 | unsigned long first_index, unsigned int max_items); |
| 197 | unsigned int | 227 | unsigned int radix_tree_gang_lookup_slot(struct radix_tree_root *root, |
| 198 | radix_tree_gang_lookup_slot(struct radix_tree_root *root, void ***results, | 228 | void ***results, unsigned long *indices, |
| 199 | unsigned long first_index, unsigned int max_items); | 229 | unsigned long first_index, unsigned int max_items); |
| 200 | unsigned long radix_tree_next_hole(struct radix_tree_root *root, | 230 | unsigned long radix_tree_next_hole(struct radix_tree_root *root, |
| 201 | unsigned long index, unsigned long max_scan); | 231 | unsigned long index, unsigned long max_scan); |
| @@ -222,6 +252,7 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root, | |||
| 222 | unsigned long nr_to_tag, | 252 | unsigned long nr_to_tag, |
| 223 | unsigned int fromtag, unsigned int totag); | 253 | unsigned int fromtag, unsigned int totag); |
| 224 | int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); | 254 | int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); |
| 255 | unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item); | ||
| 225 | 256 | ||
| 226 | static inline void radix_tree_preload_end(void) | 257 | static inline void radix_tree_preload_end(void) |
| 227 | { | 258 | { |
diff --git a/include/linux/random.h b/include/linux/random.h index ce29a040c8dc..d13059f3ea32 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
| @@ -57,18 +57,6 @@ extern void add_interrupt_randomness(int irq); | |||
| 57 | extern void get_random_bytes(void *buf, int nbytes); | 57 | extern void get_random_bytes(void *buf, int nbytes); |
| 58 | void generate_random_uuid(unsigned char uuid_out[16]); | 58 | void generate_random_uuid(unsigned char uuid_out[16]); |
| 59 | 59 | ||
| 60 | extern __u32 secure_ip_id(__be32 daddr); | ||
| 61 | extern __u32 secure_ipv6_id(const __be32 daddr[4]); | ||
| 62 | extern u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); | ||
| 63 | extern u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
| 64 | __be16 dport); | ||
| 65 | extern __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
| 66 | __be16 sport, __be16 dport); | ||
| 67 | extern __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
| 68 | __be16 sport, __be16 dport); | ||
| 69 | extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
| 70 | __be16 sport, __be16 dport); | ||
| 71 | |||
| 72 | #ifndef MODULE | 60 | #ifndef MODULE |
| 73 | extern const struct file_operations random_fops, urandom_fops; | 61 | extern const struct file_operations random_fops, urandom_fops; |
| 74 | #endif | 62 | #endif |
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index aa08fa8fd79b..9291ac3cc627 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
| @@ -8,22 +8,15 @@ | |||
| 8 | 8 | ||
| 9 | /* inode in-kernel data */ | 9 | /* inode in-kernel data */ |
| 10 | 10 | ||
| 11 | #define SHMEM_NR_DIRECT 16 | ||
| 12 | |||
| 13 | #define SHMEM_SYMLINK_INLINE_LEN (SHMEM_NR_DIRECT * sizeof(swp_entry_t)) | ||
| 14 | |||
| 15 | struct shmem_inode_info { | 11 | struct shmem_inode_info { |
| 16 | spinlock_t lock; | 12 | spinlock_t lock; |
| 17 | unsigned long flags; | 13 | unsigned long flags; |
| 18 | unsigned long alloced; /* data pages alloced to file */ | 14 | unsigned long alloced; /* data pages alloced to file */ |
| 19 | unsigned long swapped; /* subtotal assigned to swap */ | ||
| 20 | unsigned long next_index; /* highest alloced index + 1 */ | ||
| 21 | struct shared_policy policy; /* NUMA memory alloc policy */ | ||
| 22 | struct page *i_indirect; /* top indirect blocks page */ | ||
| 23 | union { | 15 | union { |
| 24 | swp_entry_t i_direct[SHMEM_NR_DIRECT]; /* first blocks */ | 16 | unsigned long swapped; /* subtotal assigned to swap */ |
| 25 | char inline_symlink[SHMEM_SYMLINK_INLINE_LEN]; | 17 | char *symlink; /* unswappable short symlink */ |
| 26 | }; | 18 | }; |
| 19 | struct shared_policy policy; /* NUMA memory alloc policy */ | ||
| 27 | struct list_head swaplist; /* chain of maybes on swap */ | 20 | struct list_head swaplist; /* chain of maybes on swap */ |
| 28 | struct list_head xattr_list; /* list of shmem_xattr */ | 21 | struct list_head xattr_list; /* list of shmem_xattr */ |
| 29 | struct inode vfs_inode; | 22 | struct inode vfs_inode; |
| @@ -49,7 +42,7 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode) | |||
| 49 | /* | 42 | /* |
| 50 | * Functions in mm/shmem.c called directly from elsewhere: | 43 | * Functions in mm/shmem.c called directly from elsewhere: |
| 51 | */ | 44 | */ |
| 52 | extern int init_tmpfs(void); | 45 | extern int shmem_init(void); |
| 53 | extern int shmem_fill_super(struct super_block *sb, void *data, int silent); | 46 | extern int shmem_fill_super(struct super_block *sb, void *data, int silent); |
| 54 | extern struct file *shmem_file_setup(const char *name, | 47 | extern struct file *shmem_file_setup(const char *name, |
| 55 | loff_t size, unsigned long flags); | 48 | loff_t size, unsigned long flags); |
| @@ -59,8 +52,6 @@ extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, | |||
| 59 | pgoff_t index, gfp_t gfp_mask); | 52 | pgoff_t index, gfp_t gfp_mask); |
| 60 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); | 53 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); |
| 61 | extern int shmem_unuse(swp_entry_t entry, struct page *page); | 54 | extern int shmem_unuse(swp_entry_t entry, struct page *page); |
| 62 | extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, | ||
| 63 | struct page **pagep, swp_entry_t *ent); | ||
| 64 | 55 | ||
| 65 | static inline struct page *shmem_read_mapping_page( | 56 | static inline struct page *shmem_read_mapping_page( |
| 66 | struct address_space *mapping, pgoff_t index) | 57 | struct address_space *mapping, pgoff_t index) |
diff --git a/include/linux/swapops.h b/include/linux/swapops.h index cd42e30b7c6e..2189d3ffc85d 100644 --- a/include/linux/swapops.h +++ b/include/linux/swapops.h | |||
| @@ -1,3 +1,8 @@ | |||
| 1 | #ifndef _LINUX_SWAPOPS_H | ||
| 2 | #define _LINUX_SWAPOPS_H | ||
| 3 | |||
| 4 | #include <linux/radix-tree.h> | ||
| 5 | |||
| 1 | /* | 6 | /* |
| 2 | * swapcache pages are stored in the swapper_space radix tree. We want to | 7 | * swapcache pages are stored in the swapper_space radix tree. We want to |
| 3 | * get good packing density in that tree, so the index should be dense in | 8 | * get good packing density in that tree, so the index should be dense in |
| @@ -76,6 +81,22 @@ static inline pte_t swp_entry_to_pte(swp_entry_t entry) | |||
| 76 | return __swp_entry_to_pte(arch_entry); | 81 | return __swp_entry_to_pte(arch_entry); |
| 77 | } | 82 | } |
| 78 | 83 | ||
| 84 | static inline swp_entry_t radix_to_swp_entry(void *arg) | ||
| 85 | { | ||
| 86 | swp_entry_t entry; | ||
| 87 | |||
| 88 | entry.val = (unsigned long)arg >> RADIX_TREE_EXCEPTIONAL_SHIFT; | ||
| 89 | return entry; | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline void *swp_to_radix_entry(swp_entry_t entry) | ||
| 93 | { | ||
| 94 | unsigned long value; | ||
| 95 | |||
| 96 | value = entry.val << RADIX_TREE_EXCEPTIONAL_SHIFT; | ||
| 97 | return (void *)(value | RADIX_TREE_EXCEPTIONAL_ENTRY); | ||
| 98 | } | ||
| 99 | |||
| 79 | #ifdef CONFIG_MIGRATION | 100 | #ifdef CONFIG_MIGRATION |
| 80 | static inline swp_entry_t make_migration_entry(struct page *page, int write) | 101 | static inline swp_entry_t make_migration_entry(struct page *page, int write) |
| 81 | { | 102 | { |
| @@ -169,3 +190,5 @@ static inline int non_swap_entry(swp_entry_t entry) | |||
| 169 | return 0; | 190 | return 0; |
| 170 | } | 191 | } |
| 171 | #endif | 192 | #endif |
| 193 | |||
| 194 | #endif /* _LINUX_SWAPOPS_H */ | ||
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index d3ec89fb4122..47b4a27e6e97 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
| @@ -85,22 +85,6 @@ struct thermal_cooling_device { | |||
| 85 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) | 85 | ((long)t-2732+5)/10 : ((long)t-2732-5)/10) |
| 86 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) | 86 | #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) |
| 87 | 87 | ||
| 88 | #if defined(CONFIG_THERMAL_HWMON) | ||
| 89 | /* thermal zone devices with the same type share one hwmon device */ | ||
| 90 | struct thermal_hwmon_device { | ||
| 91 | char type[THERMAL_NAME_LENGTH]; | ||
| 92 | struct device *device; | ||
| 93 | int count; | ||
| 94 | struct list_head tz_list; | ||
| 95 | struct list_head node; | ||
| 96 | }; | ||
| 97 | |||
| 98 | struct thermal_hwmon_attr { | ||
| 99 | struct device_attribute attr; | ||
| 100 | char name[16]; | ||
| 101 | }; | ||
| 102 | #endif | ||
| 103 | |||
| 104 | struct thermal_zone_device { | 88 | struct thermal_zone_device { |
| 105 | int id; | 89 | int id; |
| 106 | char type[THERMAL_NAME_LENGTH]; | 90 | char type[THERMAL_NAME_LENGTH]; |
| @@ -120,12 +104,6 @@ struct thermal_zone_device { | |||
| 120 | struct mutex lock; /* protect cooling devices list */ | 104 | struct mutex lock; /* protect cooling devices list */ |
| 121 | struct list_head node; | 105 | struct list_head node; |
| 122 | struct delayed_work poll_queue; | 106 | struct delayed_work poll_queue; |
| 123 | #if defined(CONFIG_THERMAL_HWMON) | ||
| 124 | struct list_head hwmon_node; | ||
| 125 | struct thermal_hwmon_device *hwmon; | ||
| 126 | struct thermal_hwmon_attr temp_input; /* hwmon sys attr */ | ||
| 127 | struct thermal_hwmon_attr temp_crit; /* hwmon sys attr */ | ||
| 128 | #endif | ||
| 129 | }; | 107 | }; |
| 130 | /* Adding event notification support elements */ | 108 | /* Adding event notification support elements */ |
| 131 | #define THERMAL_GENL_FAMILY_NAME "thermal_event" | 109 | #define THERMAL_GENL_FAMILY_NAME "thermal_event" |
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h index 3b938743514b..9808877c2ab9 100644 --- a/include/net/cipso_ipv4.h +++ b/include/net/cipso_ipv4.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * have chosen to adopt the protocol and over the years it has become a | 8 | * have chosen to adopt the protocol and over the years it has become a |
| 9 | * de-facto standard for labeled networking. | 9 | * de-facto standard for labeled networking. |
| 10 | * | 10 | * |
| 11 | * Author: Paul Moore <paul.moore@hp.com> | 11 | * Author: Paul Moore <paul@paul-moore.com> |
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
diff --git a/include/net/dst.h b/include/net/dst.h index 29e255796ce1..13d507d69ddb 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -37,7 +37,7 @@ struct dst_entry { | |||
| 37 | unsigned long _metrics; | 37 | unsigned long _metrics; |
| 38 | unsigned long expires; | 38 | unsigned long expires; |
| 39 | struct dst_entry *path; | 39 | struct dst_entry *path; |
| 40 | struct neighbour *_neighbour; | 40 | struct neighbour __rcu *_neighbour; |
| 41 | #ifdef CONFIG_XFRM | 41 | #ifdef CONFIG_XFRM |
| 42 | struct xfrm_state *xfrm; | 42 | struct xfrm_state *xfrm; |
| 43 | #else | 43 | #else |
| @@ -88,12 +88,17 @@ struct dst_entry { | |||
| 88 | 88 | ||
| 89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) | 89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) |
| 90 | { | 90 | { |
| 91 | return dst->_neighbour; | 91 | return rcu_dereference(dst->_neighbour); |
| 92 | } | ||
| 93 | |||
| 94 | static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst) | ||
| 95 | { | ||
| 96 | return rcu_dereference_raw(dst->_neighbour); | ||
| 92 | } | 97 | } |
| 93 | 98 | ||
| 94 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) | 99 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) |
| 95 | { | 100 | { |
| 96 | dst->_neighbour = neigh; | 101 | rcu_assign_pointer(dst->_neighbour, neigh); |
| 97 | } | 102 | } |
| 98 | 103 | ||
| 99 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | 104 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); |
| @@ -382,8 +387,12 @@ static inline void dst_rcu_free(struct rcu_head *head) | |||
| 382 | static inline void dst_confirm(struct dst_entry *dst) | 387 | static inline void dst_confirm(struct dst_entry *dst) |
| 383 | { | 388 | { |
| 384 | if (dst) { | 389 | if (dst) { |
| 385 | struct neighbour *n = dst_get_neighbour(dst); | 390 | struct neighbour *n; |
| 391 | |||
| 392 | rcu_read_lock(); | ||
| 393 | n = dst_get_neighbour(dst); | ||
| 386 | neigh_confirm(n); | 394 | neigh_confirm(n); |
| 395 | rcu_read_unlock(); | ||
| 387 | } | 396 | } |
| 388 | } | 397 | } |
| 389 | 398 | ||
diff --git a/include/net/netlabel.h b/include/net/netlabel.h index f21a16ee3705..f67440970d7e 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * The NetLabel system manages static and dynamic label mappings for network | 4 | * The NetLabel system manages static and dynamic label mappings for network |
| 5 | * protocols such as CIPSO and RIPSO. | 5 | * protocols such as CIPSO and RIPSO. |
| 6 | * | 6 | * |
| 7 | * Author: Paul Moore <paul.moore@hp.com> | 7 | * Author: Paul Moore <paul@paul-moore.com> |
| 8 | * | 8 | * |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h new file mode 100644 index 000000000000..d97f6892c019 --- /dev/null +++ b/include/net/secure_seq.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | #ifndef _NET_SECURE_SEQ | ||
| 2 | #define _NET_SECURE_SEQ | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | extern __u32 secure_ip_id(__be32 daddr); | ||
| 7 | extern __u32 secure_ipv6_id(const __be32 daddr[4]); | ||
| 8 | extern u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); | ||
| 9 | extern u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
| 10 | __be16 dport); | ||
| 11 | extern __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
| 12 | __be16 sport, __be16 dport); | ||
| 13 | extern __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
| 14 | __be16 sport, __be16 dport); | ||
| 15 | extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
| 16 | __be16 sport, __be16 dport); | ||
| 17 | extern u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
| 18 | __be16 sport, __be16 dport); | ||
| 19 | |||
| 20 | #endif /* _NET_SECURE_SEQ */ | ||
diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h new file mode 100644 index 000000000000..c5c5e008e6de --- /dev/null +++ b/include/scsi/osd_ore.h | |||
| @@ -0,0 +1,125 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 | ||
| 3 | * Boaz Harrosh <bharrosh@panasas.com> | ||
| 4 | * | ||
| 5 | * Public Declarations of the ORE API | ||
| 6 | * | ||
| 7 | * This file is part of the ORE (Object Raid Engine) library. | ||
| 8 | * | ||
| 9 | * ORE is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License version 2 as published | ||
| 11 | * by the Free Software Foundation. (GPL v2) | ||
| 12 | * | ||
| 13 | * ORE is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with the ORE; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | ||
| 22 | #ifndef __ORE_H__ | ||
| 23 | #define __ORE_H__ | ||
| 24 | |||
| 25 | #include <scsi/osd_initiator.h> | ||
| 26 | #include <scsi/osd_attributes.h> | ||
| 27 | #include <scsi/osd_sec.h> | ||
| 28 | #include <linux/pnfs_osd_xdr.h> | ||
| 29 | |||
| 30 | struct ore_comp { | ||
| 31 | struct osd_obj_id obj; | ||
| 32 | u8 cred[OSD_CAP_LEN]; | ||
| 33 | }; | ||
| 34 | |||
| 35 | struct ore_layout { | ||
| 36 | /* Our way of looking at the data_map */ | ||
| 37 | unsigned stripe_unit; | ||
| 38 | unsigned mirrors_p1; | ||
| 39 | |||
| 40 | unsigned group_width; | ||
| 41 | u64 group_depth; | ||
| 42 | unsigned group_count; | ||
| 43 | }; | ||
| 44 | |||
| 45 | struct ore_components { | ||
| 46 | unsigned numdevs; /* Num of devices in array */ | ||
| 47 | /* If @single_comp == EC_SINGLE_COMP, @comps points to a single | ||
| 48 | * component. else there are @numdevs components | ||
| 49 | */ | ||
| 50 | enum EC_COMP_USAGE { | ||
| 51 | EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff | ||
| 52 | } single_comp; | ||
| 53 | struct ore_comp *comps; | ||
| 54 | struct osd_dev **ods; /* osd_dev array */ | ||
| 55 | }; | ||
| 56 | |||
| 57 | struct ore_io_state; | ||
| 58 | typedef void (*ore_io_done_fn)(struct ore_io_state *ios, void *private); | ||
| 59 | |||
| 60 | struct ore_io_state { | ||
| 61 | struct kref kref; | ||
| 62 | |||
| 63 | void *private; | ||
| 64 | ore_io_done_fn done; | ||
| 65 | |||
| 66 | struct ore_layout *layout; | ||
| 67 | struct ore_components *comps; | ||
| 68 | |||
| 69 | /* Global read/write IO*/ | ||
| 70 | loff_t offset; | ||
| 71 | unsigned long length; | ||
| 72 | void *kern_buff; | ||
| 73 | |||
| 74 | struct page **pages; | ||
| 75 | unsigned nr_pages; | ||
| 76 | unsigned pgbase; | ||
| 77 | unsigned pages_consumed; | ||
| 78 | |||
| 79 | /* Attributes */ | ||
| 80 | unsigned in_attr_len; | ||
| 81 | struct osd_attr *in_attr; | ||
| 82 | unsigned out_attr_len; | ||
| 83 | struct osd_attr *out_attr; | ||
| 84 | |||
| 85 | bool reading; | ||
| 86 | |||
| 87 | /* Variable array of size numdevs */ | ||
| 88 | unsigned numdevs; | ||
| 89 | struct ore_per_dev_state { | ||
| 90 | struct osd_request *or; | ||
| 91 | struct bio *bio; | ||
| 92 | loff_t offset; | ||
| 93 | unsigned length; | ||
| 94 | unsigned dev; | ||
| 95 | } per_dev[]; | ||
| 96 | }; | ||
| 97 | |||
| 98 | static inline unsigned ore_io_state_size(unsigned numdevs) | ||
| 99 | { | ||
| 100 | return sizeof(struct ore_io_state) + | ||
| 101 | sizeof(struct ore_per_dev_state) * numdevs; | ||
| 102 | } | ||
| 103 | |||
| 104 | /* ore.c */ | ||
| 105 | int ore_get_rw_state(struct ore_layout *layout, struct ore_components *comps, | ||
| 106 | bool is_reading, u64 offset, u64 length, | ||
| 107 | struct ore_io_state **ios); | ||
| 108 | int ore_get_io_state(struct ore_layout *layout, struct ore_components *comps, | ||
| 109 | struct ore_io_state **ios); | ||
| 110 | void ore_put_io_state(struct ore_io_state *ios); | ||
| 111 | |||
| 112 | int ore_check_io(struct ore_io_state *ios, u64 *resid); | ||
| 113 | |||
| 114 | int ore_create(struct ore_io_state *ios); | ||
| 115 | int ore_remove(struct ore_io_state *ios); | ||
| 116 | int ore_write(struct ore_io_state *ios); | ||
| 117 | int ore_read(struct ore_io_state *ios); | ||
| 118 | int ore_truncate(struct ore_layout *layout, struct ore_components *comps, | ||
| 119 | u64 size); | ||
| 120 | |||
| 121 | int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr); | ||
| 122 | |||
| 123 | extern const struct osd_attr g_attr_logical_length; | ||
| 124 | |||
| 125 | #endif | ||
