diff options
Diffstat (limited to 'fs/lockd/clntproc.c')
-rw-r--r-- | fs/lockd/clntproc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index 0116729cec5f..3d84f600b633 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c | |||
@@ -36,14 +36,14 @@ static const struct rpc_call_ops nlmclnt_cancel_ops; | |||
36 | /* | 36 | /* |
37 | * Cookie counter for NLM requests | 37 | * Cookie counter for NLM requests |
38 | */ | 38 | */ |
39 | static u32 nlm_cookie = 0x1234; | 39 | static atomic_t nlm_cookie = ATOMIC_INIT(0x1234); |
40 | 40 | ||
41 | static inline void nlmclnt_next_cookie(struct nlm_cookie *c) | 41 | void nlmclnt_next_cookie(struct nlm_cookie *c) |
42 | { | 42 | { |
43 | memcpy(c->data, &nlm_cookie, 4); | 43 | u32 cookie = atomic_inc_return(&nlm_cookie); |
44 | memset(c->data+4, 0, 4); | 44 | |
45 | memcpy(c->data, &cookie, 4); | ||
45 | c->len=4; | 46 | c->len=4; |
46 | nlm_cookie++; | ||
47 | } | 47 | } |
48 | 48 | ||
49 | static struct nlm_lockowner *nlm_get_lockowner(struct nlm_lockowner *lockowner) | 49 | static struct nlm_lockowner *nlm_get_lockowner(struct nlm_lockowner *lockowner) |
@@ -153,6 +153,7 @@ nlmclnt_proc(struct inode *inode, int cmd, struct file_lock *fl) | |||
153 | { | 153 | { |
154 | struct rpc_clnt *client = NFS_CLIENT(inode); | 154 | struct rpc_clnt *client = NFS_CLIENT(inode); |
155 | struct sockaddr_in addr; | 155 | struct sockaddr_in addr; |
156 | struct nfs_server *nfssrv = NFS_SERVER(inode); | ||
156 | struct nlm_host *host; | 157 | struct nlm_host *host; |
157 | struct nlm_rqst *call; | 158 | struct nlm_rqst *call; |
158 | sigset_t oldset; | 159 | sigset_t oldset; |
@@ -166,7 +167,9 @@ nlmclnt_proc(struct inode *inode, int cmd, struct file_lock *fl) | |||
166 | } | 167 | } |
167 | 168 | ||
168 | rpc_peeraddr(client, (struct sockaddr *) &addr, sizeof(addr)); | 169 | rpc_peeraddr(client, (struct sockaddr *) &addr, sizeof(addr)); |
169 | host = nlmclnt_lookup_host(&addr, client->cl_xprt->prot, vers); | 170 | host = nlmclnt_lookup_host(&addr, client->cl_xprt->prot, vers, |
171 | nfssrv->nfs_client->cl_hostname, | ||
172 | strlen(nfssrv->nfs_client->cl_hostname)); | ||
170 | if (host == NULL) | 173 | if (host == NULL) |
171 | return -ENOLCK; | 174 | return -ENOLCK; |
172 | 175 | ||
@@ -499,7 +502,7 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl) | |||
499 | unsigned char fl_flags = fl->fl_flags; | 502 | unsigned char fl_flags = fl->fl_flags; |
500 | int status = -ENOLCK; | 503 | int status = -ENOLCK; |
501 | 504 | ||
502 | if (!host->h_monitored && nsm_monitor(host) < 0) { | 505 | if (nsm_monitor(host) < 0) { |
503 | printk(KERN_NOTICE "lockd: failed to monitor %s\n", | 506 | printk(KERN_NOTICE "lockd: failed to monitor %s\n", |
504 | host->h_name); | 507 | host->h_name); |
505 | goto out; | 508 | goto out; |