Merge branch 'devel' into next
This commit is contained in:
+16
-7
@@ -14,6 +14,7 @@
|
||||
#include <linux/sunrpc/svc.h>
|
||||
#include <linux/lockd/lockd.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/kthread.h>
|
||||
|
||||
#define NLMDBG_FACILITY NLMDBG_CLIENT
|
||||
|
||||
@@ -60,7 +61,7 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init)
|
||||
|
||||
host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen,
|
||||
nlm_init->protocol, nlm_version,
|
||||
nlm_init->hostname);
|
||||
nlm_init->hostname, nlm_init->noresvport);
|
||||
if (host == NULL) {
|
||||
lockd_down();
|
||||
return ERR_PTR(-ENOLCK);
|
||||
@@ -191,11 +192,15 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock)
|
||||
void
|
||||
nlmclnt_recovery(struct nlm_host *host)
|
||||
{
|
||||
struct task_struct *task;
|
||||
|
||||
if (!host->h_reclaiming++) {
|
||||
nlm_get_host(host);
|
||||
__module_get(THIS_MODULE);
|
||||
if (kernel_thread(reclaimer, host, CLONE_FS | CLONE_FILES) < 0)
|
||||
module_put(THIS_MODULE);
|
||||
task = kthread_run(reclaimer, host, "%s-reclaim", host->h_name);
|
||||
if (IS_ERR(task))
|
||||
printk(KERN_ERR "lockd: unable to spawn reclaimer "
|
||||
"thread. Locks for %s won't be reclaimed! "
|
||||
"(%ld)\n", host->h_name, PTR_ERR(task));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +212,6 @@ reclaimer(void *ptr)
|
||||
struct file_lock *fl, *next;
|
||||
u32 nsmstate;
|
||||
|
||||
daemonize("%s-reclaim", host->h_name);
|
||||
allow_signal(SIGKILL);
|
||||
|
||||
down_write(&host->h_rwsem);
|
||||
@@ -233,7 +237,12 @@ restart:
|
||||
list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) {
|
||||
list_del_init(&fl->fl_u.nfs_fl.list);
|
||||
|
||||
/* Why are we leaking memory here? --okir */
|
||||
/*
|
||||
* sending this thread a SIGKILL will result in any unreclaimed
|
||||
* locks being removed from the h_granted list. This means that
|
||||
* the kernel will not attempt to reclaim them again if a new
|
||||
* reclaimer thread is spawned for this host.
|
||||
*/
|
||||
if (signalled())
|
||||
continue;
|
||||
if (nlmclnt_reclaim(host, fl) != 0)
|
||||
@@ -261,5 +270,5 @@ restart:
|
||||
nlm_release_host(host);
|
||||
lockd_down();
|
||||
unlock_kernel();
|
||||
module_put_and_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+9
-1
@@ -48,6 +48,7 @@ struct nlm_lookup_host_info {
|
||||
const size_t hostname_len; /* it's length */
|
||||
const struct sockaddr *src_sap; /* our address (optional) */
|
||||
const size_t src_len; /* it's length */
|
||||
const int noresvport; /* use non-priv port */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -222,6 +223,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
|
||||
host->h_nsmstate = 0; /* real NSM state */
|
||||
host->h_nsmhandle = nsm;
|
||||
host->h_server = ni->server;
|
||||
host->h_noresvport = ni->noresvport;
|
||||
hlist_add_head(&host->h_hash, chain);
|
||||
INIT_LIST_HEAD(&host->h_lockowners);
|
||||
spin_lock_init(&host->h_lock);
|
||||
@@ -272,6 +274,7 @@ nlm_destroy_host(struct nlm_host *host)
|
||||
* @protocol: transport protocol to use
|
||||
* @version: NLM protocol version
|
||||
* @hostname: '\0'-terminated hostname of server
|
||||
* @noresvport: 1 if non-privileged port should be used
|
||||
*
|
||||
* Returns an nlm_host structure that matches the passed-in
|
||||
* [server address, transport protocol, NLM version, server hostname].
|
||||
@@ -281,7 +284,9 @@ nlm_destroy_host(struct nlm_host *host)
|
||||
struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
||||
const size_t salen,
|
||||
const unsigned short protocol,
|
||||
const u32 version, const char *hostname)
|
||||
const u32 version,
|
||||
const char *hostname,
|
||||
int noresvport)
|
||||
{
|
||||
const struct sockaddr source = {
|
||||
.sa_family = AF_UNSPEC,
|
||||
@@ -296,6 +301,7 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
||||
.hostname_len = strlen(hostname),
|
||||
.src_sap = &source,
|
||||
.src_len = sizeof(source),
|
||||
.noresvport = noresvport,
|
||||
};
|
||||
|
||||
dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__,
|
||||
@@ -417,6 +423,8 @@ nlm_bind_host(struct nlm_host *host)
|
||||
*/
|
||||
if (!host->h_server)
|
||||
args.flags |= RPC_CLNT_CREATE_HARDRTRY;
|
||||
if (host->h_noresvport)
|
||||
args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
|
||||
|
||||
clnt = rpc_create(&args);
|
||||
if (!IS_ERR(clnt))
|
||||
|
||||
+3
-3
@@ -45,7 +45,7 @@
|
||||
static struct svc_program nlmsvc_program;
|
||||
|
||||
struct nlmsvc_binding * nlmsvc_ops;
|
||||
EXPORT_SYMBOL(nlmsvc_ops);
|
||||
EXPORT_SYMBOL_GPL(nlmsvc_ops);
|
||||
|
||||
static DEFINE_MUTEX(nlmsvc_mutex);
|
||||
static unsigned int nlmsvc_users;
|
||||
@@ -300,7 +300,7 @@ out:
|
||||
mutex_unlock(&nlmsvc_mutex);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL(lockd_up);
|
||||
EXPORT_SYMBOL_GPL(lockd_up);
|
||||
|
||||
/*
|
||||
* Decrement the user count and bring down lockd if we're the last.
|
||||
@@ -329,7 +329,7 @@ lockd_down(void)
|
||||
out:
|
||||
mutex_unlock(&nlmsvc_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(lockd_down);
|
||||
EXPORT_SYMBOL_GPL(lockd_down);
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
||||
|
||||
Reference in New Issue
Block a user