From: Greg Kroah-Hartman Date: Wed, 18 Dec 2013 20:25:52 +0000 (-0800) Subject: 3.12-stable patches X-Git-Tag: v3.4.75~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e56c7ccc8dba676e7d212f29dddba898e26866e1;p=thirdparty%2Fkernel%2Fstable-queue.git 3.12-stable patches added patches: cxd2820r_core-fix-sparse-warnings.patch exportfs-fix-32-bit-nfsd-handling-of-64-bit-inode-numbers.patch hid-kye-add-report-fixup-for-genius-manticore-keyboard.patch hid-kye-fix-missing-break-in-kye_report_fixup.patch nfs-fix-do_div-warning-by-instead-using-sector_div.patch sched-avoid-throttle_cfs_rq-racing-with-period_timer-stopping.patch vfs-split-out-vfs_getattr_nosec.patch --- diff --git a/queue-3.12/cxd2820r_core-fix-sparse-warnings.patch b/queue-3.12/cxd2820r_core-fix-sparse-warnings.patch new file mode 100644 index 00000000000..a8371fdf2f9 --- /dev/null +++ b/queue-3.12/cxd2820r_core-fix-sparse-warnings.patch @@ -0,0 +1,44 @@ +From 0db3fa2741ad8371c21b3a6785416a4afc0cc1d4 Mon Sep 17 00:00:00 2001 +From: Hans Verkuil +Date: Fri, 4 Oct 2013 11:01:43 -0300 +Subject: [media] cxd2820r_core: fix sparse warnings + +From: Hans Verkuil + +commit 0db3fa2741ad8371c21b3a6785416a4afc0cc1d4 upstream. + +drivers/media/dvb-frontends/cxd2820r_core.c:34:32: error: cannot size expression +drivers/media/dvb-frontends/cxd2820r_core.c:68:32: error: cannot size expression + +Signed-off-by: Hans Verkuil +Acked-by: Antti Palosaari +Reviewed-by: Antti Palosaari +Reviewed-by: Michael Krufky +Signed-off-by: Mauro Carvalho Chehab +Cc: Frederik Himpe +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/dvb-frontends/cxd2820r_core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/media/dvb-frontends/cxd2820r_core.c ++++ b/drivers/media/dvb-frontends/cxd2820r_core.c +@@ -34,7 +34,7 @@ static int cxd2820r_wr_regs_i2c(struct c + { + .addr = i2c, + .flags = 0, +- .len = sizeof(buf), ++ .len = len + 1, + .buf = buf, + } + }; +@@ -75,7 +75,7 @@ static int cxd2820r_rd_regs_i2c(struct c + }, { + .addr = i2c, + .flags = I2C_M_RD, +- .len = sizeof(buf), ++ .len = len, + .buf = buf, + } + }; diff --git a/queue-3.12/exportfs-fix-32-bit-nfsd-handling-of-64-bit-inode-numbers.patch b/queue-3.12/exportfs-fix-32-bit-nfsd-handling-of-64-bit-inode-numbers.patch new file mode 100644 index 00000000000..ca7fb6870fc --- /dev/null +++ b/queue-3.12/exportfs-fix-32-bit-nfsd-handling-of-64-bit-inode-numbers.patch @@ -0,0 +1,67 @@ +From 950ee9566a5b6cc45d15f5fe044bab4f1e8b62cb Mon Sep 17 00:00:00 2001 +From: "J. Bruce Fields" +Date: Tue, 10 Sep 2013 11:41:12 -0400 +Subject: exportfs: fix 32-bit nfsd handling of 64-bit inode numbers + +From: "J. Bruce Fields" + +commit 950ee9566a5b6cc45d15f5fe044bab4f1e8b62cb upstream. + +Symptoms were spurious -ENOENTs on stat of an NFS filesystem from a +32-bit NFS server exporting a very large XFS filesystem, when the +server's cache is cold (so the inodes in question are not in cache). + +Reviewed-by: Christoph Hellwig +Reported-by: Trevor Cordes +Signed-off-by: J. Bruce Fields +Signed-off-by: Al Viro +Signed-off-by: Greg Kroah-Hartman + +--- + fs/exportfs/expfs.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -215,7 +215,7 @@ struct getdents_callback { + struct dir_context ctx; + char *name; /* name that was found. It already points to a + buffer NAME_MAX+1 is size */ +- unsigned long ino; /* the inum we are looking for */ ++ u64 ino; /* the inum we are looking for */ + int found; /* inode matched? */ + int sequence; /* sequence counter */ + }; +@@ -255,10 +255,14 @@ static int get_name(const struct path *p + struct inode *dir = path->dentry->d_inode; + int error; + struct file *file; ++ struct kstat stat; ++ struct path child_path = { ++ .mnt = path->mnt, ++ .dentry = child, ++ }; + struct getdents_callback buffer = { + .ctx.actor = filldir_one, + .name = name, +- .ino = child->d_inode->i_ino + }; + + error = -ENOTDIR; +@@ -268,6 +272,16 @@ static int get_name(const struct path *p + if (!dir->i_fop) + goto out; + /* ++ * inode->i_ino is unsigned long, kstat->ino is u64, so the ++ * former would be insufficient on 32-bit hosts when the ++ * filesystem supports 64-bit inode numbers. So we need to ++ * actually call ->getattr, not just read i_ino: ++ */ ++ error = vfs_getattr_nosec(&child_path, &stat); ++ if (error) ++ return error; ++ buffer.ino = stat.ino; ++ /* + * Open the directory ... + */ + file = dentry_open(path, O_RDONLY, cred); diff --git a/queue-3.12/hid-kye-add-report-fixup-for-genius-manticore-keyboard.patch b/queue-3.12/hid-kye-add-report-fixup-for-genius-manticore-keyboard.patch new file mode 100644 index 00000000000..a1c03c2c6fa --- /dev/null +++ b/queue-3.12/hid-kye-add-report-fixup-for-genius-manticore-keyboard.patch @@ -0,0 +1,65 @@ +From 4a2c94c9b6c03af61b04993340bd9559e2277de4 Mon Sep 17 00:00:00 2001 +From: Benjamin Tissoires +Date: Wed, 20 Nov 2013 09:49:41 -0500 +Subject: HID: kye: Add report fixup for Genius Manticore Keyboard + +From: Benjamin Tissoires + +commit 4a2c94c9b6c03af61b04993340bd9559e2277de4 upstream. + +Genius Manticore Keyboard presents the same problem in its report +descriptors than Genius Gila Gaming Mouse and Genius Imperator Keyboard. +Use the same fixup. + +Reported-and-tested-by: Adam Kulagowski +Signed-off-by: Benjamin Tissoires +Signed-off-by: Jiri Kosina +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hid/hid-core.c | 1 + + drivers/hid/hid-ids.h | 1 + + drivers/hid/hid-kye.c | 5 +++++ + 3 files changed, 7 insertions(+) + +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1725,6 +1725,7 @@ static const struct hid_device_id hid_ha + { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -489,6 +489,7 @@ + #define USB_VENDOR_ID_KYE 0x0458 + #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 + #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 ++#define USB_DEVICE_ID_GENIUS_MANTICORE 0x0153 + #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 + #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 + #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 +--- a/drivers/hid/hid-kye.c ++++ b/drivers/hid/hid-kye.c +@@ -341,6 +341,9 @@ static __u8 *kye_report_fixup(struct hid + case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, + "Genius Gx Imperator Keyboard"); ++ case USB_DEVICE_ID_GENIUS_MANTICORE: ++ rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, ++ "Genius Manticore Keyboard"); + break; + } + return rdesc; +@@ -439,6 +442,8 @@ static const struct hid_device_id kye_de + USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_KYE, ++ USB_DEVICE_ID_GENIUS_MANTICORE) }, + { } + }; + MODULE_DEVICE_TABLE(hid, kye_devices); diff --git a/queue-3.12/hid-kye-fix-missing-break-in-kye_report_fixup.patch b/queue-3.12/hid-kye-fix-missing-break-in-kye_report_fixup.patch new file mode 100644 index 00000000000..47551b1703f --- /dev/null +++ b/queue-3.12/hid-kye-fix-missing-break-in-kye_report_fixup.patch @@ -0,0 +1,34 @@ +From 0a5f99cfff2297f6c350b7f54878cbbf1b1253d5 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Sat, 30 Nov 2013 19:12:27 +0000 +Subject: HID: kye: Fix missing break in kye_report_fixup() + +From: Ben Hutchings + +commit 0a5f99cfff2297f6c350b7f54878cbbf1b1253d5 upstream. + +The change to support Genius Manticore Keyboard also changed behaviour +for Genius Gx Imperator Keyboard, as there is no break between the +cases. This is presumably a mistake. + +Reported by Coverity as CID 1134029. + +Fixes: 4a2c94c9b6c0 ('HID: kye: Add report fixup for Genius Manticore Keyboard') +Signed-off-by: Ben Hutchings +Signed-off-by: Jiri Kosina +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hid/hid-kye.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/hid/hid-kye.c ++++ b/drivers/hid/hid-kye.c +@@ -341,6 +341,7 @@ static __u8 *kye_report_fixup(struct hid + case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, + "Genius Gx Imperator Keyboard"); ++ break; + case USB_DEVICE_ID_GENIUS_MANTICORE: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, + "Genius Manticore Keyboard"); diff --git a/queue-3.12/nfs-fix-do_div-warning-by-instead-using-sector_div.patch b/queue-3.12/nfs-fix-do_div-warning-by-instead-using-sector_div.patch new file mode 100644 index 00000000000..6886a3e091c --- /dev/null +++ b/queue-3.12/nfs-fix-do_div-warning-by-instead-using-sector_div.patch @@ -0,0 +1,40 @@ +From 3873d064b8538686bbbd4b858dc8a07db1f7f43a Mon Sep 17 00:00:00 2001 +From: Helge Deller +Date: Mon, 2 Dec 2013 19:59:31 +0100 +Subject: nfs: fix do_div() warning by instead using sector_div() + +From: Helge Deller + +commit 3873d064b8538686bbbd4b858dc8a07db1f7f43a upstream. + +When compiling a 32bit kernel with CONFIG_LBDAF=n the compiler complains like +shown below. Fix this warning by instead using sector_div() which is provided +by the kernel.h header file. + +fs/nfs/blocklayout/extents.c: In function ‘normalize’: +include/asm-generic/div64.h:43:28: warning: comparison of distinct pointer types lacks a cast [enabled by default] +fs/nfs/blocklayout/extents.c:47:13: note: in expansion of macro ‘do_div’ +nfs/blocklayout/extents.c:47:2: warning: right shift count >= width of type [enabled by default] +fs/nfs/blocklayout/extents.c:47:2: warning: passing argument 1 of ‘__div64_32’ from incompatible pointer type [enabled by default] +include/asm-generic/div64.h:35:17: note: expected ‘uint64_t *’ but argument is of type ‘sector_t *’ + extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor); + +Signed-off-by: Helge Deller +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfs/blocklayout/extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/nfs/blocklayout/extents.c ++++ b/fs/nfs/blocklayout/extents.c +@@ -44,7 +44,7 @@ + static inline sector_t normalize(sector_t s, int base) + { + sector_t tmp = s; /* Since do_div modifies its argument */ +- return s - do_div(tmp, base); ++ return s - sector_div(tmp, base); + } + + static inline sector_t normalize_up(sector_t s, int base) diff --git a/queue-3.12/sched-avoid-throttle_cfs_rq-racing-with-period_timer-stopping.patch b/queue-3.12/sched-avoid-throttle_cfs_rq-racing-with-period_timer-stopping.patch new file mode 100644 index 00000000000..5f23e730b53 --- /dev/null +++ b/queue-3.12/sched-avoid-throttle_cfs_rq-racing-with-period_timer-stopping.patch @@ -0,0 +1,67 @@ +From f9f9ffc237dd924f048204e8799da74f9ecf40cf Mon Sep 17 00:00:00 2001 +From: Ben Segall +Date: Wed, 16 Oct 2013 11:16:32 -0700 +Subject: sched: Avoid throttle_cfs_rq() racing with period_timer stopping + +From: Ben Segall + +commit f9f9ffc237dd924f048204e8799da74f9ecf40cf upstream. + +throttle_cfs_rq() doesn't check to make sure that period_timer is running, +and while update_curr/assign_cfs_runtime does, a concurrently running +period_timer on another cpu could cancel itself between this cpu's +update_curr and throttle_cfs_rq(). If there are no other cfs_rqs running +in the tg to restart the timer, this causes the cfs_rq to be stranded +forever. + +Fix this by calling __start_cfs_bandwidth() in throttle if the timer is +inactive. + +(Also add some sched_debug lines for cfs_bandwidth.) + +Tested: make a run/sleep task in a cgroup, loop switching the cgroup +between 1ms/100ms quota and unlimited, checking for timer_active=0 and +throttled=1 as a failure. With the throttle_cfs_rq() change commented out +this fails, with the full patch it passes. + +Signed-off-by: Ben Segall +Signed-off-by: Peter Zijlstra +Cc: pjt@google.com +Link: http://lkml.kernel.org/r/20131016181632.22647.84174.stgit@sword-of-the-dawn.mtv.corp.google.com +Signed-off-by: Ingo Molnar +Cc: Chris J Arges +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched/debug.c | 8 ++++++++ + kernel/sched/fair.c | 2 ++ + 2 files changed, 10 insertions(+) + +--- a/kernel/sched/debug.c ++++ b/kernel/sched/debug.c +@@ -225,6 +225,14 @@ void print_cfs_rq(struct seq_file *m, in + atomic_read(&cfs_rq->tg->runnable_avg)); + #endif + #endif ++#ifdef CONFIG_CFS_BANDWIDTH ++ SEQ_printf(m, " .%-30s: %d\n", "tg->cfs_bandwidth.timer_active", ++ cfs_rq->tg->cfs_bandwidth.timer_active); ++ SEQ_printf(m, " .%-30s: %d\n", "throttled", ++ cfs_rq->throttled); ++ SEQ_printf(m, " .%-30s: %d\n", "throttle_count", ++ cfs_rq->throttle_count); ++#endif + + #ifdef CONFIG_FAIR_GROUP_SCHED + print_cfs_group_stats(m, cpu, cfs_rq->tg); +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -2335,6 +2335,8 @@ static void throttle_cfs_rq(struct cfs_r + cfs_rq->throttled_clock = rq_clock(rq); + raw_spin_lock(&cfs_b->lock); + list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq); ++ if (!cfs_b->timer_active) ++ __start_cfs_bandwidth(cfs_b); + raw_spin_unlock(&cfs_b->lock); + } + diff --git a/queue-3.12/series b/queue-3.12/series index 76804203a0d..90ce802d505 100644 --- a/queue-3.12/series +++ b/queue-3.12/series @@ -90,3 +90,10 @@ dm-thin-switch-to-read-only-mode-if-metadata-space-is-exhausted.patch dm-thin-always-fallback-the-pool-mode-if-commit-fails.patch dm-thin-re-establish-read-only-state-when-switching-to-fail-mode.patch dm-thin-allow-pool-in-read-only-mode-to-transition-to-read-write-mode.patch +vfs-split-out-vfs_getattr_nosec.patch +exportfs-fix-32-bit-nfsd-handling-of-64-bit-inode-numbers.patch +hid-kye-add-report-fixup-for-genius-manticore-keyboard.patch +hid-kye-fix-missing-break-in-kye_report_fixup.patch +nfs-fix-do_div-warning-by-instead-using-sector_div.patch +cxd2820r_core-fix-sparse-warnings.patch +sched-avoid-throttle_cfs_rq-racing-with-period_timer-stopping.patch diff --git a/queue-3.12/vfs-split-out-vfs_getattr_nosec.patch b/queue-3.12/vfs-split-out-vfs_getattr_nosec.patch new file mode 100644 index 00000000000..7ccdd16544e --- /dev/null +++ b/queue-3.12/vfs-split-out-vfs_getattr_nosec.patch @@ -0,0 +1,80 @@ +From b7a6ec52dd4eced4a9bcda9ca85b3c8af84d3c90 Mon Sep 17 00:00:00 2001 +From: "J. Bruce Fields" +Date: Wed, 2 Oct 2013 17:01:18 -0400 +Subject: vfs: split out vfs_getattr_nosec + +From: "J. Bruce Fields" + +commit b7a6ec52dd4eced4a9bcda9ca85b3c8af84d3c90 upstream. + +The filehandle lookup code wants this version of getattr. + +Reviewed-by: Christoph Hellwig +Signed-off-by: J. Bruce Fields +Signed-off-by: Al Viro +Signed-off-by: Greg Kroah-Hartman + +--- + fs/stat.c | 31 +++++++++++++++++++++++++------ + include/linux/fs.h | 1 + + 2 files changed, 26 insertions(+), 6 deletions(-) + +--- a/fs/stat.c ++++ b/fs/stat.c +@@ -37,14 +37,21 @@ void generic_fillattr(struct inode *inod + + EXPORT_SYMBOL(generic_fillattr); + +-int vfs_getattr(struct path *path, struct kstat *stat) ++/** ++ * vfs_getattr_nosec - getattr without security checks ++ * @path: file to get attributes from ++ * @stat: structure to return attributes in ++ * ++ * Get attributes without calling security_inode_getattr. ++ * ++ * Currently the only caller other than vfs_getattr is internal to the ++ * filehandle lookup code, which uses only the inode number and returns ++ * no attributes to any user. Any other code probably wants ++ * vfs_getattr. ++ */ ++int vfs_getattr_nosec(struct path *path, struct kstat *stat) + { + struct inode *inode = path->dentry->d_inode; +- int retval; +- +- retval = security_inode_getattr(path->mnt, path->dentry); +- if (retval) +- return retval; + + if (inode->i_op->getattr) + return inode->i_op->getattr(path->mnt, path->dentry, stat); +@@ -53,6 +60,18 @@ int vfs_getattr(struct path *path, struc + return 0; + } + ++EXPORT_SYMBOL(vfs_getattr_nosec); ++ ++int vfs_getattr(struct path *path, struct kstat *stat) ++{ ++ int retval; ++ ++ retval = security_inode_getattr(path->mnt, path->dentry); ++ if (retval) ++ return retval; ++ return vfs_getattr_nosec(path, stat); ++} ++ + EXPORT_SYMBOL(vfs_getattr); + + int vfs_fstat(unsigned int fd, struct kstat *stat) +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -2504,6 +2504,7 @@ extern int page_symlink(struct inode *in + extern const struct inode_operations page_symlink_inode_operations; + extern int generic_readlink(struct dentry *, char __user *, int); + extern void generic_fillattr(struct inode *, struct kstat *); ++int vfs_getattr_nosec(struct path *path, struct kstat *stat); + extern int vfs_getattr(struct path *, struct kstat *); + void __inode_add_bytes(struct inode *inode, loff_t bytes); + void inode_add_bytes(struct inode *inode, loff_t bytes);