Changelog: * https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.1.4
Signed-off-by: Daniel Golle <[email protected]> --- include/kernel-version.mk | 4 +- ...79-add-gpio-func-register-for-QCA955x-SoC.patch | 2 +- .../813-MIPS-ath79-add-ap147-support.patch | 6 +- .../140-overlayfs_readdir_locking_fix.patch | 148 --------------------- .../generic/patches-4.1/834-ledtrig-libata.patch | 10 +- 5 files changed, 11 insertions(+), 159 deletions(-) delete mode 100644 target/linux/generic/patches-4.1/140-overlayfs_readdir_locking_fix.patch diff --git a/include/kernel-version.mk b/include/kernel-version.mk index e03590f..9f68716 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .19 LINUX_VERSION-4.0 = .9 -LINUX_VERSION-4.1 = .3 +LINUX_VERSION-4.1 = .4 LINUX_KERNEL_MD5SUM-3.18.19 = a143f9421bd8413752609d0d771c2955 LINUX_KERNEL_MD5SUM-4.0.9 = 40fc5f6e2d718e539b45e6601c71985b -LINUX_KERNEL_MD5SUM-4.1.3 = 96c2c77b1c54ba01cfd8fc2d13fbf828 +LINUX_KERNEL_MD5SUM-4.1.4 = 32cb4dd9f14d37bf71bafa6ed368f769 ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) diff --git a/target/linux/ar71xx/patches-4.1/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-4.1/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch index 24ce7d8..23425dc 100644 --- a/target/linux/ar71xx/patches-4.1/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch +++ b/target/linux/ar71xx/patches-4.1/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ath79/gpio.c +++ b/arch/mips/ath79/gpio.c -@@ -185,15 +185,27 @@ void __init ath79_gpio_output_select(uns +@@ -221,15 +221,27 @@ void __init ath79_gpio_output_select(uns { void __iomem *base = ath79_gpio_base; unsigned long flags; diff --git a/target/linux/ar71xx/patches-4.1/813-MIPS-ath79-add-ap147-support.patch b/target/linux/ar71xx/patches-4.1/813-MIPS-ath79-add-ap147-support.patch index 2ca9a1e..ed0d984 100644 --- a/target/linux/ar71xx/patches-4.1/813-MIPS-ath79-add-ap147-support.patch +++ b/target/linux/ar71xx/patches-4.1/813-MIPS-ath79-add-ap147-support.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ath79/Kconfig +++ b/arch/mips/ath79/Kconfig -@@ -118,6 +118,19 @@ config ATH79_MACH_AP143 +@@ -138,6 +138,19 @@ config ATH79_MACH_AP143 Say 'Y' here if you want your kernel to support the Atheros AP143 reference board. @@ -22,7 +22,7 @@ select SOC_AR913X --- a/arch/mips/ath79/Makefile +++ b/arch/mips/ath79/Makefile -@@ -47,6 +47,7 @@ obj-$(CONFIG_ATH79_MACH_AP121) += mach- +@@ -49,6 +49,7 @@ obj-$(CONFIG_ATH79_MACH_AP121) += mach- obj-$(CONFIG_ATH79_MACH_AP132) += mach-ap132.o obj-$(CONFIG_ATH79_MACH_AP136) += mach-ap136.o obj-$(CONFIG_ATH79_MACH_AP143) += mach-ap143.o @@ -32,7 +32,7 @@ obj-$(CONFIG_ATH79_MACH_AP96) += mach-ap96.o --- a/arch/mips/ath79/machtypes.h +++ b/arch/mips/ath79/machtypes.h -@@ -29,6 +29,7 @@ enum ath79_mach_type { +@@ -31,6 +31,7 @@ enum ath79_mach_type { ATH79_MACH_AP136_010, /* Atheros AP136-010 reference board */ ATH79_MACH_AP136_020, /* Atheros AP136-020 reference board */ ATH79_MACH_AP143, /* Atheros AP143 reference board */ diff --git a/target/linux/generic/patches-4.1/140-overlayfs_readdir_locking_fix.patch b/target/linux/generic/patches-4.1/140-overlayfs_readdir_locking_fix.patch deleted file mode 100644 index 67dff98..0000000 --- a/target/linux/generic/patches-4.1/140-overlayfs_readdir_locking_fix.patch +++ /dev/null @@ -1,148 +0,0 @@ -Patch by: Miklos Szeredi <[email protected]> - -Some filesystems (e.g. jffs2) lock the same resources for both readdir -and lookup, leading to a deadlock in ovl_cache_entry_new, which is called -from the filldir, and calls lookup itself. - ---- a/fs/overlayfs/readdir.c -+++ b/fs/overlayfs/readdir.c -@@ -23,6 +23,7 @@ struct ovl_cache_entry { - u64 ino; - struct list_head l_node; - struct rb_node node; -+ struct ovl_cache_entry *next_maybe_whiteout; - bool is_whiteout; - char name[]; - }; -@@ -39,7 +40,7 @@ struct ovl_readdir_data { - struct rb_root root; - struct list_head *list; - struct list_head middle; -- struct dentry *dir; -+ struct ovl_cache_entry *first_maybe_whiteout; - int count; - int err; - }; -@@ -79,7 +80,7 @@ static struct ovl_cache_entry *ovl_cache - return NULL; - } - --static struct ovl_cache_entry *ovl_cache_entry_new(struct dentry *dir, -+static struct ovl_cache_entry *ovl_cache_entry_new(struct ovl_readdir_data *rdd, - const char *name, int len, - u64 ino, unsigned int d_type) - { -@@ -98,29 +99,8 @@ static struct ovl_cache_entry *ovl_cache - p->is_whiteout = false; - - if (d_type == DT_CHR) { -- struct dentry *dentry; -- const struct cred *old_cred; -- struct cred *override_cred; -- -- override_cred = prepare_creds(); -- if (!override_cred) { -- kfree(p); -- return NULL; -- } -- -- /* -- * CAP_DAC_OVERRIDE for lookup -- */ -- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); -- old_cred = override_creds(override_cred); -- -- dentry = lookup_one_len(name, dir, len); -- if (!IS_ERR(dentry)) { -- p->is_whiteout = ovl_is_whiteout(dentry); -- dput(dentry); -- } -- revert_creds(old_cred); -- put_cred(override_cred); -+ p->next_maybe_whiteout = rdd->first_maybe_whiteout; -+ rdd->first_maybe_whiteout = p; - } - return p; - } -@@ -148,7 +128,7 @@ static int ovl_cache_entry_add_rb(struct - return 0; - } - -- p = ovl_cache_entry_new(rdd->dir, name, len, ino, d_type); -+ p = ovl_cache_entry_new(rdd, name, len, ino, d_type); - if (p == NULL) - return -ENOMEM; - -@@ -169,7 +149,7 @@ static int ovl_fill_lower(struct ovl_rea - if (p) { - list_move_tail(&p->l_node, &rdd->middle); - } else { -- p = ovl_cache_entry_new(rdd->dir, name, namelen, ino, d_type); -+ p = ovl_cache_entry_new(rdd, name, namelen, ino, d_type); - if (p == NULL) - rdd->err = -ENOMEM; - else -@@ -219,6 +199,43 @@ static int ovl_fill_merge(struct dir_con - return ovl_fill_lower(rdd, name, namelen, offset, ino, d_type); - } - -+static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd) -+{ -+ int err = 0; -+ -+ mutex_lock(&dir->d_inode->i_mutex); -+ while (rdd->first_maybe_whiteout) { -+ struct dentry *dentry; -+ const struct cred *old_cred; -+ struct cred *override_cred; -+ struct ovl_cache_entry *p = rdd->first_maybe_whiteout; -+ -+ rdd->first_maybe_whiteout = p->next_maybe_whiteout; -+ -+ override_cred = prepare_creds(); -+ if (!override_cred) { -+ err = -ENOMEM; -+ break; -+ } -+ /* -+ * CAP_DAC_OVERRIDE for lookup -+ */ -+ cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); -+ old_cred = override_creds(override_cred); -+ -+ dentry = lookup_one_len(p->name, dir, p->len); -+ if (!IS_ERR(dentry)) { -+ p->is_whiteout = ovl_is_whiteout(dentry); -+ dput(dentry); -+ } -+ revert_creds(old_cred); -+ put_cred(override_cred); -+ } -+ mutex_unlock(&dir->d_inode->i_mutex); -+ -+ return err; -+} -+ - static inline int ovl_dir_read(struct path *realpath, - struct ovl_readdir_data *rdd) - { -@@ -229,7 +246,7 @@ static inline int ovl_dir_read(struct pa - if (IS_ERR(realfile)) - return PTR_ERR(realfile); - -- rdd->dir = realpath->dentry; -+ rdd->first_maybe_whiteout = NULL; - rdd->ctx.pos = 0; - do { - rdd->count = 0; -@@ -238,6 +255,10 @@ static inline int ovl_dir_read(struct pa - if (err >= 0) - err = rdd->err; - } while (!err && rdd->count); -+ -+ if (!err && rdd->first_maybe_whiteout) -+ err = ovl_check_whiteouts(realpath->dentry, rdd); -+ - fput(realfile); - - return err; diff --git a/target/linux/generic/patches-4.1/834-ledtrig-libata.patch b/target/linux/generic/patches-4.1/834-ledtrig-libata.patch index 2a0fb07..b794c46 100644 --- a/target/linux/generic/patches-4.1/834-ledtrig-libata.patch +++ b/target/linux/generic/patches-4.1/834-ledtrig-libata.patch @@ -69,7 +69,7 @@ Signed-off-by: Daniel Golle <[email protected]> /** * ata_build_rw_tf - Build ATA taskfile for given read/write request * @tf: Target ATA taskfile -@@ -4774,6 +4787,9 @@ struct ata_queued_cmd *ata_qc_new_init(s +@@ -4789,6 +4802,9 @@ struct ata_queued_cmd *ata_qc_new_init(s if (tag < 0) return NULL; } @@ -79,7 +79,7 @@ Signed-off-by: Daniel Golle <[email protected]> qc = __ata_qc_from_tag(ap, tag); qc->tag = tag; -@@ -5671,6 +5687,9 @@ struct ata_port *ata_port_alloc(struct a +@@ -5686,6 +5702,9 @@ struct ata_port *ata_port_alloc(struct a ap->stats.unhandled_irq = 1; ap->stats.idle_irq = 1; #endif @@ -89,7 +89,7 @@ Signed-off-by: Daniel Golle <[email protected]> ata_sff_port_init(ap); return ap; -@@ -5692,6 +5711,12 @@ static void ata_host_release(struct devi +@@ -5707,6 +5726,12 @@ static void ata_host_release(struct devi kfree(ap->pmp_link); kfree(ap->slave_link); @@ -102,7 +102,7 @@ Signed-off-by: Daniel Golle <[email protected]> kfree(ap); host->ports[i] = NULL; } -@@ -6138,7 +6163,23 @@ int ata_host_register(struct ata_host *h +@@ -6153,7 +6178,23 @@ int ata_host_register(struct ata_host *h host->ports[i]->print_id = atomic_inc_return(&ata_print_id); host->ports[i]->local_port_no = i + 1; } @@ -138,7 +138,7 @@ Signed-off-by: Daniel Golle <[email protected]> /* * Define if arch has non-standard setup. This is a _PCI_ standard -@@ -873,6 +876,12 @@ struct ata_port { +@@ -876,6 +879,12 @@ struct ata_port { #ifdef CONFIG_ATA_ACPI struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ #endif -- 2.5.0 _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
