All of lore.kernel.org
 help / color / mirror / Atom feed
From: Trond Myklebust <Trond.Myklebust@netapp.com>
To: linux-nfs@vger.kernel.org
Subject: [PATCH 02/30] NFS: Clean up nfs_sb_active/nfs_sb_deactive
Date: Tue, 07 Oct 2008 18:19:52 -0400	[thread overview]
Message-ID: <20081007221952.20945.20813.stgit@localhost.localdomain> (raw)
In-Reply-To: <20081007221952.20945.69529.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>

Instead of causing umount requests to block on server->active_wq while the
asynchronous sillyrename deletes are executing, we can use the sb->s_active
counter to obtain a reference to the super_block, and then release that
reference in nfs_async_unlink_release().

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/client.c           |    1 -
 fs/nfs/internal.h         |    4 ++--
 fs/nfs/super.c            |   24 ++++++++----------------
 fs/nfs/unlink.c           |    5 +++--
 include/linux/nfs_fs_sb.h |    1 -
 5 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 5ee23e7..2accb67 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -850,7 +850,6 @@ static struct nfs_server *nfs_alloc_server(void)
 	INIT_LIST_HEAD(&server->client_link);
 	INIT_LIST_HEAD(&server->master_link);
 
-	init_waitqueue_head(&server->active_wq);
 	atomic_set(&server->active, 0);
 
 	server->io_stats = nfs_alloc_iostats();
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 24241fc..7bcf6ec 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -163,8 +163,8 @@ extern struct rpc_stat nfs_rpcstat;
 
 extern int __init register_nfs_fs(void);
 extern void __exit unregister_nfs_fs(void);
