From patchwork Thu Dec 23 21:54:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 430861 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 oBNLsBig027304 for ; Thu, 23 Dec 2010 21:54:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751656Ab0LWVyT (ORCPT ); Thu, 23 Dec 2010 16:54:19 -0500 Received: from mail-iy0-f174.google.com ([209.85.210.174]:40784 "EHLO mail-iy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751621Ab0LWVyT (ORCPT ); Thu, 23 Dec 2010 16:54:19 -0500 Received: by iyi12 with SMTP id 12so5352460iyi.19 for ; Thu, 23 Dec 2010 13:54:18 -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=i9PpKuxOyiqYwoLCiOHa1sDpqycZLl5CMrv611rAVj7WdUptjqgwrj3hfMygqDvD8i 1KUbpEIPVaeJXTUb9YTO0IqrzL2ELWQPhdGsU6E9/Mq7On4RW9GD9rVsvQT0lA6M1RWn TqmeuKAmzUELy3qu13H+3OIsd5EDkq8CDtazY= 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=M6fZCAWErKGxLoJysfoaPK9sGihNLTjPoNDPY69mddxUPRk2YB5ugYWku6OPTSll5K vE7Q5AqMTyVxCC8BoYsp45exVHYvqPWN4gvPcKGhan0WrMISxINxpMaBT8oxBf+bDSYU Bibt53TxCs0RoTkpg9CcdH5VsheBZ9M6LgR+s= Received: by 10.42.166.73 with SMTP id n9mr8711533icy.64.1293141258362; Thu, 23 Dec 2010 13:54:18 -0800 (PST) Received: from matisse.1015granger.net (adsl-99-26-161-222.dsl.sfldmi.sbcglobal.net [99.26.161.222]) by mx.google.com with ESMTPS id i16sm7011240ibl.0.2010.12.23.13.54.16 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 23 Dec 2010 13:54:17 -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 16:54:15 -0500 Message-ID: <20101223215415.2344.19433.stgit@matisse.1015granger.net> In-Reply-To: <20101223214503.2344.79300.stgit@matisse.1015granger.net> References: <20101223214503.2344.79300.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]); Thu, 23 Dec 2010 21:54:21 +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;