patch-2.4.23 linux-2.4.23/fs/lockd/svclock.c
Next file: linux-2.4.23/fs/lockd/svcproc.c
Previous file: linux-2.4.23/fs/lockd/svc4proc.c
Back to the patch index
Back to the overall index
- Lines: 69
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/fs/lockd/svclock.c
- Orig date:
2003-08-25 04:44:43.000000000 -0700
diff -urN linux-2.4.22/fs/lockd/svclock.c linux-2.4.23/fs/lockd/svclock.c
@@ -188,6 +188,11 @@
locks_init_lock(&block->b_call.a_args.lock.fl);
locks_init_lock(&block->b_call.a_res.lock.fl);
+ block->b_host = nlmsvc_lookup_host(rqstp);
+ if (block->b_host == NULL) {
+ goto failed_free;
+ }
+
if (!nlmclnt_setgrantargs(&block->b_call, lock))
goto failed_free;
@@ -199,7 +204,6 @@
/* Create and initialize the block */
block->b_daemon = rqstp->rq_server;
- block->b_host = host;
block->b_file = file;
/* Add to file's list of blocks */
@@ -265,8 +269,7 @@
}
}
- if (block->b_host)
- nlm_release_host(block->b_host);
+ nlm_release_host(block->b_host);
nlmclnt_freegrantargs(&block->b_call);
kfree(block);
}
@@ -314,8 +317,6 @@
(long long)lock->fl.fl_end,
wait);
- /* Lock file against concurrent access */
- down(&file->f_sema);
/* Get existing block (in case client is busy-waiting) */
block = nlmsvc_lookup_block(file, lock, 0);
@@ -323,6 +324,9 @@
lock->fl.fl_flags |= FL_LOCKD;
again:
+ /* Lock file against concurrent access */
+ down(&file->f_sema);
+
if (!(conflock = posix_test_lock(&file->f_file, &lock->fl))) {
error = posix_lock_file(&file->f_file, &lock->fl, 0);
@@ -355,7 +359,10 @@
/* If we don't have a block, create and initialize it. Then
* retry because we may have slept in kmalloc. */
+ /* We have to release f_sema as nlmsvc_create_block may try to
+ * claim it while doing host garbage collection */
if (block == NULL) {
+ up(&file->f_sema);
dprintk("lockd: blocking on this lock (allocating).\n");
if (!(block = nlmsvc_create_block(rqstp, file, lock, cookie)))
return nlm_lck_denied_nolocks;
@@ -515,7 +522,7 @@
* Just retry the grant callback, possibly refreshing the RPC
* binding */
if (block->b_granted) {
- nlm_rebind_host(block->b_host);
+ nlm_rebind_host(block->b_call.a_host);
goto callback;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)