mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-17 06:48:07 +00:00
7df8fc578b
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
69 lines
1.9 KiB
Diff
69 lines
1.9 KiB
Diff
From 4dd3f846325bf16e5b2d976dce42da7f722ade1f Mon Sep 17 00:00:00 2001
|
|
From: Anton Blanchard <anton@samba.org>
|
|
Date: Fri, 16 Mar 2012 10:28:19 +0000
|
|
Subject: [PATCH 03/10] afs: Remote abort can cause BUG in rxrpc code
|
|
|
|
commit c0173863528a8c9212c53e080d63a1aaae5ef4f4 upstream.
|
|
|
|
When writing files to afs I sometimes hit a BUG:
|
|
|
|
kernel BUG at fs/afs/rxrpc.c:179!
|
|
|
|
With a backtrace of:
|
|
|
|
afs_free_call
|
|
afs_make_call
|
|
afs_fs_store_data
|
|
afs_vnode_store_data
|
|
afs_write_back_from_locked_page
|
|
afs_writepages_region
|
|
afs_writepages
|
|
|
|
The cause is:
|
|
|
|
ASSERT(skb_queue_empty(&call->rx_queue));
|
|
|
|
Looking at a tcpdump of the session the abort happens because we
|
|
are exceeding our disk quota:
|
|
|
|
rx abort fs reply store-data error diskquota exceeded (32)
|
|
|
|
So the abort error is valid. We hit the BUG because we haven't
|
|
freed all the resources for the call.
|
|
|
|
By freeing any skbs in call->rx_queue before calling afs_free_call
|
|
we avoid hitting leaking memory and avoid hitting the BUG.
|
|
|
|
Signed-off-by: Anton Blanchard <anton@samba.org>
|
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
fs/afs/rxrpc.c | 3 +++
|
|
1 file changed, 3 insertions(+)
|
|
|
|
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
|
|
index e45a323..8ad8c2a 100644
|
|
--- a/fs/afs/rxrpc.c
|
|
+++ b/fs/afs/rxrpc.c
|
|
@@ -314,6 +314,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
|
|
struct msghdr msg;
|
|
struct kvec iov[1];
|
|
int ret;
|
|
+ struct sk_buff *skb;
|
|
|
|
_enter("%x,{%d},", addr->s_addr, ntohs(call->port));
|
|
|
|
@@ -380,6 +381,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
|
|
|
|
error_do_abort:
|
|
rxrpc_kernel_abort_call(rxcall, RX_USER_ABORT);
|
|
+ while ((skb = skb_dequeue(&call->rx_queue)))
|
|
+ afs_free_skb(skb);
|
|
rxrpc_kernel_end_call(rxcall);
|
|
call->rxcall = NULL;
|
|
error_kill_call:
|
|
--
|
|
1.7.9.4
|
|
|