-extern void nfs_sb_active(struct nfs_server *server);
-extern void nfs_sb_deactive(struct nfs_server *server);
+extern void nfs_sb_active(struct super_block *sb);
+extern void nfs_sb_deactive(struct super_block *sb);
 
 /* namespace.c */
 extern char *nfs_path(const char *base,
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index e9b2017..e527fab 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -209,7 +209,6 @@ static int nfs_get_sb(struct file_system_type *, int, const char *, void *, stru
 static int nfs_xdev_get_sb(struct file_system_type *fs_type,
 		int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
 static void nfs_kill_super(struct super_block *);
-static void nfs_put_super(struct super_block *);
 static int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
 
 static struct file_system_type nfs_fs_type = {
@@ -232,7 +231,6 @@ static const struct super_operations nfs_sops = {
 	.alloc_inode	= nfs_alloc_inode,
 	.destroy_inode	= nfs_destroy_inode,
 	.write_inode	= nfs_write_inode,
-	.put_super	= nfs_put_super,
 	.statfs		= nfs_statfs,
 	.clear_inode	= nfs_clear_inode,
 	.umount_begin	= nfs_umount_begin,
@@ -337,26 +335,20 @@ void __exit unregister_nfs_fs(void)
 	unregister_filesystem(&nfs_fs_type);
 }
 
-void nfs_sb_active(struct nfs_server *server)
+void nfs_sb_active(struct super_block *sb)
 {
-	atomic_inc(&server->active);
-}
+	struct nfs_server *server = NFS_SB(sb);
 
-void nfs_sb_deactive(struct nfs_server *server)
-{
-	if (atomic_dec_and_test(&server->active))
-		wake_up(&server->active_wq);
+	if (atomic_inc_return(&server->active) == 1)
+		atomic_inc(&sb->s_active);
 }
 
-static void nfs_put_super(struct super_block *sb)
+void nfs_sb_deactive(struct super_block *sb)
 {
 	struct nfs_server *server = NFS_SB(sb);
-	/*
-	 * Make sure there are no outstanding ops to this server.
-	 * If so, wait for them to finish before allowing the
-	 * unmount to continue.
-	 */
-	wait_event(server->active_wq, atomic_read(&server->active) == 0);
+
+	if (atomic_dec_and_test(&server->active))
+		deactivate_super(sb);
 }
 
 /*
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c
index f089e58..ecc2953 100644
--- a/fs/nfs/unlink.c
+++ b/fs/nfs/unlink.c
@@ -99,7 +99,7 @@ static void nfs_async_unlink_release(void *calldata)
 
 	nfs_dec_sillycount(data->dir);
 	nfs_free_unlinkdata(data);
-	nfs_sb_deactive(NFS_SB(sb));
+	nfs_sb_deactive(sb);
 }
 
 static const struct rpc_call_ops nfs_unlink_ops = {
@@ -118,6 +118,7 @@ static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct n
 		.rpc_message = &msg,
 		.callback_ops = &nfs_unlink_ops,
 		.callback_data = data,
+		.workqueue = nfsiod_workqueue,
 		.flags = RPC_TASK_ASYNC,
 	};
 	struct rpc_task *task;
@@ -149,7 +150,7 @@ static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct n
 		nfs_dec_sillycount(dir);
 		return 0;
 	}
-	nfs_sb_active(NFS_SERVER(dir));
+	nfs_sb_active(dir->i_sb);
 	data->args.fh = NFS_FH(dir);
 	nfs_fattr_init(&data->res.dir_attr);
 
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index c9beacd..4e477ae 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -119,7 +119,6 @@ struct nfs_server {
 	void (*destroy)(struct nfs_server *);
 
 	atomic_t active; /* Keep trace of any activity to this server */
-	wait_queue_head_t active_wq;  /* Wait for any activity to stop  */
 
 	/* mountd-related mount options */
 	struct sockaddr_storage	mountd_address;


  parent reply	other threads:[~2008-10-07 22:32 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-07 22:19 [PATCH 00/30] What's in the NFS queue for 2.6.27 Trond Myklebust
     [not found] ` <20081007221952.20945.69529.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-10-07 22:19   ` [PATCH 01/30] NFS: Fix nfs_file_llseek() Trond Myklebust
2008-10-07 22:19   ` Trond Myklebust [this message]
2008-10-07 22:19   ` [PATCH 12/30] NFS: Allow concurrent inode revalidation Trond Myklebust
2008-10-07 22:19   ` [PATCH 19/30] nfs: authenticated deep mounting Trond Myklebust
2008-10-07 22:19   ` [PATCH 21/30] nfs: replace while loop by for loops in nfs_follow_referral Trond Myklebust
2008-10-07 22:19   ` [PATCH 18/30] NFS: missing nfs_fattr_init in nfs3_proc_getacl and nfs3_proc_setacls (resend #2) Trond Myklebust
2008-10-07 22:19   ` [PATCH 17/30] nfs: remove an obsolete nfs_flock comment Trond Myklebust
2008-10-07 22:19   ` [PATCH 11/30] NFS: Fix up nfs_setattr_update_inode() Trond Myklebust
2008-10-07 22:19   ` [PATCH 05/30] NFS: Add mount options for controlling the lookup cache Trond Myklebust
2008-10-07 22:19   ` [PATCH 14/30] nfs: ERR_PTR is expected on failure from nfs_do_clone_mount Trond Myklebust
2008-10-07 22:19   ` [PATCH 07/30] NFS: Fix the NFS attribute update Trond Myklebust
2008-10-07 22:19   ` [PATCH 16/30] nfs: BUG_ON in nfs_follow_mountpoint Trond Myklebust
2008-10-07 22:19   ` [PATCH 03/30] NFS: Add options for finer control of the lookup cache Trond Myklebust
2008-10-07 22:19   ` [PATCH 08/30] NFS: Fix nfs_post_op_update_inode_force_wcc() Trond Myklebust
2008-10-07 22:19   ` [PATCH 10/30] NFS: Don't clear nfsi->cache_validity in nfs_check_inode_attributes() Trond Myklebust
2008-10-07 22:19   ` [PATCH 13/30] fix fs/nfs/nfsroot.c compilation Trond Myklebust
2008-10-07 22:19   ` [PATCH 04/30] NFS: Don't apply NFS_MOUNT_FLAGMASK to text-based mounts Trond Myklebust
2008-10-07 22:19   ` [PATCH 20/30] nfs: break up nfs_follow_referral Trond Myklebust
2008-10-07 22:19   ` [PATCH 22/30] nfs: prepare to share nfs_set_port Trond Myklebust
2008-10-07 22:19   ` [PATCH 15/30] sunrpc: do not pin sunrpc module in the memory Trond Myklebust
2008-10-07 22:19   ` [PATCH 09/30] NFS: Convert __nfs_revalidate_inode() to use nfs_refresh_inode() Trond Myklebust
2008-10-07 22:19   ` [PATCH 06/30] NFS: Clean up nfs_refresh_inode() and nfs_post_op_update_inode() Trond Myklebust
2008-10-07 22:19   ` [PATCH 23/30] nfs: Fix misparsing of nfsv4 fs_locations attribute Trond Myklebust
2008-10-07 22:19   ` [PATCH 24/30] NFS: remove 8 bytes of padding from struct nfs_fattr on 64 bit builds Trond Myklebust
2008-10-07 22:19   ` [PATCH 26/30] SUNRPC: Fix autobind on cloned rpc clients Trond Myklebust
2008-10-07 22:19   ` [PATCH 28/30] NFS: Client mounts hang when exported directory do not exist Trond Myklebust
2008-10-07 22:19   ` [PATCH 29/30] NFS: Don't use range_cyclic for data integrity syncs Trond Myklebust
2008-10-07 22:19   ` [PATCH 27/30] SUNRPC: Fix a memory leak in rpcb_getport_async Trond Myklebust
2008-10-07 22:19   ` [PATCH 25/30] NFS: SETCLIENTID truncates client ID and netid Trond Myklebust
     [not found]     ` <20081007221954.20945.76616.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-10-08 14:55       ` Chuck Lever
2008-10-08 17:56         ` Trond Myklebust
2008-10-15 15:36           ` Chuck Lever
2008-10-07 22:19   ` [PATCH 30/30] sunrpc: fix oops in rpc_create when the mount namespace is unshared Trond Myklebust
2008-10-08 19:31   ` [PATCH 00/30] What's in the NFS queue for 2.6.27 J. Bruce Fields
2008-10-08 19:37     ` Trond Myklebust
2008-10-08 19:39       ` J. Bruce Fields
2008-10-08 19:38     ` [PATCH 1/5] NFS: fix nfs_parse_ip_address() corner case J. Bruce Fields
2008-10-08 19:38       ` [PATCH 2/5] nfs: break up nfs_follow_referral J. Bruce Fields
2008-10-08 19:38         ` [PATCH 3/5] nfs: replace while loop by for loops in nfs_follow_referral J. Bruce Fields
2008-10-08 19:38           ` [PATCH 4/5] nfs: prepare to share nfs_set_port J. Bruce Fields
2008-10-08 19:38             ` [PATCH 5/5] nfs: Fix misparsing of nfsv4 fs_locations attribute J. Bruce Fields

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20081007221952.20945.20813.stgit@localhost.localdomain \
    --to=trond.myklebust@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.