kern_lockf.c (1960) | kern_lockf.c (3098) |
---|---|
1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Scooter Morris at Genentech Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)ufs_lockf.c 8.3 (Berkeley) 1/6/94 | 1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Scooter Morris at Genentech Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)ufs_lockf.c 8.3 (Berkeley) 1/6/94 |
37 * $Id: ufs_lockf.c,v 1.2 1994/08/02 07:54:57 davidg Exp $ | 37 * $Id: kern_lockf.c,v 1.1 1994/08/08 17:30:48 davidg Exp $ |
38 */ 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/file.h> 44#include <sys/proc.h> 45#include <sys/vnode.h> --- 131 unchanged lines hidden (view full) --- 177 */ 178 priority = PLOCK; 179 if (lock->lf_type == F_WRLCK) 180 priority += 4; 181 priority |= PCATCH; 182 /* 183 * Scan lock list for this file looking for locks that would block us. 184 */ | 38 */ 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/file.h> 44#include <sys/proc.h> 45#include <sys/vnode.h> --- 131 unchanged lines hidden (view full) --- 177 */ 178 priority = PLOCK; 179 if (lock->lf_type == F_WRLCK) 180 priority += 4; 181 priority |= PCATCH; 182 /* 183 * Scan lock list for this file looking for locks that would block us. 184 */ |
185 while (block = lf_getblock(lock)) { | 185 while ((block = lf_getblock(lock))) { |
186 /* 187 * Free the structure and return if nonblocking. 188 */ 189 if ((lock->lf_flags & F_WAIT) == 0) { 190 FREE(lock, M_LOCKF); 191 return (EAGAIN); 192 } 193 /* --- 47 unchanged lines hidden (view full) --- 241 lock->lf_next = block; 242 lf_addblock(block, lock); 243#ifdef LOCKF_DEBUG 244 if (lockf_debug & 1) { 245 lf_print("lf_setlock: blocking on", block); 246 lf_printlist("lf_setlock", block); 247 } 248#endif /* LOCKF_DEBUG */ | 186 /* 187 * Free the structure and return if nonblocking. 188 */ 189 if ((lock->lf_flags & F_WAIT) == 0) { 190 FREE(lock, M_LOCKF); 191 return (EAGAIN); 192 } 193 /* --- 47 unchanged lines hidden (view full) --- 241 lock->lf_next = block; 242 lf_addblock(block, lock); 243#ifdef LOCKF_DEBUG 244 if (lockf_debug & 1) { 245 lf_print("lf_setlock: blocking on", block); 246 lf_printlist("lf_setlock", block); 247 } 248#endif /* LOCKF_DEBUG */ |
249 if (error = tsleep((caddr_t)lock, priority, lockstr, 0)) { | 249 if ((error = tsleep((caddr_t)lock, priority, lockstr, 0))) { |
250 /* 251 * Delete ourselves from the waiting to lock list. 252 */ 253 for (block = lock->lf_next; 254 block != NOLOCKF; 255 block = block->lf_block) { 256 if (block->lf_block != lock) 257 continue; --- 18 unchanged lines hidden (view full) --- 276 * 277 * Skip over locks owned by other processes. 278 * Handle any locks that overlap and are owned by ourselves. 279 */ 280 prev = head; 281 block = *head; 282 needtolink = 1; 283 for (;;) { | 250 /* 251 * Delete ourselves from the waiting to lock list. 252 */ 253 for (block = lock->lf_next; 254 block != NOLOCKF; 255 block = block->lf_block) { 256 if (block->lf_block != lock) 257 continue; --- 18 unchanged lines hidden (view full) --- 276 * 277 * Skip over locks owned by other processes. 278 * Handle any locks that overlap and are owned by ourselves. 279 */ 280 prev = head; 281 block = *head; 282 needtolink = 1; 283 for (;;) { |
284 if (ovcase = lf_findoverlap(block, lock, SELF, &prev, &overlap)) | 284 ovcase = lf_findoverlap(block, lock, SELF, &prev, &overlap); 285 if (ovcase) |
285 block = overlap->lf_next; 286 /* 287 * Six cases: 288 * 0) no overlap 289 * 1) overlap == lock 290 * 2) overlap contains lock 291 * 3) lock contains overlap 292 * 4) overlap starts before lock --- 118 unchanged lines hidden (view full) --- 411 return (0); 412#ifdef LOCKF_DEBUG 413 if (unlock->lf_type != F_UNLCK) 414 panic("lf_clearlock: bad type"); 415 if (lockf_debug & 1) 416 lf_print("lf_clearlock", unlock); 417#endif /* LOCKF_DEBUG */ 418 prev = head; | 286 block = overlap->lf_next; 287 /* 288 * Six cases: 289 * 0) no overlap 290 * 1) overlap == lock 291 * 2) overlap contains lock 292 * 3) lock contains overlap 293 * 4) overlap starts before lock --- 118 unchanged lines hidden (view full) --- 412 return (0); 413#ifdef LOCKF_DEBUG 414 if (unlock->lf_type != F_UNLCK) 415 panic("lf_clearlock: bad type"); 416 if (lockf_debug & 1) 417 lf_print("lf_clearlock", unlock); 418#endif /* LOCKF_DEBUG */ 419 prev = head; |
419 while (ovcase = lf_findoverlap(lf, unlock, SELF, &prev, &overlap)) { | 420 while ((ovcase = lf_findoverlap(lf, unlock, SELF, &prev, &overlap))) { |
420 /* 421 * Wakeup the list of locks to be retried. 422 */ 423 lf_wakelock(overlap); 424 425 switch (ovcase) { 426 427 case 1: /* overlap == lock */ --- 46 unchanged lines hidden (view full) --- 474{ 475 register struct lockf *block; 476 477#ifdef LOCKF_DEBUG 478 if (lockf_debug & 1) 479 lf_print("lf_getlock", lock); 480#endif /* LOCKF_DEBUG */ 481 | 421 /* 422 * Wakeup the list of locks to be retried. 423 */ 424 lf_wakelock(overlap); 425 426 switch (ovcase) { 427 428 case 1: /* overlap == lock */ --- 46 unchanged lines hidden (view full) --- 475{ 476 register struct lockf *block; 477 478#ifdef LOCKF_DEBUG 479 if (lockf_debug & 1) 480 lf_print("lf_getlock", lock); 481#endif /* LOCKF_DEBUG */ 482 |
482 if (block = lf_getblock(lock)) { | 483 if ((block = lf_getblock(lock))) { |
483 fl->l_type = block->lf_type; 484 fl->l_whence = SEEK_SET; 485 fl->l_start = block->lf_start; 486 if (block->lf_end == -1) 487 fl->l_len = 0; 488 else 489 fl->l_len = block->lf_end - block->lf_start + 1; 490 if (block->lf_flags & F_POSIX) --- 13 unchanged lines hidden (view full) --- 504struct lockf * 505lf_getblock(lock) 506 register struct lockf *lock; 507{ 508 struct lockf **prev, *overlap, *lf = *(lock->lf_head); 509 int ovcase; 510 511 prev = lock->lf_head; | 484 fl->l_type = block->lf_type; 485 fl->l_whence = SEEK_SET; 486 fl->l_start = block->lf_start; 487 if (block->lf_end == -1) 488 fl->l_len = 0; 489 else 490 fl->l_len = block->lf_end - block->lf_start + 1; 491 if (block->lf_flags & F_POSIX) --- 13 unchanged lines hidden (view full) --- 505struct lockf * 506lf_getblock(lock) 507 register struct lockf *lock; 508{ 509 struct lockf **prev, *overlap, *lf = *(lock->lf_head); 510 int ovcase; 511 512 prev = lock->lf_head; |
512 while (ovcase = lf_findoverlap(lf, lock, OTHERS, &prev, &overlap)) { | 513 while ((ovcase = lf_findoverlap(lf, lock, OTHERS, &prev, &overlap))) { |
513 /* 514 * We've found an overlap, see if it blocks us 515 */ 516 if ((lock->lf_type == F_WRLCK || overlap->lf_type == F_WRLCK)) 517 return (overlap); 518 /* 519 * Nope, point to the next one on the list and 520 * see if it blocks us --- 277 unchanged lines hidden --- | 514 /* 515 * We've found an overlap, see if it blocks us 516 */ 517 if ((lock->lf_type == F_WRLCK || overlap->lf_type == F_WRLCK)) 518 return (overlap); 519 /* 520 * Nope, point to the next one on the list and 521 * see if it blocks us --- 277 unchanged lines hidden --- |