[PATCH] locks: clean up locks_remove_posix()
locks_remove_posix() can use posix_lock_file() instead of doing the lock removal by hand. posix_lock_file() now does exacly the same. The comment about pids no longer applies, posix_lock_file() takes only the owner into account. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu> Cc: Trond Myklebust <trond.myklebust@fys.uio.no> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
39005d022a
commit
ff7b86b820
25
fs/locks.c
25
fs/locks.c
@@ -1896,15 +1896,14 @@ out:
|
|||||||
*/
|
*/
|
||||||
void locks_remove_posix(struct file *filp, fl_owner_t owner)
|
void locks_remove_posix(struct file *filp, fl_owner_t owner)
|
||||||
{
|
{
|
||||||
struct file_lock lock, **before;
|
struct file_lock lock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there are no locks held on this file, we don't need to call
|
* If there are no locks held on this file, we don't need to call
|
||||||
* posix_lock_file(). Another process could be setting a lock on this
|
* posix_lock_file(). Another process could be setting a lock on this
|
||||||
* file at the same time, but we wouldn't remove that lock anyway.
|
* file at the same time, but we wouldn't remove that lock anyway.
|
||||||
*/
|
*/
|
||||||
before = &filp->f_dentry->d_inode->i_flock;
|
if (!filp->f_dentry->d_inode->i_flock)
|
||||||
if (*before == NULL)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lock.fl_type = F_UNLCK;
|
lock.fl_type = F_UNLCK;
|
||||||
@@ -1917,25 +1916,11 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner)
|
|||||||
lock.fl_ops = NULL;
|
lock.fl_ops = NULL;
|
||||||
lock.fl_lmops = NULL;
|
lock.fl_lmops = NULL;
|
||||||
|
|
||||||
if (filp->f_op && filp->f_op->lock != NULL) {
|
if (filp->f_op && filp->f_op->lock != NULL)
|
||||||
filp->f_op->lock(filp, F_SETLK, &lock);
|
filp->f_op->lock(filp, F_SETLK, &lock);
|
||||||
goto out;
|
else
|
||||||
}
|
posix_lock_file(filp, &lock);
|
||||||
|
|
||||||
/* Can't use posix_lock_file here; we need to remove it no matter
|
|
||||||
* which pid we have.
|
|
||||||
*/
|
|
||||||
lock_kernel();
|
|
||||||
while (*before != NULL) {
|
|
||||||
struct file_lock *fl = *before;
|
|
||||||
if (IS_POSIX(fl) && posix_same_owner(fl, &lock)) {
|
|
||||||
locks_delete_lock(before);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
before = &fl->fl_next;
|
|
||||||
}
|
|
||||||
unlock_kernel();
|
|
||||||
out:
|
|
||||||
if (lock.fl_ops && lock.fl_ops->fl_release_private)
|
if (lock.fl_ops && lock.fl_ops->fl_release_private)
|
||||||
lock.fl_ops->fl_release_private(&lock);
|
lock.fl_ops->fl_release_private(&lock);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user