Return-Path: Received: from mx2.netapp.com ([216.240.18.37]:35709 "EHLO mx2.netapp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753816Ab1C0PzE convert rfc822-to-8bit (ORCPT ); Sun, 27 Mar 2011 11:55:04 -0400 Subject: Re: strange put_rpccred() handling From: Trond Myklebust To: OGAWA Hirofumi Cc: "J. Bruce Fields" , linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org In-Reply-To: <87ei5sppsx.fsf@devron.myhome.or.jp> References: <87ei5sppsx.fsf@devron.myhome.or.jp> Content-Type: text/plain; charset="UTF-8" Date: Sun, 27 Mar 2011 17:55:03 +0200 Message-ID: <1301241303.22136.31.camel@lade.trondhjem.org> Sender: linux-nfs-owner@vger.kernel.org List-ID: MIME-Version: 1.0 On Mon, 2011-03-28 at 00:05 +0900, OGAWA Hirofumi wrote: > Hi, > > BUG: atomic_dec_and_test(): -1: atomic counter underflow at: > Pid: 2827, comm: mount.nfs Not tainted 2.6.38 #1 > Call Trace: > [] ? put_rpccred+0x44/0x14e [sunrpc] > [] ? rpc_ping+0x4e/0x58 [sunrpc] > [] ? rpc_create+0x481/0x4fc [sunrpc] > [] ? rpcauth_lookup_credcache+0xab/0x22d [sunrpc] > [] ? nfs_create_rpc_client+0xa6/0xeb [nfs] > [] ? nfs4_set_client+0xc2/0x1f9 [nfs] > [] ? nfs4_create_server+0xf2/0x2a6 [nfs] > [] ? nfs4_remote_mount+0x4e/0x14a [nfs] > [] ? vfs_kern_mount+0x6e/0x133 > [] ? nfs_do_root_mount+0x76/0x95 [nfs] > [] ? nfs4_try_mount+0x56/0xaf [nfs] > [] ? nfs_get_sb+0x435/0x73c [nfs] > [] ? vfs_kern_mount+0x99/0x133 > [] ? do_kern_mount+0x48/0xd8 > [] ? do_mount+0x6da/0x741 > [] ? sys_mount+0x83/0xc0 > [] ? system_call_fastpath+0x16/0x1b > > This is not oops, and debug code is not in vanilla. This debug code is > simple - detects atomic_dec_and_test() underflow. > > Well, so, I think this is real bug of nfs codes somewhere. With some > review, the code > > rpc_call_sync() > rpc_run_task > rpc_execute() > __rpc_execute() > rpc_release_task() > rpc_release_resources_task() > put_rpccred() <= release cred > rpc_put_task > rpc_do_put_task() > rpc_release_resources_task() > put_rpccred() <= release cred again > > seems to be release cred unintendedly. > > static void rpc_release_resources_task(struct rpc_task *task) > { > if (task->tk_rqstp) > xprt_release(task); > if (task->tk_msg.rpc_cred) { > put_rpccred(task->tk_msg.rpc_cred); > task->tk_msg.rpc_cred = NULL; > } > rpc_task_release_client(task); > } May I add a signed-off-by from you, and just push the above fix to Linus? Cheers Trond -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@netapp.com www.netapp.com