Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 322b2b90 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

Revert "NFS: add nfs_sb_deactive_async to avoid deadlock"



This reverts commit 324d003b.

The deadlock turned out to be caused by a workqueue limitation that has
now been worked around in the RPC code (see comment in rpc_free_task).

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 77102893
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -694,10 +694,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
	if (ctx->cred != NULL)
		put_rpccred(ctx->cred);
	dput(ctx->dentry);
	if (is_sync)
	nfs_sb_deactive(sb);
	else
		nfs_sb_deactive_async(sb);
	kfree(ctx->mdsthreshold);
	kfree(ctx);
}
+0 −1
Original line number Diff line number Diff line
@@ -329,7 +329,6 @@ extern int __init register_nfs_fs(void);
extern void __exit unregister_nfs_fs(void);
extern void nfs_sb_active(struct super_block *sb);
extern void nfs_sb_deactive(struct super_block *sb);
extern void nfs_sb_deactive_async(struct super_block *sb);

/* namespace.c */
#define NFS_PATH_CANONICAL 1
+1 −1
Original line number Diff line number Diff line
@@ -2088,7 +2088,7 @@ static void nfs4_free_closedata(void *data)
	nfs4_put_open_state(calldata->state);
	nfs_free_seqid(calldata->arg.seqid);
	nfs4_put_state_owner(sp);
	nfs_sb_deactive_async(sb);
	nfs_sb_deactive(sb);
	kfree(calldata);
}

+0 −49
Original line number Diff line number Diff line
@@ -54,7 +54,6 @@
#include <linux/parser.h>
#include <linux/nsproxy.h>
#include <linux/rcupdate.h>
#include <linux/kthread.h>

#include <asm/uaccess.h>

@@ -418,54 +417,6 @@ void nfs_sb_deactive(struct super_block *sb)
}
EXPORT_SYMBOL_GPL(nfs_sb_deactive);

static int nfs_deactivate_super_async_work(void *ptr)
{
	struct super_block *sb = ptr;

	deactivate_super(sb);
	module_put_and_exit(0);
	return 0;
}

/*
 * same effect as deactivate_super, but will do final unmount in kthread
 * context
 */
static void nfs_deactivate_super_async(struct super_block *sb)
{
	struct task_struct *task;
	char buf[INET6_ADDRSTRLEN + 1];
	struct nfs_server *server = NFS_SB(sb);
	struct nfs_client *clp = server->nfs_client;

	if (!atomic_add_unless(&sb->s_active, -1, 1)) {
		rcu_read_lock();
		snprintf(buf, sizeof(buf),
			rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR));
		rcu_read_unlock();

		__module_get(THIS_MODULE);
		task = kthread_run(nfs_deactivate_super_async_work, sb,
				"%s-deactivate-super", buf);
		if (IS_ERR(task)) {
			pr_err("%s: kthread_run: %ld\n",
				__func__, PTR_ERR(task));
			/* make synchronous call and hope for the best */
			deactivate_super(sb);
			module_put(THIS_MODULE);
		}
	}
}

void nfs_sb_deactive_async(struct super_block *sb)
{
	struct nfs_server *server = NFS_SB(sb);

	if (atomic_dec_and_test(&server->active))
		nfs_deactivate_super_async(sb);
}
EXPORT_SYMBOL_GPL(nfs_sb_deactive_async);

/*
 * Deliver file system statistics to userspace
 */
+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ static void nfs_async_unlink_release(void *calldata)

	nfs_dec_sillycount(data->dir);
	nfs_free_unlinkdata(data);
	nfs_sb_deactive_async(sb);
	nfs_sb_deactive(sb);
}

static void nfs_unlink_prepare(struct rpc_task *task, void *calldata)