diff options
author | Koen Vandeputte <koen.vandeputte@ncentric.com> | 2018-07-31 13:30:14 +0200 |
---|---|---|
committer | Koen Vandeputte <koen.vandeputte@ncentric.com> | 2018-08-01 09:46:59 +0200 |
commit | fec8fe806963c96a6506c2aebc3572d3a11f285f (patch) | |
tree | 6797f955dba6a4608325c2611e34fe3cf894ea0a /target/linux/generic/backport-4.9 | |
parent | d0e0b7049f88774e67c3d5ad6b573f7070e5f900 (diff) | |
download | upstream-fec8fe806963c96a6506c2aebc3572d3a11f285f.tar.gz upstream-fec8fe806963c96a6506c2aebc3572d3a11f285f.tar.bz2 upstream-fec8fe806963c96a6506c2aebc3572d3a11f285f.zip |
kernel: bump 4.9 to 4.9.116
Refreshed all patches
Remove upstreamed patches.
- 103-MIPS-ath79-fix-register-address-in-ath79_ddr_wb_flus.patch
- 403-mtd_fix_cfi_cmdset_0002_status_check.patch
- 001-4.11-01-mtd-m25p80-consider-max-message-size-in-m25p80_read.patch
- 001-4.15-08-bcm63xx_enet-correct-clock-usage.patch
- 001-4.15-09-bcm63xx_enet-do-not-write-to-random-DMA-channel-on-B.patch
- 900-gen_stats-fix-netlink-stats-padding.patch
Introduce a new backported patch to address ext4 breakage, introduced in 4.9.112
- backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch
This patch has been slightly altered to compensate for a new helper function
introduced in later kernels.
Also add ARM64_SSBD symbol to ARM64 targets still running kernel 4.9
Compile-tested on: ar71xx, bcm2710
Runtime-tested on: ar71xx
Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
Diffstat (limited to 'target/linux/generic/backport-4.9')
15 files changed, 98 insertions, 33 deletions
diff --git a/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch b/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch index 0511a92eeb..ccc7232751 100644 --- a/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch +++ b/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch @@ -84,7 +84,7 @@ Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h -@@ -315,3 +315,28 @@ +@@ -334,3 +334,28 @@ * code */ #define uninitialized_var(x) x = x diff --git a/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch b/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch index 7bf4fd47d2..172e714c5d 100644 --- a/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch +++ b/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch @@ -45,7 +45,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> return (struct tcp_sock *)sk; --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -784,10 +784,10 @@ static void tcp_tasklet_func(unsigned lo +@@ -789,10 +789,10 @@ static void tcp_tasklet_func(unsigned lo } } @@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> /** * tcp_release_cb - tcp release_sock() callback * @sk: socket -@@ -808,7 +808,7 @@ void tcp_release_cb(struct sock *sk) +@@ -813,7 +813,7 @@ void tcp_release_cb(struct sock *sk) nflags = flags & ~TCP_DEFERRED_ALL; } while (cmpxchg(&tp->tsq_flags, flags, nflags) != flags); @@ -69,7 +69,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> tcp_tsq_handler(sk); /* Here begins the tricky part : -@@ -822,15 +822,15 @@ void tcp_release_cb(struct sock *sk) +@@ -827,15 +827,15 @@ void tcp_release_cb(struct sock *sk) */ sock_release_ownership(sk); diff --git a/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch b/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch index 914be607e7..af194b2bed 100644 --- a/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch +++ b/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch @@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -860,6 +860,7 @@ void tcp_wfree(struct sk_buff *skb) +@@ -865,6 +865,7 @@ void tcp_wfree(struct sk_buff *skb) { struct sock *sk = skb->sk; struct tcp_sock *tp = tcp_sk(sk); @@ -25,7 +25,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> int wmem; /* Keep one reference on sk_wmem_alloc. -@@ -877,11 +878,17 @@ void tcp_wfree(struct sk_buff *skb) +@@ -882,11 +883,17 @@ void tcp_wfree(struct sk_buff *skb) if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current) goto out; diff --git a/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch b/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch index f5004d3ffc..b9b3c55076 100644 --- a/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch +++ b/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch @@ -22,7 +22,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -767,19 +767,19 @@ static void tcp_tasklet_func(unsigned lo +@@ -772,19 +772,19 @@ static void tcp_tasklet_func(unsigned lo list_for_each_safe(q, n, &list) { tp = list_entry(q, struct tcp_sock, tsq_node); list_del(&tp->tsq_node); @@ -51,7 +51,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> sk_free(sk); } } -@@ -884,7 +884,7 @@ void tcp_wfree(struct sk_buff *skb) +@@ -889,7 +889,7 @@ void tcp_wfree(struct sk_buff *skb) if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED)) goto out; @@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> nval = cmpxchg(&tp->tsq_flags, oval, nval); if (nval != oval) continue; -@@ -2210,6 +2210,8 @@ static bool tcp_write_xmit(struct sock * +@@ -2222,6 +2222,8 @@ static bool tcp_write_xmit(struct sock * unlikely(tso_fragment(sk, skb, limit, mss_now, gfp))) break; diff --git a/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch b/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch index a25cdb5717..87452ac853 100644 --- a/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch +++ b/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch @@ -16,7 +16,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -880,6 +880,7 @@ void tcp_wfree(struct sk_buff *skb) +@@ -885,6 +885,7 @@ void tcp_wfree(struct sk_buff *skb) for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) { struct tsq_tasklet *tsq; @@ -24,7 +24,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED)) goto out; -@@ -892,8 +893,10 @@ void tcp_wfree(struct sk_buff *skb) +@@ -897,8 +898,10 @@ void tcp_wfree(struct sk_buff *skb) /* queue this socket to tasklet queue */ local_irq_save(flags); tsq = this_cpu_ptr(&tsq_tasklet); diff --git a/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch b/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch index 65013b6aa7..d04e365f98 100644 --- a/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch +++ b/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch @@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -2115,6 +2115,15 @@ static bool tcp_small_queue_check(struct +@@ -2127,6 +2127,15 @@ static bool tcp_small_queue_check(struct limit <<= factor; if (atomic_read(&sk->sk_wmem_alloc) > limit) { diff --git a/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch b/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch index 6f2d196687..2a6cd40c8a 100644 --- a/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch +++ b/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch @@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -1948,26 +1948,26 @@ static bool tcp_can_coalesce_send_queue_ +@@ -1960,26 +1960,26 @@ static bool tcp_can_coalesce_send_queue_ */ static int tcp_mtu_probe(struct sock *sk) { diff --git a/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch b/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch index 292b381f8d..0a5b9ead9d 100644 --- a/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch +++ b/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch @@ -58,7 +58,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> goto out; --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -767,14 +767,15 @@ static void tcp_tasklet_func(unsigned lo +@@ -772,14 +772,15 @@ static void tcp_tasklet_func(unsigned lo list_for_each_safe(q, n, &list) { tp = list_entry(q, struct tcp_sock, tsq_node); list_del(&tp->tsq_node); @@ -77,7 +77,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> tcp_tsq_handler(sk); } bh_unlock_sock(sk); -@@ -797,16 +798,15 @@ static void tcp_tasklet_func(unsigned lo +@@ -802,16 +803,15 @@ static void tcp_tasklet_func(unsigned lo */ void tcp_release_cb(struct sock *sk) { @@ -96,7 +96,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> if (flags & TCPF_TSQ_DEFERRED) tcp_tsq_handler(sk); -@@ -878,7 +878,7 @@ void tcp_wfree(struct sk_buff *skb) +@@ -883,7 +883,7 @@ void tcp_wfree(struct sk_buff *skb) if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current) goto out; @@ -105,7 +105,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> struct tsq_tasklet *tsq; bool empty; -@@ -886,7 +886,7 @@ void tcp_wfree(struct sk_buff *skb) +@@ -891,7 +891,7 @@ void tcp_wfree(struct sk_buff *skb) goto out; nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | TCPF_TSQ_DEFERRED; @@ -114,7 +114,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> if (nval != oval) continue; -@@ -2124,7 +2124,7 @@ static bool tcp_small_queue_check(struct +@@ -2136,7 +2136,7 @@ static bool tcp_small_queue_check(struct skb->prev == sk->sk_write_queue.next) return false; @@ -123,7 +123,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> /* It is possible TX completion already happened * before we set TSQ_THROTTLED, so we must * test again the condition. -@@ -2222,8 +2222,8 @@ static bool tcp_write_xmit(struct sock * +@@ -2234,8 +2234,8 @@ static bool tcp_write_xmit(struct sock * unlikely(tso_fragment(sk, skb, limit, mss_now, gfp))) break; @@ -134,7 +134,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> if (tcp_small_queue_check(sk, skb, 0)) break; -@@ -3534,8 +3534,6 @@ void tcp_send_ack(struct sock *sk) +@@ -3546,8 +3546,6 @@ void __tcp_send_ack(struct sock *sk, u32 /* We do not want pure acks influencing TCP Small Queues or fq/pacing * too much. * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784 diff --git a/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch b/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch index d2b8de6a04..bd74303266 100644 --- a/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch +++ b/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch @@ -30,7 +30,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -769,6 +769,7 @@ static void tcp_tasklet_func(unsigned lo +@@ -774,6 +774,7 @@ static void tcp_tasklet_func(unsigned lo list_del(&tp->tsq_node); sk = (struct sock *)tp; diff --git a/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch b/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch index 33593194d5..be3140bb9c 100644 --- a/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch +++ b/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch @@ -65,7 +65,7 @@ Cc: Kir Kolyshkin <kir@openvz.org> * Before updating sk_refcnt, we must commit prior changes to memory --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -1581,7 +1581,7 @@ u32 tcp_tso_autosize(const struct sock * +@@ -1593,7 +1593,7 @@ u32 tcp_tso_autosize(const struct sock * { u32 bytes, segs; @@ -74,7 +74,7 @@ Cc: Kir Kolyshkin <kir@openvz.org> sk->sk_gso_max_size - 1 - MAX_TCP_HEADER); /* Goal is to send at least one packet per ms, -@@ -2111,7 +2111,7 @@ static bool tcp_small_queue_check(struct +@@ -2123,7 +2123,7 @@ static bool tcp_small_queue_check(struct { unsigned int limit; diff --git a/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch b/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch index 84714ce1e1..7a971169bc 100644 --- a/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch +++ b/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch @@ -52,7 +52,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> extern void __free_page_frag(void *addr); --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -3946,6 +3946,20 @@ static struct page *__page_frag_refill(s +@@ -3945,6 +3945,20 @@ static struct page *__page_frag_refill(s return page; } diff --git a/target/linux/generic/backport-4.9/041-mm-rename-__alloc_page_frag-to-page_frag_alloc-and-_.patch b/target/linux/generic/backport-4.9/041-mm-rename-__alloc_page_frag-to-page_frag_alloc-and-_.patch index 896ba415fe..fbd3316016 100644 --- a/target/linux/generic/backport-4.9/041-mm-rename-__alloc_page_frag-to-page_frag_alloc-and-_.patch +++ b/target/linux/generic/backport-4.9/041-mm-rename-__alloc_page_frag-to-page_frag_alloc-and-_.patch @@ -63,7 +63,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> void *napi_alloc_frag(unsigned int fragsz); --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -3960,8 +3960,8 @@ void __page_frag_drain(struct page *page +@@ -3959,8 +3959,8 @@ void __page_frag_drain(struct page *page } EXPORT_SYMBOL(__page_frag_drain); @@ -74,7 +74,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> { unsigned int size = PAGE_SIZE; struct page *page; -@@ -4012,19 +4012,19 @@ refill: +@@ -4011,19 +4011,19 @@ refill: return nc->va + offset; } diff --git a/target/linux/generic/backport-4.9/042-mm-rename-__page_frag-functions-to-__page_frag_cache.patch b/target/linux/generic/backport-4.9/042-mm-rename-__page_frag-functions-to-__page_frag_cache.patch index 117b01d504..64fdc7606c 100644 --- a/target/linux/generic/backport-4.9/042-mm-rename-__page_frag-functions-to-__page_frag_cache.patch +++ b/target/linux/generic/backport-4.9/042-mm-rename-__page_frag-functions-to-__page_frag_cache.patch @@ -33,7 +33,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> extern void page_frag_free(void *addr); --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -3925,8 +3925,8 @@ EXPORT_SYMBOL(free_pages); +@@ -3924,8 +3924,8 @@ EXPORT_SYMBOL(free_pages); * drivers to provide a backing region of memory for use as either an * sk_buff->head, or to be used in the "frags" portion of skb_shared_info. */ @@ -44,7 +44,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> { struct page *page = NULL; gfp_t gfp = gfp_mask; -@@ -3946,19 +3946,20 @@ static struct page *__page_frag_refill(s +@@ -3945,19 +3945,20 @@ static struct page *__page_frag_refill(s return page; } @@ -68,7 +68,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> void *page_frag_alloc(struct page_frag_cache *nc, unsigned int fragsz, gfp_t gfp_mask) -@@ -3969,7 +3970,7 @@ void *page_frag_alloc(struct page_frag_c +@@ -3968,7 +3969,7 @@ void *page_frag_alloc(struct page_frag_c if (unlikely(!nc->va)) { refill: diff --git a/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch b/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch index 5c0388ed0f..00f9339abe 100644 --- a/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch +++ b/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch @@ -214,14 +214,14 @@ Signed-off-by: David S. Miller <davem@davemloft.net> RCANFD_RFCC_RFIE); --- a/drivers/net/can/xilinx_can.c +++ b/drivers/net/can/xilinx_can.c -@@ -726,7 +726,7 @@ static int xcan_rx_poll(struct napi_stru - can_led_event(ndev, CAN_LED_EVENT_RX); +@@ -838,7 +838,7 @@ static int xcan_rx_poll(struct napi_stru + } if (work_done < quota) { - napi_complete(napi); + napi_complete_done(napi, work_done); ier = priv->read_reg(priv, XCAN_IER_OFFSET); - ier |= (XCAN_IXR_RXOK_MASK | XCAN_IXR_RXNEMP_MASK); + ier |= XCAN_IXR_RXNEMP_MASK; priv->write_reg(priv, XCAN_IER_OFFSET, ier); --- a/drivers/net/ethernet/3com/typhoon.c +++ b/drivers/net/ethernet/3com/typhoon.c @@ -1117,7 +1117,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> return work_done; --- a/drivers/net/ethernet/sun/sungem.c +++ b/drivers/net/ethernet/sun/sungem.c -@@ -922,7 +922,7 @@ static int gem_poll(struct napi_struct * +@@ -924,7 +924,7 @@ static int gem_poll(struct napi_struct * gp->status = readl(gp->regs + GREG_STAT); } while (gp->status & GREG_STAT_NAPI); diff --git a/target/linux/generic/backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch b/target/linux/generic/backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch new file mode 100644 index 0000000000..bcb42d638a --- /dev/null +++ b/target/linux/generic/backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch @@ -0,0 +1,65 @@ +From 5012284700775a4e6e3fbe7eac4c543c4874b559 Mon Sep 17 00:00:00 2001 +From: Theodore Ts'o <tytso@mit.edu> +Date: Sat, 28 Jul 2018 08:12:04 -0400 +Subject: [PATCH] ext4: fix check to prevent initializing reserved inodes + +Commit 8844618d8aa7: "ext4: only look at the bg_flags field if it is +valid" will complain if block group zero does not have the +EXT4_BG_INODE_ZEROED flag set. Unfortunately, this is not correct, +since a freshly created file system has this flag cleared. It gets +almost immediately after the file system is mounted read-write --- but +the following somewhat unlikely sequence will end up triggering a +false positive report of a corrupted file system: + + mkfs.ext4 /dev/vdc + mount -o ro /dev/vdc /vdc + mount -o remount,rw /dev/vdc + +Instead, when initializing the inode table for block group zero, test +to make sure that itable_unused count is not too large, since that is +the case that will result in some or all of the reserved inodes +getting cleared. + +This fixes the failures reported by Eric Whiteney when running +generic/230 and generic/231 in the the nojournal test case. + +Fixes: 8844618d8aa7 ("ext4: only look at the bg_flags field if it is valid") +Reported-by: Eric Whitney <enwlinux@gmail.com> +Signed-off-by: Theodore Ts'o <tytso@mit.edu> +--- + fs/ext4/ialloc.c | 5 ++++- + fs/ext4/super.c | 8 +------- + 2 files changed, 5 insertions(+), 8 deletions(-) + +--- a/fs/ext4/ialloc.c ++++ b/fs/ext4/ialloc.c +@@ -1313,7 +1313,10 @@ int ext4_init_inode_table(struct super_b + ext4_itable_unused_count(sb, gdp)), + sbi->s_inodes_per_block); + +- if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group)) { ++ if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group) || ++ ((group == 0) && ((EXT4_INODES_PER_GROUP(sb) - ++ ext4_itable_unused_count(sb, gdp)) < ++ EXT4_FIRST_INO(sb)))) { + ext4_error(sb, "Something is wrong with group %u: " + "used itable blocks: %d; " + "itable unused count: %u", +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -3031,14 +3031,8 @@ static ext4_group_t ext4_has_uninit_itab + if (!gdp) + continue; + +- if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)) +- continue; +- if (group != 0) ++ if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED))) + break; +- ext4_error(sb, "Inode table for bg 0 marked as " +- "needing zeroing"); +- if (sb->s_flags & MS_RDONLY) +- return ngroups; + } + + return group; |