Commit a16435af authored by Ingo Molnar's avatar Ingo Molnar

[PATCH] thread-flock-2.5.38-A3

Ulrich found another small detail wrt. POSIX requirements for threads -
this time it's the recursion features (read-held lock being write-locked
means an upgrade if the same 'process' is the owner, means a deadlock if a
different 'process').

this requirement even makes some sense - the group of threads who own a
lock really own all rights to the lock as well.

These changes fix this, all testcases pass now.  (inter-process
testcases as well, which are not affected by this patch.)

(SIGURG and SIGIO semantics should also continue to work - there's some
more stuff we can optimize with the new pidhash in this area, but that's
for later.)
parent 86b18ae3
...@@ -252,7 +252,7 @@ static int flock_make_lock(struct file *filp, ...@@ -252,7 +252,7 @@ static int flock_make_lock(struct file *filp,
return -ENOMEM; return -ENOMEM;
fl->fl_file = filp; fl->fl_file = filp;
fl->fl_pid = current->pid; fl->fl_pid = current->tgid;
fl->fl_flags = (cmd & LOCK_NB) ? FL_FLOCK : FL_FLOCK | FL_SLEEP; fl->fl_flags = (cmd & LOCK_NB) ? FL_FLOCK : FL_FLOCK | FL_SLEEP;
fl->fl_type = type; fl->fl_type = type;
fl->fl_end = OFFSET_MAX; fl->fl_end = OFFSET_MAX;
...@@ -308,7 +308,7 @@ static int flock_to_posix_lock(struct file *filp, struct file_lock *fl, ...@@ -308,7 +308,7 @@ static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
fl->fl_end = OFFSET_MAX; fl->fl_end = OFFSET_MAX;
fl->fl_owner = current->files; fl->fl_owner = current->files;
fl->fl_pid = current->pid; fl->fl_pid = current->tgid;
fl->fl_file = filp; fl->fl_file = filp;
fl->fl_flags = FL_POSIX; fl->fl_flags = FL_POSIX;
fl->fl_notify = NULL; fl->fl_notify = NULL;
...@@ -348,7 +348,7 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl, ...@@ -348,7 +348,7 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
fl->fl_end = OFFSET_MAX; fl->fl_end = OFFSET_MAX;
fl->fl_owner = current->files; fl->fl_owner = current->files;
fl->fl_pid = current->pid; fl->fl_pid = current->tgid;
fl->fl_file = filp; fl->fl_file = filp;
fl->fl_flags = FL_POSIX; fl->fl_flags = FL_POSIX;
fl->fl_notify = NULL; fl->fl_notify = NULL;
...@@ -377,7 +377,7 @@ static int lease_alloc(struct file *filp, int type, struct file_lock **flp) ...@@ -377,7 +377,7 @@ static int lease_alloc(struct file *filp, int type, struct file_lock **flp)
return -ENOMEM; return -ENOMEM;
fl->fl_owner = current->files; fl->fl_owner = current->files;
fl->fl_pid = current->pid; fl->fl_pid = current->tgid;
fl->fl_file = filp; fl->fl_file = filp;
fl->fl_flags = FL_LEASE; fl->fl_flags = FL_LEASE;
...@@ -669,7 +669,7 @@ int locks_mandatory_area(int read_write, struct inode *inode, ...@@ -669,7 +669,7 @@ int locks_mandatory_area(int read_write, struct inode *inode,
int error; int error;
fl.fl_owner = current->files; fl.fl_owner = current->files;
fl.fl_pid = current->pid; fl.fl_pid = current->tgid;
fl.fl_file = filp; fl.fl_file = filp;
fl.fl_flags = FL_POSIX | FL_ACCESS | FL_SLEEP; fl.fl_flags = FL_POSIX | FL_ACCESS | FL_SLEEP;
fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK; fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
...@@ -1241,7 +1241,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) ...@@ -1241,7 +1241,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
*before = fl; *before = fl;
list_add(&fl->fl_link, &file_lock_list); list_add(&fl->fl_link, &file_lock_list);
error = f_setown(filp, current->pid, 1); error = f_setown(filp, current->tgid, 1);
out_unlock: out_unlock:
unlock_kernel(); unlock_kernel();
return error; return error;
...@@ -1632,7 +1632,7 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner) ...@@ -1632,7 +1632,7 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner)
lock.fl_start = 0; lock.fl_start = 0;
lock.fl_end = OFFSET_MAX; lock.fl_end = OFFSET_MAX;
lock.fl_owner = owner; lock.fl_owner = owner;
lock.fl_pid = current->pid; lock.fl_pid = current->tgid;
lock.fl_file = filp; lock.fl_file = filp;
if (filp->f_op && filp->f_op->lock != NULL) { if (filp->f_op && filp->f_op->lock != NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment