aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-16 16:38:47 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-16 16:38:47 +0100
commit137d9a2caad76b7ebfa137a3629e6ee2d77a006f (patch)
tree114b5b229745ba816face035b3bbd91ca692b418
parent6680ebc7a39c4a9661004adb6c8f4abc98fa6322 (diff)
downloadpatches-137d9a2caad76b7ebfa137a3629e6ee2d77a006f.tar.gz
updates
-rw-r--r--0001-kmod-make-usermodehelper-path-a-const-string.patch15
-rw-r--r--0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch27
-rw-r--r--0003-Make-static-usermode-helper-binaries-constant.patch65
-rw-r--r--0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch301
-rw-r--r--0005-add-CONFIG_READONLY_USERMODEHELPER-support-for-lots-.patch368
-rw-r--r--c04.patch12
-rw-r--r--c06.patch6
-rw-r--r--csdio2.patch2
-rw-r--r--d01.patch10
-rw-r--r--d02.patch38
-rw-r--r--d05.patch4
-rw-r--r--d10.patch16
-rw-r--r--d99.patch37
-rw-r--r--introduce-static_usermodehelper-to-mediate-call_usermodehelper.patch74
-rw-r--r--p21.patch8
-rw-r--r--p28.patch20
-rw-r--r--p29.patch6
-rw-r--r--series4
18 files changed, 639 insertions, 374 deletions
diff --git a/0001-kmod-make-usermodehelper-path-a-const-string.patch b/0001-kmod-make-usermodehelper-path-a-const-string.patch
index d7a9f87974dcf0..a9ce3a81000c75 100644
--- a/0001-kmod-make-usermodehelper-path-a-const-string.patch
+++ b/0001-kmod-make-usermodehelper-path-a-const-string.patch
@@ -1,7 +1,7 @@
-From 359179eb6145c5982a958367197ca4b785b6b15f Mon Sep 17 00:00:00 2001
+From 6f5842372bb2438cdf3b37fa2727688033121b9e Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: Sun, 11 Dec 2016 09:44:42 +0100
-Subject: [PATCH 1/4] kmod: make usermodehelper path a const string
+Subject: [PATCH 1/5] kmod: make usermodehelper path a const string
This is in preparation for making it so that usermode helper programs
can't be changed, if desired, by userspace. We will tackle the mess of
@@ -10,10 +10,12 @@ take more work, for much less gain...
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- include/linux/kmod.h | 7 ++++---
- kernel/kmod.c | 4 ++--
+ include/linux/kmod.h | 7 ++++---
+ kernel/kmod.c | 4 ++--
2 files changed, 6 insertions(+), 5 deletions(-)
+diff --git a/include/linux/kmod.h b/include/linux/kmod.h
+index fcfd2bf14d3f..c4e441e00db5 100644
--- a/include/linux/kmod.h
+++ b/include/linux/kmod.h
@@ -56,7 +56,7 @@ struct file;
@@ -39,6 +41,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
int (*init)(struct subprocess_info *info, struct cred *new),
void (*cleanup)(struct subprocess_info *), void *data);
+diff --git a/kernel/kmod.c b/kernel/kmod.c
+index d45c96073afb..426a614e97fe 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -516,7 +516,7 @@ static void helper_unlock(void)
@@ -59,3 +63,6 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
struct subprocess_info *info;
gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;
+--
+2.11.0
+
diff --git a/0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch b/0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch
index bf5e0a9db50a1d..03f83778462bec 100644
--- a/0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch
+++ b/0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch
@@ -1,7 +1,7 @@
-From 391148315fe8357ae67131c4fef5bb539852cfea Mon Sep 17 00:00:00 2001
+From cf5271829b780b598c3338934450de14f791b6cc Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: Sun, 11 Dec 2016 10:39:09 +0100
-Subject: [PATCH 2/4] drbd: rename "usermode_helper" to "drbd_usermode_helper"
+Subject: [PATCH 2/5] drbd: rename "usermode_helper" to "drbd_usermode_helper"
Nothing like having a very generic global variable in a tiny driver
subsystem to make a mess of the global namespace...
@@ -15,11 +15,13 @@ error.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- drivers/block/drbd/drbd_int.h | 2 +-
- drivers/block/drbd/drbd_main.c | 4 ++--
- drivers/block/drbd/drbd_nl.c | 20 ++++++++++----------
+ drivers/block/drbd/drbd_int.h | 2 +-
+ drivers/block/drbd/drbd_main.c | 4 ++--
+ drivers/block/drbd/drbd_nl.c | 20 ++++++++++----------
3 files changed, 13 insertions(+), 13 deletions(-)
+diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
+index 4cb8f21ff4ef..a139a34f1f1e 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -75,7 +75,7 @@ extern int fault_rate;
@@ -31,9 +33,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
/* This is used to stop/restart our threads.
+diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
+index 83482721bc01..8f51eccc8de7 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
-@@ -108,9 +108,9 @@ int proc_details; /* Detail level
+@@ -108,9 +108,9 @@ int proc_details; /* Detail level in proc drbd*/
/* Module parameter for setting the user mode helper program
* to run. Default is /sbin/drbdadm */
@@ -45,9 +49,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
/* in 2.6.x, our device mapping and config info contains our virtual gendisks
* as member "struct gendisk *vdisk;"
+diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
+index f35db29cac76..9edc6fb95f19 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
-@@ -344,7 +344,7 @@ int drbd_khelper(struct drbd_device *dev
+@@ -344,7 +344,7 @@ int drbd_khelper(struct drbd_device *device, char *cmd)
(char[60]) { }, /* address */
NULL };
char mb[14];
@@ -56,7 +62,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
struct drbd_connection *connection = first_peer_device(device)->connection;
struct sib_info sib;
int ret;
-@@ -359,19 +359,19 @@ int drbd_khelper(struct drbd_device *dev
+@@ -359,19 +359,19 @@ int drbd_khelper(struct drbd_device *device, char *cmd)
* write out any unsynced meta data changes now */
drbd_md_sync(device);
@@ -80,7 +86,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(ret >> 8) & 0xff, ret);
sib.sib_reason = SIB_HELPER_POST;
sib.helper_exit_code = ret;
-@@ -396,24 +396,24 @@ enum drbd_peer_state conn_khelper(struct
+@@ -396,24 +396,24 @@ enum drbd_peer_state conn_khelper(struct drbd_connection *connection, char *cmd)
(char[60]) { }, /* address */
NULL };
char *resource_name = connection->resource->name;
@@ -110,3 +116,6 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(ret >> 8) & 0xff, ret);
/* TODO: conn_bcast_event() ?? */
notify_helper(NOTIFY_RESPONSE, NULL, connection, cmd, ret);
+--
+2.11.0
+
diff --git a/0003-Make-static-usermode-helper-binaries-constant.patch b/0003-Make-static-usermode-helper-binaries-constant.patch
index 53ad93571e77e5..4526977333ba58 100644
--- a/0003-Make-static-usermode-helper-binaries-constant.patch
+++ b/0003-Make-static-usermode-helper-binaries-constant.patch
@@ -1,34 +1,44 @@
-From b8cc8ef7094cbaf916b87573efa3c31727bd6b2d Mon Sep 17 00:00:00 2001
+From a340240001065a3b7072ac689d8449a7b4f70654 Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: Sun, 11 Dec 2016 18:00:43 +0100
-Subject: [PATCH 3/4] Make static usermode helper binaries constant
+Subject: Make static usermode helper binaries constant
There are a number of usermode helper binaries that are "hard coded" in
the kernel today, so mark them as "const" to make it harder for someone
to change where the variables point to.
+Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Cc: Thomas Sailer <t.sailer@alumni.ethz.ch>
+Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Cc: Johan Hovold <johan@kernel.org>
+Cc: Alex Elder <elder@kernel.org>
+Cc: "J. Bruce Fields" <bfields@fieldses.org>
+Cc: Jeff Layton <jlayton@poochiereds.net>
+Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- drivers/macintosh/windfarm_core.c | 2 +-
- drivers/net/hamradio/baycom_epp.c | 2 +-
+ drivers/macintosh/windfarm_core.c | 4 ++--
+ drivers/net/hamradio/baycom_epp.c | 10 +++++++---
drivers/pnp/pnpbios/core.c | 5 +++--
drivers/staging/greybus/svc_watchdog.c | 4 ++--
- drivers/staging/rtl8192e/rtl8192e/rtl_dm.c | 6 +++---
+ drivers/staging/rtl8192e/rtl8192e/rtl_dm.c | 8 ++++----
fs/nfsd/nfs4layouts.c | 6 ++++--
security/keys/request_key.c | 7 ++++---
- 7 files changed, 18 insertions(+), 14 deletions(-)
+ 7 files changed, 26 insertions(+), 18 deletions(-)
--- a/drivers/macintosh/windfarm_core.c
+++ b/drivers/macintosh/windfarm_core.c
-@@ -74,7 +74,7 @@ static inline void wf_notify(int event,
+@@ -74,8 +74,8 @@ static inline void wf_notify(int event,
static int wf_critical_overtemp(void)
{
- static char * critical_overtemp_path = "/sbin/critical_overtemp";
-+ static const char * critical_overtemp_path = "/sbin/critical_overtemp";
- char *argv[] = { critical_overtemp_path, NULL };
+- char *argv[] = { critical_overtemp_path, NULL };
++ static char const critical_overtemp_path[] = "/sbin/critical_overtemp";
++ char *argv[] = { (char *)critical_overtemp_path, NULL };
static char *envp[] = { "HOME=/",
"TERM=linux",
+ "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
--- a/drivers/net/hamradio/baycom_epp.c
+++ b/drivers/net/hamradio/baycom_epp.c
@@ -299,7 +299,7 @@ static inline void baycom_int_freq(struc
@@ -36,17 +46,32 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
*/
-static char eppconfig_path[256] = "/usr/sbin/eppfpga";
-+static const char eppconfig_path[256] = "/usr/sbin/eppfpga";
++static char const eppconfig_path[] = "/usr/sbin/eppfpga";
static char *envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL };
+@@ -308,8 +308,12 @@ static int eppconfig(struct baycom_state
+ {
+ char modearg[256];
+ char portarg[16];
+- char *argv[] = { eppconfig_path, "-s", "-p", portarg, "-m", modearg,
+- NULL };
++ char *argv[] = {
++ (char *)eppconfig_path,
++ "-s",
++ "-p", portarg,
++ "-m", modearg,
++ NULL };
+
+ /* set up arguments */
+ sprintf(modearg, "%sclk,%smodem,fclk=%d,bps=%d,divider=%d%s,extstat",
--- a/drivers/pnp/pnpbios/core.c
+++ b/drivers/pnp/pnpbios/core.c
@@ -98,6 +98,7 @@ static struct completion unload_sem;
*/
static int pnp_dock_event(int dock, struct pnp_docking_station_info *info)
{
-+ static const char *sbin_pnpbios = "/sbin/pnpbios";
++ static char const sbin_pnpbios[] = "/sbin/pnpbios";
char *argv[3], **envp, *buf, *scratch;
int i = 0, value;
@@ -55,7 +80,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* like sysfs and uevents
*/
- argv[0] = "/sbin/pnpbios";
-+ argv[0] = sbin_pnpbios;
++ argv[0] = (char *)sbin_pnpbios;
argv[1] = "dock";
argv[2] = NULL;
@@ -75,7 +100,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
static void greybus_reset(struct work_struct *work)
{
- static char start_path[256] = "/system/bin/start";
-+ static const char start_path[256] = "/system/bin/start";
++ static char const start_path[] = "/system/bin/start";
static char *envp[] = {
"HOME=/",
"PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin",
@@ -89,21 +114,23 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
};
--- a/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c
+++ b/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c
-@@ -268,7 +268,7 @@ void rtl92e_dm_watchdog(struct net_devic
+@@ -268,8 +268,8 @@ void rtl92e_dm_watchdog(struct net_devic
static void _rtl92e_dm_check_ac_dc_power(struct net_device *dev)
{
struct r8192_priv *priv = rtllib_priv(dev);
- static char *ac_dc_script = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
-+ static const char *ac_dc_script = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
- char *argv[] = {ac_dc_script, DRV_NAME, NULL};
+- char *argv[] = {ac_dc_script, DRV_NAME, NULL};
++ static char const ac_dc_script[] = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
++ char *argv[] = {(char *)ac_dc_script, DRV_NAME, NULL};
static char *envp[] = {"HOME=/",
"TERM=linux",
+ "PATH=/usr/bin:/bin",
@@ -1823,7 +1823,7 @@ static void _rtl92e_dm_check_rf_ctrl_gpi
enum rt_rf_power_state eRfPowerStateToSet;
bool bActuallySet = false;
char *argv[3];
- static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
-+ static const char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
++ static char const RadioPowerPath[] = "/etc/acpi/events/RadioPower.sh";
static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin",
NULL};
@@ -122,7 +149,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
struct nfs4_client *clp = ls->ls_stid.sc_client;
char addr_str[INET6_ADDRSTRLEN];
-+ static const char *nfsd_recall_failed = "/sbin/nfsd-recall-failed";
++ static char const nfsd_recall_failed[] = "/sbin/nfsd-recall-failed";
static char *envp[] = {
"HOME=/",
"TERM=linux",
@@ -157,7 +184,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
const char *op,
void *aux)
{
-+ static const char *request_key = "/sbin/request-key";
++ static char const request_key[] = "/sbin/request-key";
const struct cred *cred = current_cred();
key_serial_t prkey, sskey;
struct key *key = cons->key, *authkey = cons->authkey, *keyring,
diff --git a/0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch b/0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch
index 54cf7641bf6804..9f89a6b2751cc3 100644
--- a/0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch
+++ b/0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch
@@ -1,7 +1,7 @@
-From 7c7aad8525b5ba93a45853992e199045392fa755 Mon Sep 17 00:00:00 2001
+From 2f54800f230f77a5cbc784ff503497c201b0a5cd Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Sun, 11 Dec 2016 18:06:14 +0100
-Subject: [PATCH 4/4] Introduce CONFIG_READONLY_USERMODEHELPER
+Date: Thu, 15 Dec 2016 13:07:19 -0800
+Subject: [PATCH 4/5] Introduce CONFIG_READONLY_USERMODEHELPER
If you can write to kernel memory, an "easy" way to get the kernel to
run any application is to change the pointer of one of the usermode
@@ -18,287 +18,29 @@ coredumps, it's still a work in progress.
Not-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- arch/x86/kernel/cpu/mcheck/mce.c | 12 ++++++++----
- drivers/block/drbd/drbd_int.h | 6 +++++-
- drivers/block/drbd/drbd_main.c | 5 +++++
- drivers/video/fbdev/uvesafb.c | 19 ++++++++++++++-----
- fs/nfs/cache_lib.c | 12 ++++++++++--
- include/linux/reboot.h | 2 ++
- kernel/ksysfs.c | 6 +++++-
- kernel/reboot.c | 3 +++
- kernel/sysctl.c | 4 ++++
- lib/kobject_uevent.c | 3 +++
- security/Kconfig | 17 +++++++++++++++++
- 11 files changed, 76 insertions(+), 13 deletions(-)
+ include/linux/kmod.h | 6 ++++++
+ security/Kconfig | 17 +++++++++++++++++
+ 2 files changed, 23 insertions(+)
---- a/arch/x86/kernel/cpu/mcheck/mce.c
-+++ b/arch/x86/kernel/cpu/mcheck/mce.c
-@@ -2337,15 +2337,16 @@ static ssize_t set_bank(struct device *s
- }
-
- static ssize_t
--show_trigger(struct device *s, struct device_attribute *attr, char *buf)
-+trigger_show(struct device *s, struct device_attribute *attr, char *buf)
- {
- strcpy(buf, mce_helper);
- strcat(buf, "\n");
- return strlen(mce_helper) + 1;
- }
-
--static ssize_t set_trigger(struct device *s, struct device_attribute *attr,
-- const char *buf, size_t siz)
-+#ifndef CONFIG_READONLY_USERMODEHELPER
-+static ssize_t trigger_store(struct device *s, struct device_attribute *attr,
-+ const char *buf, size_t siz)
- {
- char *p;
-
-@@ -2358,6 +2359,10 @@ static ssize_t set_trigger(struct device
-
- return strlen(mce_helper) + !!p;
- }
-+static DEVICE_ATTR_RW(trigger);
-+#else
-+static DEVICE_ATTR_RO(trigger);
-+#endif
-
- static ssize_t set_ignore_ce(struct device *s,
- struct device_attribute *attr,
-@@ -2415,7 +2420,6 @@ static ssize_t store_int_with_restart(st
- return ret;
- }
-
--static DEVICE_ATTR(trigger, 0644, show_trigger, set_trigger);
- static DEVICE_INT_ATTR(tolerant, 0644, mca_cfg.tolerant);
- static DEVICE_INT_ATTR(monarch_timeout, 0644, mca_cfg.monarch_timeout);
- static DEVICE_BOOL_ATTR(dont_log_ce, 0644, mca_cfg.dont_log_ce);
---- a/drivers/block/drbd/drbd_int.h
-+++ b/drivers/block/drbd/drbd_int.h
-@@ -75,7 +75,11 @@ extern int fault_rate;
- extern int fault_devs;
- #endif
-
--extern char drbd_usermode_helper[];
-+extern
-+#ifdef CONFIG_READONLY_USERMODEHELPER
-+ const
-+#endif
-+ char drbd_usermode_helper[];
-
-
- /* This is used to stop/restart our threads.
---- a/drivers/block/drbd/drbd_main.c
-+++ b/drivers/block/drbd/drbd_main.c
-@@ -108,9 +108,14 @@ int proc_details; /* Detail level
-
- /* Module parameter for setting the user mode helper program
- * to run. Default is /sbin/drbdadm */
-+#ifdef CONFIG_READONLY_USERMODEHELPER
-+const
-+#endif
- char drbd_usermode_helper[80] = "/sbin/drbdadm";
-
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- module_param_string(usermode_helper, drbd_usermode_helper, sizeof(drbd_usermode_helper), 0644);
-+#endif
-
- /* in 2.6.x, our device mapping and config info contains our virtual gendisks
- * as member "struct gendisk *vdisk;"
---- a/drivers/video/fbdev/uvesafb.c
-+++ b/drivers/video/fbdev/uvesafb.c
-@@ -30,7 +30,11 @@ static struct cb_id uvesafb_cn_id = {
- .idx = CN_IDX_V86D,
- .val = CN_VAL_V86D_UVESAFB
- };
-+#ifdef CONFIG_READONLY_USERMODEHELPER
-+static const char v86d_path[PATH_MAX] = "/sbin/v86d";
-+#else
- static char v86d_path[PATH_MAX] = "/sbin/v86d";
-+#endif
- static char v86d_started; /* has v86d been started by uvesafb? */
-
- static const struct fb_fix_screeninfo uvesafb_fix = {
-@@ -114,7 +118,7 @@ static int uvesafb_helper_start(void)
- };
-
- char *argv[] = {
-- v86d_path,
-+ (char *)v86d_path,
- NULL,
- };
-
-@@ -1883,19 +1887,22 @@ static int uvesafb_setup(char *options)
- }
- #endif /* !MODULE */
-
--static ssize_t show_v86d(struct device_driver *dev, char *buf)
-+static ssize_t v86d_show(struct device_driver *dev, char *buf)
- {
- return snprintf(buf, PAGE_SIZE, "%s\n", v86d_path);
- }
-
--static ssize_t store_v86d(struct device_driver *dev, const char *buf,
-+#ifndef CONFIG_READONLY_USERMODEHELPER
-+static ssize_t v86d_store(struct device_driver *dev, const char *buf,
- size_t count)
- {
- strncpy(v86d_path, buf, PATH_MAX);
- return count;
- }
--
--static DRIVER_ATTR(v86d, S_IRUGO | S_IWUSR, show_v86d, store_v86d);
-+static DRIVER_ATTR_RW(v86d);
-+#else
-+static DRIVER_ATTR_RO(v86d);
-+#endif
-
- static int uvesafb_init(void)
- {
-@@ -2017,8 +2024,10 @@ MODULE_PARM_DESC(mode_option,
- module_param(vbemode, ushort, 0);
- MODULE_PARM_DESC(vbemode,
- "VBE mode number to set, overrides the 'mode' option");
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- module_param_string(v86d, v86d_path, PATH_MAX, 0660);
- MODULE_PARM_DESC(v86d, "Path to the v86d userspace helper.");
-+#endif
-
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Michal Januszewski <spock@gentoo.org>");
---- a/fs/nfs/cache_lib.c
-+++ b/fs/nfs/cache_lib.c
-@@ -20,13 +20,20 @@
- #define NFS_CACHE_UPCALL_PATHLEN 256
- #define NFS_CACHE_UPCALL_TIMEOUT 15
+diff --git a/include/linux/kmod.h b/include/linux/kmod.h
+index c4e441e00db5..5b72a0f90874 100644
+--- a/include/linux/kmod.h
++++ b/include/linux/kmod.h
+@@ -53,6 +53,12 @@ struct file;
+ #define UMH_WAIT_PROC 2 /* wait for the process to complete */
+ #define UMH_KILLABLE 4 /* wait for EXEC/PROC killable */
+#ifdef CONFIG_READONLY_USERMODEHELPER
-+static const char nfs_cache_getent_prog[NFS_CACHE_UPCALL_PATHLEN] =
++# define __ro_umh const
+#else
- static char nfs_cache_getent_prog[NFS_CACHE_UPCALL_PATHLEN] =
-+#endif
- "/sbin/nfs_cache_getent";
- static unsigned long nfs_cache_getent_timeout = NFS_CACHE_UPCALL_TIMEOUT;
-
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- module_param_string(cache_getent, nfs_cache_getent_prog,
- sizeof(nfs_cache_getent_prog), 0600);
- MODULE_PARM_DESC(cache_getent, "Path to the client cache upcall program");
++# define __ro_umh /**/
+#endif
+
- module_param_named(cache_getent_timeout, nfs_cache_getent_timeout, ulong, 0600);
- MODULE_PARM_DESC(cache_getent_timeout, "Timeout (in seconds) after which "
- "the cache upcall is assumed to have failed");
-@@ -39,7 +46,7 @@ int nfs_cache_upcall(struct cache_detail
- NULL
- };
- char *argv[] = {
-- nfs_cache_getent_prog,
-+ (char *)nfs_cache_getent_prog,
- cd->name,
- entry_name,
- NULL
-@@ -48,7 +55,8 @@ int nfs_cache_upcall(struct cache_detail
-
- if (nfs_cache_getent_prog[0] == '\0')
- goto out;
-- ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
-+ ret = call_usermodehelper(nfs_cache_getent_prog, argv, envp,
-+ UMH_WAIT_EXEC);
- /*
- * Disable the upcall mechanism if we're getting an ENOENT or
- * EACCES error. The admin can re-enable it on the fly by using
---- a/include/linux/reboot.h
-+++ b/include/linux/reboot.h
-@@ -68,7 +68,9 @@ extern int C_A_D; /* for sysctl */
- void ctrl_alt_del(void);
-
- #define POWEROFF_CMD_PATH_LEN 256
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- extern char poweroff_cmd[POWEROFF_CMD_PATH_LEN];
-+#endif
-
- extern void orderly_poweroff(bool force);
- extern void orderly_reboot(void);
---- a/kernel/ksysfs.c
-+++ b/kernel/ksysfs.c
-@@ -44,6 +44,7 @@ static ssize_t uevent_helper_show(struct
- {
- return sprintf(buf, "%s\n", uevent_helper);
- }
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- static ssize_t uevent_helper_store(struct kobject *kobj,
- struct kobj_attribute *attr,
- const char *buf, size_t count)
-@@ -57,7 +58,10 @@ static ssize_t uevent_helper_store(struc
- return count;
- }
- KERNEL_ATTR_RW(uevent_helper);
--#endif
-+#else
-+KERNEL_ATTR_RO(uevent_helper);
-+#endif /* CONFIG_READONLY_USERMODEHELPER */
-+#endif /* CONFIG_UEVENT_HELPER */
-
- #ifdef CONFIG_PROFILING
- static ssize_t profiling_show(struct kobject *kobj,
---- a/kernel/reboot.c
-+++ b/kernel/reboot.c
-@@ -386,6 +386,9 @@ void ctrl_alt_del(void)
- kill_cad_pid(SIGINT, 1);
- }
-
-+#ifdef CONFIG_READONLY_USERMODEHELPER
-+static const
-+#endif
- char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
- static const char reboot_cmd[] = "/sbin/reboot";
-
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -662,6 +662,7 @@ static struct ctl_table kern_table[] = {
- },
- #endif
- #ifdef CONFIG_UEVENT_HELPER
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- {
- .procname = "hotplug",
- .data = &uevent_helper,
-@@ -670,6 +671,7 @@ static struct ctl_table kern_table[] = {
- .proc_handler = proc_dostring,
- },
- #endif
-+#endif
- #ifdef CONFIG_CHR_DEV_SG
- {
- .procname = "sg-big-buff",
-@@ -1079,6 +1081,7 @@ static struct ctl_table kern_table[] = {
- .proc_handler = proc_dointvec,
- },
- #endif
-+#ifndef CONFIG_READONLY_USERMODEHELPER
- {
- .procname = "poweroff_cmd",
- .data = &poweroff_cmd,
-@@ -1086,6 +1089,7 @@ static struct ctl_table kern_table[] = {
- .mode = 0644,
- .proc_handler = proc_dostring,
- },
-+#endif
- #ifdef CONFIG_KEYS
- {
- .procname = "keys",
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -29,6 +29,9 @@
-
- u64 uevent_seqnum;
- #ifdef CONFIG_UEVENT_HELPER
-+#ifdef CONFIG_READONLY_USERMODEHELPER
-+const
-+#endif
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- #endif
- #ifdef CONFIG_NET
+ struct subprocess_info {
+ struct work_struct work;
+ struct completion *complete;
+diff --git a/security/Kconfig b/security/Kconfig
+index 118f4549404e..47e8011c6261 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -158,6 +158,23 @@ config HARDENED_USERCOPY_PAGESPAN
@@ -325,3 +67,6 @@ Not-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
source security/selinux/Kconfig
source security/smack/Kconfig
source security/tomoyo/Kconfig
+--
+2.11.0
+
diff --git a/0005-add-CONFIG_READONLY_USERMODEHELPER-support-for-lots-.patch b/0005-add-CONFIG_READONLY_USERMODEHELPER-support-for-lots-.patch
new file mode 100644
index 00000000000000..d9a42edddb6acc
--- /dev/null
+++ b/0005-add-CONFIG_READONLY_USERMODEHELPER-support-for-lots-.patch
@@ -0,0 +1,368 @@
+From 88f682301f10a9278e23aed64e911dde5ba30ed9 Mon Sep 17 00:00:00 2001
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Date: Thu, 15 Dec 2016 13:09:59 -0800
+Subject: [PATCH 5/5] add CONFIG_READONLY_USERMODEHELPER support for lots of
+ places.
+
+Dynamic usermode helper should be stopped, so support it...
+---
+ arch/x86/kernel/cpu/mcheck/mce.c | 12 ++++++++----
+ drivers/block/drbd/drbd_int.h | 2 +-
+ drivers/block/drbd/drbd_main.c | 4 +++-
+ drivers/block/drbd/drbd_nl.c | 4 ++--
+ drivers/video/fbdev/uvesafb.c | 17 +++++++++++------
+ fs/nfs/cache_lib.c | 12 +++++++++---
+ include/linux/kobject.h | 3 ++-
+ include/linux/reboot.h | 3 ++-
+ kernel/ksysfs.c | 6 +++++-
+ kernel/reboot.c | 2 +-
+ kernel/sysctl.c | 4 ++++
+ lib/kobject_uevent.c | 4 ++--
+ 12 files changed, 50 insertions(+), 23 deletions(-)
+
+diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
+index 00ef43233e03..92a2ef8ffe3e 100644
+--- a/arch/x86/kernel/cpu/mcheck/mce.c
++++ b/arch/x86/kernel/cpu/mcheck/mce.c
+@@ -2337,15 +2337,16 @@ static ssize_t set_bank(struct device *s, struct device_attribute *attr,
+ }
+
+ static ssize_t
+-show_trigger(struct device *s, struct device_attribute *attr, char *buf)
++trigger_show(struct device *s, struct device_attribute *attr, char *buf)
+ {
+ strcpy(buf, mce_helper);
+ strcat(buf, "\n");
+ return strlen(mce_helper) + 1;
+ }
+
+-static ssize_t set_trigger(struct device *s, struct device_attribute *attr,
+- const char *buf, size_t siz)
++#ifndef CONFIG_READONLY_USERMODEHELPER
++static ssize_t trigger_store(struct device *s, struct device_attribute *attr,
++ const char *buf, size_t siz)
+ {
+ char *p;
+
+@@ -2358,6 +2359,10 @@ static ssize_t set_trigger(struct device *s, struct device_attribute *attr,
+
+ return strlen(mce_helper) + !!p;
+ }
++static DEVICE_ATTR_RW(trigger);
++#else
++static DEVICE_ATTR_RO(trigger);
++#endif
+
+ static ssize_t set_ignore_ce(struct device *s,
+ struct device_attribute *attr,
+@@ -2415,7 +2420,6 @@ static ssize_t store_int_with_restart(struct device *s,
+ return ret;
+ }
+
+-static DEVICE_ATTR(trigger, 0644, show_trigger, set_trigger);
+ static DEVICE_INT_ATTR(tolerant, 0644, mca_cfg.tolerant);
+ static DEVICE_INT_ATTR(monarch_timeout, 0644, mca_cfg.monarch_timeout);
+ static DEVICE_BOOL_ATTR(dont_log_ce, 0644, mca_cfg.dont_log_ce);
+diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
+index a139a34f1f1e..17fd08c330c8 100644
+--- a/drivers/block/drbd/drbd_int.h
++++ b/drivers/block/drbd/drbd_int.h
+@@ -75,7 +75,7 @@ extern int fault_rate;
+ extern int fault_devs;
+ #endif
+
+-extern char drbd_usermode_helper[];
++extern char __ro_umh drbd_usermode_helper[];
+
+
+ /* This is used to stop/restart our threads.
+diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
+index 8f51eccc8de7..d5dce7b5f58d 100644
+--- a/drivers/block/drbd/drbd_main.c
++++ b/drivers/block/drbd/drbd_main.c
+@@ -108,9 +108,11 @@ int proc_details; /* Detail level in proc drbd*/
+
+ /* Module parameter for setting the user mode helper program
+ * to run. Default is /sbin/drbdadm */
+-char drbd_usermode_helper[80] = "/sbin/drbdadm";
++char __ro_umh drbd_usermode_helper[80] = "/sbin/drbdadm";
+
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ module_param_string(usermode_helper, drbd_usermode_helper, sizeof(drbd_usermode_helper), 0644);
++#endif
+
+ /* in 2.6.x, our device mapping and config info contains our virtual gendisks
+ * as member "struct gendisk *vdisk;"
+diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
+index 9edc6fb95f19..cdbe41649e69 100644
+--- a/drivers/block/drbd/drbd_nl.c
++++ b/drivers/block/drbd/drbd_nl.c
+@@ -344,7 +344,7 @@ int drbd_khelper(struct drbd_device *device, char *cmd)
+ (char[60]) { }, /* address */
+ NULL };
+ char mb[14];
+- char *argv[] = {drbd_usermode_helper, cmd, mb, NULL };
++ char *argv[] = {(char *)drbd_usermode_helper, cmd, mb, NULL };
+ struct drbd_connection *connection = first_peer_device(device)->connection;
+ struct sib_info sib;
+ int ret;
+@@ -396,7 +396,7 @@ enum drbd_peer_state conn_khelper(struct drbd_connection *connection, char *cmd)
+ (char[60]) { }, /* address */
+ NULL };
+ char *resource_name = connection->resource->name;
+- char *argv[] = {drbd_usermode_helper, cmd, resource_name, NULL };
++ char *argv[] = {(char *)drbd_usermode_helper, cmd, resource_name, NULL };
+ int ret;
+
+ setup_khelper_env(connection, envp);
+diff --git a/drivers/video/fbdev/uvesafb.c b/drivers/video/fbdev/uvesafb.c
+index 98af9e02959b..ba6ac819877e 100644
+--- a/drivers/video/fbdev/uvesafb.c
++++ b/drivers/video/fbdev/uvesafb.c
+@@ -30,7 +30,7 @@ static struct cb_id uvesafb_cn_id = {
+ .idx = CN_IDX_V86D,
+ .val = CN_VAL_V86D_UVESAFB
+ };
+-static char v86d_path[PATH_MAX] = "/sbin/v86d";
++static char __ro_umh v86d_path[PATH_MAX] = "/sbin/v86d";
+ static char v86d_started; /* has v86d been started by uvesafb? */
+
+ static const struct fb_fix_screeninfo uvesafb_fix = {
+@@ -114,7 +114,7 @@ static int uvesafb_helper_start(void)
+ };
+
+ char *argv[] = {
+- v86d_path,
++ (char *)v86d_path,
+ NULL,
+ };
+
+@@ -1883,19 +1883,22 @@ static int uvesafb_setup(char *options)
+ }
+ #endif /* !MODULE */
+
+-static ssize_t show_v86d(struct device_driver *dev, char *buf)
++static ssize_t v86d_show(struct device_driver *dev, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%s\n", v86d_path);
+ }
+
+-static ssize_t store_v86d(struct device_driver *dev, const char *buf,
++#ifndef CONFIG_READONLY_USERMODEHELPER
++static ssize_t v86d_store(struct device_driver *dev, const char *buf,
+ size_t count)
+ {
+ strncpy(v86d_path, buf, PATH_MAX);
+ return count;
+ }
+-
+-static DRIVER_ATTR(v86d, S_IRUGO | S_IWUSR, show_v86d, store_v86d);
++static DRIVER_ATTR_RW(v86d);
++#else
++static DRIVER_ATTR_RO(v86d);
++#endif
+
+ static int uvesafb_init(void)
+ {
+@@ -2017,8 +2020,10 @@ MODULE_PARM_DESC(mode_option,
+ module_param(vbemode, ushort, 0);
+ MODULE_PARM_DESC(vbemode,
+ "VBE mode number to set, overrides the 'mode' option");
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ module_param_string(v86d, v86d_path, PATH_MAX, 0660);
+ MODULE_PARM_DESC(v86d, "Path to the v86d userspace helper.");
++#endif
+
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Michal Januszewski <spock@gentoo.org>");
+diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c
+index 6de15709d024..f1c99cb75706 100644
+--- a/fs/nfs/cache_lib.c
++++ b/fs/nfs/cache_lib.c
+@@ -20,13 +20,16 @@
+ #define NFS_CACHE_UPCALL_PATHLEN 256
+ #define NFS_CACHE_UPCALL_TIMEOUT 15
+
+-static char nfs_cache_getent_prog[NFS_CACHE_UPCALL_PATHLEN] =
++static char __ro_umh nfs_cache_getent_prog[NFS_CACHE_UPCALL_PATHLEN] =
+ "/sbin/nfs_cache_getent";
+ static unsigned long nfs_cache_getent_timeout = NFS_CACHE_UPCALL_TIMEOUT;
+
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ module_param_string(cache_getent, nfs_cache_getent_prog,
+ sizeof(nfs_cache_getent_prog), 0600);
+ MODULE_PARM_DESC(cache_getent, "Path to the client cache upcall program");
++#endif
++
+ module_param_named(cache_getent_timeout, nfs_cache_getent_timeout, ulong, 0600);
+ MODULE_PARM_DESC(cache_getent_timeout, "Timeout (in seconds) after which "
+ "the cache upcall is assumed to have failed");
+@@ -39,7 +42,7 @@ int nfs_cache_upcall(struct cache_detail *cd, char *entry_name)
+ NULL
+ };
+ char *argv[] = {
+- nfs_cache_getent_prog,
++ (char *)nfs_cache_getent_prog,
+ cd->name,
+ entry_name,
+ NULL
+@@ -48,15 +51,18 @@ int nfs_cache_upcall(struct cache_detail *cd, char *entry_name)
+
+ if (nfs_cache_getent_prog[0] == '\0')
+ goto out;
+- ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
++ ret = call_usermodehelper(nfs_cache_getent_prog, argv, envp,
++ UMH_WAIT_EXEC);
+ /*
+ * Disable the upcall mechanism if we're getting an ENOENT or
+ * EACCES error. The admin can re-enable it on the fly by using
+ * sysfs to set the 'cache_getent' parameter once the problem
+ * has been fixed.
+ */
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ if (ret == -ENOENT || ret == -EACCES)
+ nfs_cache_getent_prog[0] = '\0';
++#endif
+ out:
+ return ret > 0 ? 0 : ret;
+ }
+diff --git a/include/linux/kobject.h b/include/linux/kobject.h
+index e6284591599e..a3b4f734c6d8 100644
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -27,6 +27,7 @@
+ #include <linux/wait.h>
+ #include <linux/atomic.h>
+ #include <linux/workqueue.h>
++#include <linux/kmod.h>
+
+ #define UEVENT_HELPER_PATH_LEN 256
+ #define UEVENT_NUM_ENVP 32 /* number of env pointers */
+@@ -34,7 +35,7 @@
+
+ #ifdef CONFIG_UEVENT_HELPER
+ /* path to the userspace helper executed on an event */
+-extern char uevent_helper[];
++extern char __ro_umh uevent_helper[];
+ #endif
+
+ /* counter to tag the uevent, read only except for the kobject core */
+diff --git a/include/linux/reboot.h b/include/linux/reboot.h
+index a7ff409f386d..c693e7d9b249 100644
+--- a/include/linux/reboot.h
++++ b/include/linux/reboot.h
+@@ -3,6 +3,7 @@
+
+
+ #include <linux/notifier.h>
++#include <linux/kmod.h>
+ #include <uapi/linux/reboot.h>
+
+ #define SYS_DOWN 0x0001 /* Notify of system down */
+@@ -68,7 +69,7 @@ extern int C_A_D; /* for sysctl */
+ void ctrl_alt_del(void);
+
+ #define POWEROFF_CMD_PATH_LEN 256
+-extern char poweroff_cmd[POWEROFF_CMD_PATH_LEN];
++extern char __ro_umh poweroff_cmd[];
+
+ extern void orderly_poweroff(bool force);
+ extern void orderly_reboot(void);
+diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
+index ee1bc1bb8feb..9158fb36cfae 100644
+--- a/kernel/ksysfs.c
++++ b/kernel/ksysfs.c
+@@ -44,6 +44,7 @@ static ssize_t uevent_helper_show(struct kobject *kobj,
+ {
+ return sprintf(buf, "%s\n", uevent_helper);
+ }
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ static ssize_t uevent_helper_store(struct kobject *kobj,
+ struct kobj_attribute *attr,
+ const char *buf, size_t count)
+@@ -57,7 +58,10 @@ static ssize_t uevent_helper_store(struct kobject *kobj,
+ return count;
+ }
+ KERNEL_ATTR_RW(uevent_helper);
+-#endif
++#else
++KERNEL_ATTR_RO(uevent_helper);
++#endif /* CONFIG_READONLY_USERMODEHELPER */
++#endif /* CONFIG_UEVENT_HELPER */
+
+ #ifdef CONFIG_PROFILING
+ static ssize_t profiling_show(struct kobject *kobj,
+diff --git a/kernel/reboot.c b/kernel/reboot.c
+index bd30a973fe94..4127ac5366ee 100644
+--- a/kernel/reboot.c
++++ b/kernel/reboot.c
+@@ -386,7 +386,7 @@ void ctrl_alt_del(void)
+ kill_cad_pid(SIGINT, 1);
+ }
+
+-char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
++char __ro_umh poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
+ static const char reboot_cmd[] = "/sbin/reboot";
+
+ static int run_cmd(const char *cmd)
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 8dbaec0e4f7f..2ebf08fb4047 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -662,6 +662,7 @@ static struct ctl_table kern_table[] = {
+ },
+ #endif
+ #ifdef CONFIG_UEVENT_HELPER
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ {
+ .procname = "hotplug",
+ .data = &uevent_helper,
+@@ -670,6 +671,7 @@ static struct ctl_table kern_table[] = {
+ .proc_handler = proc_dostring,
+ },
+ #endif
++#endif
+ #ifdef CONFIG_CHR_DEV_SG
+ {
+ .procname = "sg-big-buff",
+@@ -1079,6 +1081,7 @@ static struct ctl_table kern_table[] = {
+ .proc_handler = proc_dointvec,
+ },
+ #endif
++#ifndef CONFIG_READONLY_USERMODEHELPER
+ {
+ .procname = "poweroff_cmd",
+ .data = &poweroff_cmd,
+@@ -1086,6 +1089,7 @@ static struct ctl_table kern_table[] = {
+ .mode = 0644,
+ .proc_handler = proc_dostring,
+ },
++#endif
+ #ifdef CONFIG_KEYS
+ {
+ .procname = "keys",
+diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
+index 9a2b811966eb..3093b8d634db 100644
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -29,7 +29,7 @@
+
+ u64 uevent_seqnum;
+ #ifdef CONFIG_UEVENT_HELPER
+-char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
++char __ro_umh uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
+ #endif
+ #ifdef CONFIG_NET
+ struct uevent_sock {
+@@ -137,7 +137,7 @@ static int init_uevent_argv(struct kobj_uevent_env *env, const char *subsystem)
+ return -ENOMEM;
+ }
+
+- env->argv[0] = uevent_helper;
++ env->argv[0] = (char *)uevent_helper;
+ env->argv[1] = &env->buf[env->buflen];
+ env->argv[2] = NULL;
+
+--
+2.11.0
+
diff --git a/c04.patch b/c04.patch
index a80d68dee72df2..963e08264d162d 100644
--- a/c04.patch
+++ b/c04.patch
@@ -4,7 +4,7 @@
--- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
+++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
-@@ -3962,10 +3962,6 @@ static const struct target_core_fabric_o
+@@ -3849,10 +3849,6 @@ static const struct target_core_fabric_o
static void ibmvscsis_dev_release(struct device *dev) {};
@@ -15,11 +15,11 @@
static struct device_attribute dev_attr_system_id =
__ATTR(system_id, S_IRUGO, system_id_show, NULL);
-@@ -3985,7 +3981,6 @@ ATTRIBUTE_GROUPS(ibmvscsis_dev);
+@@ -3872,7 +3868,6 @@ ATTRIBUTE_GROUPS(ibmvscsis_dev);
static struct class ibmvscsis_class = {
- .name = "ibmvscsis",
- .dev_release = ibmvscsis_dev_release,
-- .class_attrs = ibmvscsis_class_attrs,
- .dev_groups = ibmvscsis_dev_groups,
+ .name = "ibmvscsis",
+ .dev_release = ibmvscsis_dev_release,
+- .class_attrs = ibmvscsis_class_attrs,
+ .dev_groups = ibmvscsis_dev_groups,
};
diff --git a/c06.patch b/c06.patch
index ffbb2e2cf61568..ed57a0e858cdb4 100644
--- a/c06.patch
+++ b/c06.patch
@@ -4,7 +4,7 @@
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
-@@ -1369,6 +1369,13 @@ static int zram_remove(struct zram *zram
+@@ -1372,6 +1372,13 @@ static int zram_remove(struct zram *zram
}
/* zram-control sysfs attributes */
@@ -18,7 +18,7 @@
static ssize_t hot_add_show(struct class *class,
struct class_attribute *attr,
char *buf)
-@@ -1383,6 +1390,7 @@ static ssize_t hot_add_show(struct class
+@@ -1386,6 +1393,7 @@ static ssize_t hot_add_show(struct class
return ret;
return scnprintf(buf, PAGE_SIZE, "%d\n", ret);
}
@@ -26,7 +26,7 @@
static ssize_t hot_remove_store(struct class *class,
struct class_attribute *attr,
-@@ -1413,23 +1421,19 @@ static ssize_t hot_remove_store(struct c
+@@ -1416,23 +1424,19 @@ static ssize_t hot_remove_store(struct c
mutex_unlock(&zram_index_mutex);
return ret ? ret : count;
}
diff --git a/csdio2.patch b/csdio2.patch
index 8ce227bbed74e9..e68d39f353a59d 100644
--- a/csdio2.patch
+++ b/csdio2.patch
@@ -1394,7 +1394,7 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
+#endif
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
-@@ -94,6 +94,7 @@ header-y += coff.h
+@@ -96,6 +96,7 @@ header-y += coff.h
header-y += connector.h
header-y += const.h
header-y += cramfs_fs.h
diff --git a/d01.patch b/d01.patch
index 804b67195038c2..534d9fc3b1e9a8 100644
--- a/d01.patch
+++ b/d01.patch
@@ -4,7 +4,7 @@
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
-@@ -2133,7 +2133,7 @@ struct hid_dynid {
+@@ -2143,7 +2143,7 @@ struct hid_dynid {
* Adds a new dynamic hid device ID to this driver,
* and causes the driver to probe for all devices again.
*/
@@ -13,7 +13,7 @@
size_t count)
{
struct hid_driver *hdrv = to_hid_driver(drv);
-@@ -2165,7 +2165,13 @@ static ssize_t store_new_id(struct devic
+@@ -2175,7 +2175,13 @@ static ssize_t store_new_id(struct devic
return ret ? : count;
}
@@ -28,7 +28,7 @@
static void hid_free_dynids(struct hid_driver *hdrv)
{
-@@ -2329,6 +2335,7 @@ static int hid_uevent(struct device *dev
+@@ -2339,6 +2345,7 @@ static int hid_uevent(struct device *dev
static struct bus_type hid_bus_type = {
.name = "hid",
.dev_groups = hid_dev_groups,
@@ -36,7 +36,7 @@
.match = hid_bus_match,
.probe = hid_device_probe,
.remove = hid_device_remove,
-@@ -2767,8 +2774,6 @@ EXPORT_SYMBOL_GPL(hid_destroy_device);
+@@ -2778,8 +2785,6 @@ EXPORT_SYMBOL_GPL(hid_destroy_device);
int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
const char *mod_name)
{
@@ -45,7 +45,7 @@
hdrv->driver.name = hdrv->name;
hdrv->driver.bus = &hid_bus_type;
hdrv->driver.owner = owner;
-@@ -2777,21 +2782,12 @@ int __hid_register_driver(struct hid_dri
+@@ -2788,21 +2793,12 @@ int __hid_register_driver(struct hid_dri
INIT_LIST_HEAD(&hdrv->dyn_list);
spin_lock_init(&hdrv->dyn_lock);
diff --git a/d02.patch b/d02.patch
index b39ec91134cf54..5c15f1c0871add 100644
--- a/d02.patch
+++ b/d02.patch
@@ -4,7 +4,7 @@
--- a/drivers/infiniband/hw/nes/nes.c
+++ b/drivers/infiniband/hw/nes/nes.c
-@@ -816,7 +816,7 @@ static struct pci_driver nes_pci_driver
+@@ -815,7 +815,7 @@ static struct pci_driver nes_pci_driver
.remove = nes_remove,
};
@@ -13,7 +13,7 @@
{
unsigned int devfn = 0xffffffff;
unsigned char bus_number = 0xff;
-@@ -835,7 +835,7 @@ static ssize_t nes_show_adapter(struct d
+@@ -834,7 +834,7 @@ static ssize_t nes_show_adapter(struct d
return snprintf(buf, PAGE_SIZE, "%x:%x\n", bus_number, devfn);
}
@@ -22,7 +22,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -844,7 +844,7 @@ static ssize_t nes_store_adapter(struct
+@@ -843,7 +843,7 @@ static ssize_t nes_store_adapter(struct
return strnlen(buf, count);
}
@@ -31,7 +31,7 @@
{
u32 eeprom_cmd = 0xdead;
u32 i = 0;
-@@ -860,7 +860,7 @@ static ssize_t nes_show_ee_cmd(struct de
+@@ -859,7 +859,7 @@ static ssize_t nes_show_ee_cmd(struct de
return snprintf(buf, PAGE_SIZE, "0x%x\n", eeprom_cmd);
}
@@ -40,7 +40,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -881,7 +881,7 @@ static ssize_t nes_store_ee_cmd(struct d
+@@ -880,7 +880,7 @@ static ssize_t nes_store_ee_cmd(struct d
return strnlen(buf, count);
}
@@ -49,7 +49,7 @@
{
u32 eeprom_data = 0xdead;
u32 i = 0;
-@@ -898,7 +898,7 @@ static ssize_t nes_show_ee_data(struct d
+@@ -897,7 +897,7 @@ static ssize_t nes_show_ee_data(struct d
return snprintf(buf, PAGE_SIZE, "0x%x\n", eeprom_data);
}
@@ -58,7 +58,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -919,7 +919,7 @@ static ssize_t nes_store_ee_data(struct
+@@ -918,7 +918,7 @@ static ssize_t nes_store_ee_data(struct
return strnlen(buf, count);
}
@@ -67,7 +67,7 @@
{
u32 flash_cmd = 0xdead;
u32 i = 0;
-@@ -936,7 +936,7 @@ static ssize_t nes_show_flash_cmd(struct
+@@ -935,7 +935,7 @@ static ssize_t nes_show_flash_cmd(struct
return snprintf(buf, PAGE_SIZE, "0x%x\n", flash_cmd);
}
@@ -76,7 +76,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -957,7 +957,7 @@ static ssize_t nes_store_flash_cmd(struc
+@@ -956,7 +956,7 @@ static ssize_t nes_store_flash_cmd(struc
return strnlen(buf, count);
}
@@ -85,7 +85,7 @@
{
u32 flash_data = 0xdead;
u32 i = 0;
-@@ -974,7 +974,7 @@ static ssize_t nes_show_flash_data(struc
+@@ -973,7 +973,7 @@ static ssize_t nes_show_flash_data(struc
return snprintf(buf, PAGE_SIZE, "0x%x\n", flash_data);
}
@@ -94,7 +94,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -995,12 +995,12 @@ static ssize_t nes_store_flash_data(stru
+@@ -994,12 +994,12 @@ static ssize_t nes_store_flash_data(stru
return strnlen(buf, count);
}
@@ -109,7 +109,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -1011,7 +1011,7 @@ static ssize_t nes_store_nonidx_addr(str
+@@ -1010,7 +1010,7 @@ static ssize_t nes_store_nonidx_addr(str
return strnlen(buf, count);
}
@@ -118,7 +118,7 @@
{
u32 nonidx_data = 0xdead;
u32 i = 0;
-@@ -1028,7 +1028,7 @@ static ssize_t nes_show_nonidx_data(stru
+@@ -1027,7 +1027,7 @@ static ssize_t nes_show_nonidx_data(stru
return snprintf(buf, PAGE_SIZE, "0x%x\n", nonidx_data);
}
@@ -127,7 +127,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -1049,12 +1049,12 @@ static ssize_t nes_store_nonidx_data(str
+@@ -1048,12 +1048,12 @@ static ssize_t nes_store_nonidx_data(str
return strnlen(buf, count);
}
@@ -142,7 +142,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -1065,7 +1065,7 @@ static ssize_t nes_store_idx_addr(struct
+@@ -1064,7 +1064,7 @@ static ssize_t nes_store_idx_addr(struct
return strnlen(buf, count);
}
@@ -151,7 +151,7 @@
{
u32 idx_data = 0xdead;
u32 i = 0;
-@@ -1082,7 +1082,7 @@ static ssize_t nes_show_idx_data(struct
+@@ -1081,7 +1081,7 @@ static ssize_t nes_show_idx_data(struct
return snprintf(buf, PAGE_SIZE, "0x%x\n", idx_data);
}
@@ -160,7 +160,7 @@
const char *buf, size_t count)
{
char *p = (char *)buf;
-@@ -1103,11 +1103,7 @@ static ssize_t nes_store_idx_data(struct
+@@ -1102,11 +1102,7 @@ static ssize_t nes_store_idx_data(struct
return strnlen(buf, count);
}
@@ -173,7 +173,7 @@
{
u32 wqm_quanta_value = 0xdead;
u32 i = 0;
-@@ -1124,12 +1120,8 @@ static ssize_t nes_show_wqm_quanta(struc
+@@ -1123,12 +1119,8 @@ static ssize_t nes_show_wqm_quanta(struc
return snprintf(buf, PAGE_SIZE, "0x%X\n", wqm_quanta_value);
}
@@ -188,7 +188,7 @@
{
unsigned long wqm_quanta_value;
u32 wqm_config1;
-@@ -1154,26 +1146,16 @@ static ssize_t nes_store_wqm_quanta(stru
+@@ -1153,26 +1145,16 @@ static ssize_t nes_store_wqm_quanta(stru
return strnlen(buf, count);
}
diff --git a/d05.patch b/d05.patch
index ced6a40f0ad593..133d90e1167d00 100644
--- a/d05.patch
+++ b/d05.patch
@@ -22,7 +22,7 @@
{
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
-@@ -6961,49 +6961,39 @@ static struct pci_driver megasas_pci_dri
+@@ -6991,49 +6991,39 @@ static struct pci_driver megasas_pci_dri
/*
* Sysfs driver attributes
*/
@@ -83,7 +83,7 @@
{
int retval = count;
-@@ -7013,9 +7003,7 @@ megasas_sysfs_set_dbg_lvl(struct device_
+@@ -7043,9 +7033,7 @@ megasas_sysfs_set_dbg_lvl(struct device_
}
return retval;
}
diff --git a/d10.patch b/d10.patch
index 139450dce5dcfc..a2a28c7ece7101 100644
--- a/d10.patch
+++ b/d10.patch
@@ -4,7 +4,7 @@
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
-@@ -1430,25 +1430,20 @@ static int tpacpi_rfk_procfs_write(const
+@@ -1439,25 +1439,20 @@ static int tpacpi_rfk_procfs_write(const
*/
/* interface_version --------------------------------------------------- */
@@ -35,7 +35,7 @@
{
unsigned long t;
-@@ -1459,34 +1454,28 @@ static ssize_t tpacpi_driver_debug_store
+@@ -1468,34 +1463,28 @@ static ssize_t tpacpi_driver_debug_store
return count;
}
@@ -76,7 +76,7 @@
{
unsigned long t;
-@@ -1500,22 +1489,16 @@ static ssize_t tpacpi_driver_wlsw_emulst
+@@ -1509,22 +1498,16 @@ static ssize_t tpacpi_driver_wlsw_emulst
return count;
}
@@ -103,7 +103,7 @@
{
unsigned long t;
-@@ -1526,22 +1509,16 @@ static ssize_t tpacpi_driver_bluetooth_e
+@@ -1535,22 +1518,16 @@ static ssize_t tpacpi_driver_bluetooth_e
return count;
}
@@ -130,7 +130,7 @@
{
unsigned long t;
-@@ -1552,22 +1529,16 @@ static ssize_t tpacpi_driver_wwan_emulst
+@@ -1561,22 +1538,16 @@ static ssize_t tpacpi_driver_wwan_emulst
return count;
}
@@ -157,7 +157,7 @@
{
unsigned long t;
-@@ -1578,10 +1549,7 @@ static ssize_t tpacpi_driver_uwb_emulsta
+@@ -1587,10 +1558,7 @@ static ssize_t tpacpi_driver_uwb_emulsta
return count;
}
@@ -169,7 +169,7 @@
#endif
/* --------------------------------------------------------------------- */
-@@ -8516,14 +8484,13 @@ static ssize_t fan_fan2_input_show(struc
+@@ -8571,14 +8539,13 @@ static ssize_t fan_fan2_input_show(struc
static DEVICE_ATTR(fan2_input, S_IRUGO, fan_fan2_input_show, NULL);
/* sysfs fan fan_watchdog (hwmon driver) ------------------------------- */
@@ -187,7 +187,7 @@
{
unsigned long t;
-@@ -8540,9 +8507,7 @@ static ssize_t fan_fan_watchdog_store(st
+@@ -8595,9 +8562,7 @@ static ssize_t fan_fan_watchdog_store(st
return count;
}
diff --git a/d99.patch b/d99.patch
index b3d1f6cd46f37b..861c5a1ebc1403 100644
--- a/d99.patch
+++ b/d99.patch
@@ -12,10 +12,43 @@ one can use it anymore.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- include/linux/device.h | 2 --
- 1 file changed, 2 deletions(-)
+ Documentation/driver-model/driver.txt | 7 ++++---
+ Documentation/filesystems/sysfs.txt | 3 ++-
+ include/linux/device.h | 2 --
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+--- a/Documentation/driver-model/driver.txt
++++ b/Documentation/driver-model/driver.txt
+@@ -196,12 +196,13 @@ struct driver_attribute {
+ };
+
+ Device drivers can export attributes via their sysfs directories.
+-Drivers can declare attributes using a DRIVER_ATTR macro that works
+-identically to the DEVICE_ATTR macro.
++Drivers can declare attributes using a DRIVER_ATTR_RW and DRIVER_ATTR_RO
++macro that works identically to the DEVICE_ATTR_RW and DEVICE_ATTR_RO
++macros.
+
+ Example:
+
+-DRIVER_ATTR(debug,0644,show_debug,store_debug);
++DRIVER_ATTR_RW(debug);
+
+ This is equivalent to declaring:
+
+--- a/Documentation/filesystems/sysfs.txt
++++ b/Documentation/filesystems/sysfs.txt
+@@ -366,7 +366,8 @@ struct driver_attribute {
+
+ Declaring:
+
+-DRIVER_ATTR(_name, _mode, _show, _store)
++DRIVER_ATTR_RO(_name)
++DRIVER_ATTR_RW(_name)
+
+ Creation/Removal:
+
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -303,8 +303,6 @@ struct driver_attribute {
diff --git a/introduce-static_usermodehelper-to-mediate-call_usermodehelper.patch b/introduce-static_usermodehelper-to-mediate-call_usermodehelper.patch
new file mode 100644
index 00000000000000..c4bec725e8279e
--- /dev/null
+++ b/introduce-static_usermodehelper-to-mediate-call_usermodehelper.patch
@@ -0,0 +1,74 @@
+From foo@baz Mon Jan 16 16:22:39 CET 2017
+Date: Mon, 16 Jan 2017 16:22:39 +0100
+To: Greg KH <gregkh@linuxfoundation.org>
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Subject: Introduce STATIC_USERMODEHELPER to mediate call_usermodehelper()
+
+Some usermode helper applications are defined at kernel build time, while
+others can be changed at runtime. To provide a sane way to filter these, add a
+new kernel option "STATIC_USERMODEHELPER". This option routes all
+call_usermodehelper() calls through this binary, no matter what the caller
+wishes to have called.
+
+The new binary (by default set to /sbin/usermode-helper, but can be changed
+through the STATIC_USERMODEHELPER_PATH option) can properly filter the
+requested programs to be run by the kernel by looking at the first argument
+that is passed to it. All other options should then be passed onto the proper
+program if so desired.
+
+To disable all call_usermodehelper() calls by the kernel, set
+STATIC_USERMODEHELPER_PATH to an empty string.
+
+Thanks to Neil Brown for the idea of this feature.
+
+Cc: NeilBrown <neilb@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ security/Kconfig | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+--- a/security/Kconfig
++++ b/security/Kconfig
+@@ -158,6 +158,41 @@ config HARDENED_USERCOPY_PAGESPAN
+ been removed. This config is intended to be used only while
+ trying to find such users.
+
++config STATIC_USERMODEHELPER
++ bool "Force all usermode helper calls through a single binary"
++ help
++ By default, the kernel can call many different userspace
++ binary programs through the "usermode helper" kernel
++ interface. Some of these binaries are statically defined
++ either in the kernel code itself, or as a kernel configuration
++ option. However, some of these are dynamically created at
++ runtime, or can be modified after the kernel has started up.
++ To provide an additional layer of security, route all of these
++ calls through a single executable that can not have its name
++ changed.
++
++ Note, it is up to this single binary to then call the relevant
++ "real" usermode helper binary, based on the first argument
++ passed to it. If desired, this program can filter and pick
++ and choose what real programs are called.
++
++ If you wish for all usermode helper programs are to be
++ disabled, choose this option and then set
++ STATIC_USERMODEHELPER_PATH to an empty string.
++
++config STATIC_USERMODEHELPER_PATH
++ string "Path to the static usermode helper binary"
++ depends on STATIC_USERMODEHELPER
++ default "/sbin/usermode-helper"
++ help
++ The binary called by the kernel when any usermode helper
++ program is wish to be run. The "real" application's name will
++ be in the first argument passed to this program on the command
++ line.
++
++ If you wish for all usermode helper programs to be disabled,
++ specify an empty string here (i.e. "").
++
+ source security/selinux/Kconfig
+ source security/smack/Kconfig
+ source security/tomoyo/Kconfig
diff --git a/p21.patch b/p21.patch
index a4103d1b64e46f..0219dd6b92ca87 100644
--- a/p21.patch
+++ b/p21.patch
@@ -1,10 +1,10 @@
---
- arch/powerpc/kernel/vio.c | 12 +++++++++++-
- arch/sparc/kernel/vio.c | 18 +++++++++++-------
+ arch/powerpc/platforms/pseries/vio.c | 12 +++++++++++-
+ arch/sparc/kernel/vio.c | 18 +++++++++++-------
2 files changed, 22 insertions(+), 8 deletions(-)
---- a/arch/powerpc/kernel/vio.c
-+++ b/arch/powerpc/kernel/vio.c
+--- a/arch/powerpc/platforms/pseries/vio.c
++++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1537,6 +1537,7 @@ static ssize_t name_show(struct device *
{
return sprintf(buf, "%s\n", to_vio_dev(dev)->name);
diff --git a/p28.patch b/p28.patch
index bf5e3f578ab809..a19fb142ba5dae 100644
--- a/p28.patch
+++ b/p28.patch
@@ -1,10 +1,10 @@
---
- arch/powerpc/kernel/ibmebus.c | 16 ++++++++++------
+ arch/powerpc/platforms/pseries/ibmebus.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
---- a/arch/powerpc/kernel/ibmebus.c
-+++ b/arch/powerpc/kernel/ibmebus.c
-@@ -389,6 +389,7 @@ static ssize_t devspec_show(struct devic
+--- a/arch/powerpc/platforms/pseries/ibmebus.c
++++ b/arch/powerpc/platforms/pseries/ibmebus.c
+@@ -397,6 +397,7 @@ static ssize_t devspec_show(struct devic
ofdev = to_platform_device(dev);
return sprintf(buf, "%s\n", ofdev->dev.of_node->full_name);
}
@@ -12,7 +12,7 @@
static ssize_t name_show(struct device *dev,
struct device_attribute *attr, char *buf)
-@@ -398,6 +399,7 @@ static ssize_t name_show(struct device *
+@@ -406,6 +407,7 @@ static ssize_t name_show(struct device *
ofdev = to_platform_device(dev);
return sprintf(buf, "%s\n", ofdev->dev.of_node->name);
}
@@ -20,7 +20,7 @@
static ssize_t modalias_show(struct device *dev,
struct device_attribute *attr, char *buf)
-@@ -407,13 +409,15 @@ static ssize_t modalias_show(struct devi
+@@ -415,13 +417,15 @@ static ssize_t modalias_show(struct devi
buf[len+1] = 0;
return len+1;
}
@@ -39,14 +39,14 @@
};
+ATTRIBUTE_GROUPS(ibmebus_bus_device);
- #ifdef CONFIG_PM_SLEEP
- static int ibmebus_bus_legacy_suspend(struct device *dev, pm_message_t mesg)
-@@ -720,7 +724,7 @@ struct bus_type ibmebus_bus_type = {
+ struct bus_type ibmebus_bus_type = {
+ .name = "ibmebus",
+@@ -431,7 +435,7 @@ struct bus_type ibmebus_bus_type = {
.probe = ibmebus_bus_device_probe,
.remove = ibmebus_bus_device_remove,
.shutdown = ibmebus_bus_device_shutdown,
- .dev_attrs = ibmebus_bus_device_attrs,
+ .dev_groups = ibmebus_bus_device_groups,
- .pm = IBMEBUS_BUS_PM_OPS_PTR,
};
EXPORT_SYMBOL(ibmebus_bus_type);
+
diff --git a/p29.patch b/p29.patch
index 0d004f2d7ac5f4..cfcab89ff158e1 100644
--- a/p29.patch
+++ b/p29.patch
@@ -1,9 +1,9 @@
---
- arch/powerpc/kernel/vio.c | 43 ++++++++++++++++++++++---------------------
+ arch/powerpc/platforms/pseries/vio.c | 43 +++++++++++++++++------------------
1 file changed, 22 insertions(+), 21 deletions(-)
---- a/arch/powerpc/kernel/vio.c
-+++ b/arch/powerpc/kernel/vio.c
+--- a/arch/powerpc/platforms/pseries/vio.c
++++ b/arch/powerpc/platforms/pseries/vio.c
@@ -948,7 +948,7 @@ static void vio_cmo_bus_init(void)
/* sysfs device functions and data structures for CMO */
diff --git a/series b/series
index 2cac3379f7a97a..51646f3c8615fd 100644
--- a/series
+++ b/series
@@ -1,7 +1,9 @@
0001-kmod-make-usermodehelper-path-a-const-string.patch
-0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch
0003-Make-static-usermode-helper-binaries-constant.patch
+introduce-static_usermodehelper-to-mediate-call_usermodehelper.patch
+0002-drbd-rename-usermode_helper-to-drbd_usermode_helper.patch
0004-Introduce-CONFIG_READONLY_USERMODEHELPER.patch
+0005-add-CONFIG_READONLY_USERMODEHELPER-support-for-lots-.patch
## broken patch!
#