diff -u linux-2.5.15-flock/fs/locks.c linux-2.5.15-flock/fs/locks.c
--- linux-2.5.15-flock/fs/locks.c Tue May 21 20:54:35 2002
+++ linux-2.5.15-flock/fs/locks.c Tue May 21 21:45:51 2002
@@ -684,7 +684,7 @@
*/
spin_lock(&file_lock_lock);
for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
- if (!(fl->fl_flags & FL_POSIX))
+ if (!IS_POSIX(fl))
continue;
if (fl->fl_owner != owner)
break;
@@ -697,7 +697,7 @@
struct file *filp, loff_t offset,
size_t count)
{
- struct file_lock *fl;
+ struct file_lock **before;
struct file_lock *new_fl = locks_alloc_lock(0);
int error;
@@ -719,31 +719,33 @@
/* Search the lock list for this inode for locks that conflict with
* the proposed read/write.
*/
- for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
+ for_each_lock(inode, before) {
+ struct file_lock *fl = *before;
if (!IS_POSIX(fl))
continue;
if (fl->fl_start > new_fl->fl_end)
break;
- if (posix_locks_conflict(new_fl, fl)) {
- error = -EAGAIN;
- if (filp && (filp->f_flags & O_NONBLOCK))
- break;
- error = -EDEADLK;
- if (posix_locks_deadlock(new_fl, fl))
- break;
-
- error = locks_block_on(fl, new_fl);
- if (error != 0)
- break;
+ if (!posix_locks_conflict(new_fl, fl))
+ continue;
+
+ error = -EAGAIN;
+ if (filp && (filp->f_flags & O_NONBLOCK))
+ break;
+ error = -EDEADLK;
+ if (posix_locks_deadlock(new_fl, fl))
+ break;
- /*
- * If we've been sleeping someone might have
- * changed the permissions behind our back.
- */
- if ((inode->i_mode & (S_ISGID | S_IXGRP)) != S_ISGID)
- break;
- goto repeat;
- }
+ error = locks_block_on(fl, new_fl);
+ if (error != 0)
+ break;
+
+ /*
+ * If we've been sleeping someone might have
+ * changed the permissions behind our back.
+ */
+ if ((inode->i_mode & (S_ISGID | S_IXGRP)) != S_ISGID)
+ break;
+ goto repeat;
}
spin_unlock(&file_lock_lock);
locks_free_lock(new_fl);
@@ -992,7 +994,7 @@
if (error != 0)
goto out;
flock = inode->i_flock;
- if (!(flock && (flock->fl_flags & FL_LEASE)))
+ if (!(flock && IS_LEASE(flock)))
goto out;
} while (flock->fl_type & F_INPROGRESS);
}
@@ -1017,7 +1019,7 @@
do {
fl->fl_type = future;
fl = fl->fl_next;
- } while (fl != NULL && (fl->fl_flags & FL_LEASE));
+ } while (fl != NULL && IS_LEASE(fl));
kill_fasync(&flock->fl_fasync, SIGIO, POLL_MSG);
@@ -1038,7 +1040,7 @@
printk(KERN_WARNING "lease timed out\n");
} else if (error > 0) {
flock = inode->i_flock;
- if (flock && (flock->fl_flags & FL_LEASE))
+ if (flock && IS_LEASE(flock))
goto restart;
error = 0;
}
@@ -1061,7 +1063,7 @@
time_t lease_get_mtime(struct inode *inode)
{
struct file_lock *flock = inode->i_flock;
- if (flock && (flock->fl_flags & FL_LEASE) && (flock->fl_type & F_WRLCK))
+ if (flock && IS_LEASE(flock) && (flock->fl_type & F_WRLCK))
return CURRENT_TIME;
return inode->i_mtime;
}
@@ -1084,7 +1086,7 @@
struct file_lock *fl;
fl = filp->f_dentry->d_inode->i_flock;
- if ((fl == NULL) || ((fl->fl_flags & FL_LEASE) == 0))
+ if ((fl == NULL) || !IS_LEASE(fl))
return F_UNLCK;
return fl->fl_type & ~F_INPROGRESS;
}
@@ -1149,7 +1151,7 @@
for_each_lock(inode, before) {
struct file_lock *fl = *before;
- if (fl->fl_flags != FL_LEASE)
+ if (!IS_LEASE(fl))
break;
if (fl->fl_file == filp)
my_before = before;
@@ -1349,8 +1351,7 @@
/* Don't allow mandatory locks on files that may be memory mapped
* and shared.
*/
- if (IS_MANDLOCK(inode) &&
- (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
+ if (MANDATORY_LOCK(inode)) {
struct address_space *mapping = inode->i_mapping;
if (!list_empty(&mapping->i_mmap_shared)) {
@@ -1392,12 +1393,12 @@
error = posix_lock_file(filp, file_lock);
if ((error != -EAGAIN) || (cmd == F_SETLK))
break;
- error = wait_event_interruptible(lock->fl_wait, !lock->fl_next);
+ error = wait_event_interruptible(file_lock->fl_wait, !file_lock->fl_next);
if (!error)
continue;
spin_lock(&file_lock_lock);
- locks_delete_block(lock);
+ locks_delete_block(file_lock);
spin_unlock(&file_lock_lock);
break;
}
@@ -1485,8 +1486,7 @@
/* Don't allow mandatory locks on files that may be memory mapped
* and shared.
*/
- if (IS_MANDLOCK(inode) &&
- (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
+ if (MANDATORY_LOCK(inode)) {
struct address_space *mapping = inode->i_mapping;
if (!list_empty(&mapping->i_mmap_shared)) {
@@ -1524,7 +1524,19 @@
if (error < 0)
goto out;
}
- error = posix_lock_file(filp, file_lock);
+ for (;;) {
+ error = posix_lock_file(filp, file_lock);
+ if ((error != -EAGAIN) || (cmd == F_SETLK64))
+ break;
+ error = wait_event_interruptible(file_lock->fl_wait, !file_lock->fl_next);
+ if (!error)
+ continue;
+
+ spin_lock(&file_lock_lock);
+ locks_delete_block(file_lock);
+ spin_unlock(&file_lock_lock);
+ break;
+ }
out:
if (error)
@@ -1615,20 +1627,18 @@
inode = fl->fl_file->f_dentry->d_inode;
out += sprintf(out, "%d:%s ", id, pfx);
- if (fl->fl_flags & FL_POSIX) {
+ if (IS_POSIX(fl)) {
out += sprintf(out, "%6s %s ",
(fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
(inode == NULL) ? "*NOINODE*" :
- (IS_MANDLOCK(inode) &&
- (inode->i_mode & (S_IXGRP | S_ISGID)) == S_ISGID) ?
- "MANDATORY" : "ADVISORY ");
- } else if (fl->fl_flags & FL_FLOCK) {
+ MANDATORY_LOCK(inode) ? "MANDATORY" : "ADVISORY ");
+ } else if (IS_FLOCK(fl)) {
if (fl->fl_type & LOCK_MAND) {
out += sprintf(out, "FLOCK MSNFS ");
} else {
out += sprintf(out, "FLOCK ADVISORY ");
}
- } else if (fl->fl_flags & FL_LEASE) {
+ } else if (IS_LEASE(fl)) {
out += sprintf(out, "LEASE MANDATORY ");
} else {
out += sprintf(out, "UNKNOWN UNKNOWN ");
@@ -1740,12 +1750,12 @@
int result = 1;
spin_lock(&file_lock_lock);
for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
- if (fl->fl_flags == FL_POSIX) {
+ if (IS_POSIX(fl)) {
if (fl->fl_type == F_RDLCK)
continue;
if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
continue;
- } else if (fl->fl_flags == FL_FLOCK) {
+ } else if (IS_FLOCK(fl)) {
if (!(fl->fl_type & LOCK_MAND))
continue;
if (fl->fl_type & LOCK_READ)
@@ -1778,10 +1788,10 @@
int result = 1;
spin_lock(&file_lock_lock);
for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
- if (fl->fl_flags == FL_POSIX) {
+ if (IS_POSIX(fl)) {
if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
continue;
- } else if (fl->fl_flags == FL_FLOCK) {
+ } else if (IS_FLOCK(fl)) {
if (!(fl->fl_type & LOCK_MAND))
continue;
if (fl->fl_type & LOCK_WRITE)