From patchwork Fri Dec 24 01:32:32 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 431241 X-Patchwork-Delegate: Trond.Myklebust@netapp.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBO1X4vs009587 for ; Fri, 24 Dec 2010 01:33:26 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752640Ab0LXBch (ORCPT ); Thu, 23 Dec 2010 20:32:37 -0500 Received: from mail-iw0-f174.google.com ([209.85.214.174]:60343 "EHLO mail-iw0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752483Ab0LXBcg (ORCPT ); Thu, 23 Dec 2010 20:32:36 -0500 Received: by iwn9 with SMTP id 9so6655796iwn.19 for ; Thu, 23 Dec 2010 17:32:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:subject:to:cc :date:message-id:in-reply-to:references:user-agent:mime-version :content-type:content-transfer-encoding; bh=vpDFEo+yO3LDNi23FJxs6d+46IXFzNsD9LYjuI4M5+o=; b=A+QRQOMJY+tEQhukQnlJgB8OdGew0zIDQlMUSxM6Qfes/kOUgBlw+s1W22he2i5M9E 2lk/mHrgQsLAe9IVTNZHMrD498J89oPtHTgH/KQHrEnDCZiBuPx0OPH/QuVp1GfG+zYS rGykfBZAvDmtMnmeUeMI7zxCHzv9nIv+4fMwM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:subject:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-type:content-transfer-encoding; b=lgnoJuyW2Tq/3POVVgstPuFCAYoIwDiiQ6b5Ae0P2fUlWDxx5ix7mxIoWo3NWbfGnT sVnWxTzdAndOy0FI7cd4aGP21kTg2OgnRH2riQdr3sPlCaucLdq9Exd7OjdChpMDyflS Ix1J3lIDIiHuvJ35WtoeqBy52Nil2stFVaPnY= Received: by 10.42.176.133 with SMTP id be5mr7557260icb.452.1293154356157; Thu, 23 Dec 2010 17:32:36 -0800 (PST) Received: from matisse.1015granger.net ([99.26.161.222]) by mx.google.com with ESMTPS id z4sm7167190ibg.7.2010.12.23.17.32.34 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 23 Dec 2010 17:32:34 -0800 (PST) From: Chuck Lever Subject: [PATCH 1/4] NFS: Allow walking nfs_client.cl_superblocks list outside client.c To: trond.myklebust@netapp.com Cc: linux-nfs@vger.kernel.org Date: Thu, 23 Dec 2010 20:32:32 -0500 Message-ID: <20101224013232.2445.72763.stgit@matisse.1015granger.net> In-Reply-To: <20101224012636.2445.41411.stgit@matisse.1015granger.net> References: <20101224012636.2445.41411.stgit@matisse.1015granger.net> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Fri, 24 Dec 2010 01:33:26 +0000 (UTC) diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 0870d0d..05e2ee2 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -988,6 +988,27 @@ static void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_serve target->options = source->options; } +static void nfs_server_insert_lists(struct nfs_server *server) +{ + struct nfs_client *clp = server->nfs_client; + + spin_lock(&nfs_client_lock); + list_add_tail_rcu(&server->client_link, &clp->cl_superblocks); + list_add_tail(&server->master_link, &nfs_volume_list); + spin_unlock(&nfs_client_lock); + +} + +static void nfs_server_remove_lists(struct nfs_server *server) +{ + spin_lock(&nfs_client_lock); + list_del_rcu(&server->client_link); + list_del(&server->master_link); + spin_unlock(&nfs_client_lock); + + synchronize_rcu(); +} + /* * Allocate and initialise a server record */ @@ -1029,11 +1050,8 @@ void nfs_free_server(struct nfs_server *server) { dprintk("--> nfs_free_server()\n"); + nfs_server_remove_lists(server); unset_pnfs_layoutdriver(server); - spin_lock(&nfs_client_lock); - list_del(&server->client_link); - list_del(&server->master_link); - spin_unlock(&nfs_client_lock); if (server->destroy != NULL) server->destroy(server); @@ -1108,11 +1126,7 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, (unsigned long long) server->fsid.major, (unsigned long long) server->fsid.minor); - spin_lock(&nfs_client_lock); - list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); - list_add_tail(&server->master_link, &nfs_volume_list); - spin_unlock(&nfs_client_lock); - + nfs_server_insert_lists(server); server->mount_time = jiffies; nfs_free_fattr(fattr); return server; @@ -1342,11 +1356,7 @@ static int nfs4_server_common_setup(struct nfs_server *server, if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) server->namelen = NFS4_MAXNAMLEN; - spin_lock(&nfs_client_lock); - list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); - list_add_tail(&server->master_link, &nfs_volume_list); - spin_unlock(&nfs_client_lock); - + nfs_server_insert_lists(server); server->mount_time = jiffies; out: nfs_free_fattr(fattr); @@ -1551,11 +1561,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, if (error < 0) goto out_free_server; - spin_lock(&nfs_client_lock); - list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); - list_add_tail(&server->master_link, &nfs_volume_list); - spin_unlock(&nfs_client_lock); - + nfs_server_insert_lists(server); server->mount_time = jiffies; nfs_free_fattr(fattr_fsinfo); diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index 72b6c58..cde5650 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c @@ -63,9 +63,14 @@ nfs4_renew_state(struct work_struct *work) ops = clp->cl_mvops->state_renewal_ops; dprintk("%s: start\n", __func__); - /* Are there any active superblocks? */ - if (list_empty(&clp->cl_superblocks)) + + rcu_read_lock(); + if (list_empty(&clp->cl_superblocks)) { + rcu_read_unlock(); goto out; + } + rcu_read_unlock(); + spin_lock(&clp->cl_lock); lease = clp->cl_lease_time; last = clp->cl_last_renewal;