diff options
Diffstat (limited to 'fs/locks.c')
| -rw-r--r-- | fs/locks.c | 34 | 
1 files changed, 12 insertions, 22 deletions
diff --git a/fs/locks.c b/fs/locks.c index 82c353304f9e..7e81bfc75164 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -200,11 +200,7 @@ void locks_release_private(struct file_lock *fl)  			fl->fl_ops->fl_release_private(fl);  		fl->fl_ops = NULL;  	} -	if (fl->fl_lmops) { -		if (fl->fl_lmops->lm_release_private) -			fl->fl_lmops->lm_release_private(fl); -		fl->fl_lmops = NULL; -	} +	fl->fl_lmops = NULL;  }  EXPORT_SYMBOL_GPL(locks_release_private); @@ -427,18 +423,8 @@ static void lease_break_callback(struct file_lock *fl)  	kill_fasync(&fl->fl_fasync, SIGIO, POLL_MSG);  } -static void lease_release_private_callback(struct file_lock *fl) -{ -	if (!fl->fl_file) -		return; - -	f_delown(fl->fl_file); -	fl->fl_file->f_owner.signum = 0; -} -  static const struct lock_manager_operations lease_manager_ops = {  	.lm_break = lease_break_callback, -	.lm_release_private = lease_release_private_callback,  	.lm_change = lease_modify,  }; @@ -580,12 +566,6 @@ static void locks_delete_lock(struct file_lock **thisfl_p)  	fl->fl_next = NULL;  	list_del_init(&fl->fl_link); -	fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync); -	if (fl->fl_fasync != NULL) { -		printk(KERN_ERR "locks_delete_lock: fasync == %p\n", fl->fl_fasync); -		fl->fl_fasync = NULL; -	} -  	if (fl->fl_nspid) {  		put_pid(fl->fl_nspid);  		fl->fl_nspid = NULL; @@ -1155,8 +1135,18 @@ int lease_modify(struct file_lock **before, int arg)  		return error;  	lease_clear_pending(fl, arg);  	locks_wake_up_blocks(fl); -	if (arg == F_UNLCK) +	if (arg == F_UNLCK) { +		struct file *filp = fl->fl_file; + +		f_delown(filp); +		filp->f_owner.signum = 0; +		fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync); +		if (fl->fl_fasync != NULL) { +			printk(KERN_ERR "locks_delete_lock: fasync == %p\n", fl->fl_fasync); +			fl->fl_fasync = NULL; +		}  		locks_delete_lock(before); +	}  	return 0;  }  |