/* Remove a lock. This implies a CANCEL call: We send a GRANT_MSG, the client replies with a GRANT_RES call which gets lost, and calls UNLOCK immediately afterwards. In this case the block will still be there, and hence must be removed.  */
__be32 nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock)
/* Remove a lock. This implies a CANCEL call: We send a GRANT_MSG, the client replies with a GRANT_RES call which gets lost, and calls UNLOCK immediately afterwards. In this case the block will still be there, and hence must be removed.  */
__be32 nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock)
{
	int	error;
	dprintk("lockd: nlmsvc_unlock(%s/%ld, pi=%d, %Ld-%Ld)\n",
				file->f_file->f_path.dentry->d_inode->i_sb->s_id,
				file->f_file->f_path.dentry->d_inode->i_ino,
				lock->fl.fl_pid,
				(long long)lock->fl.fl_start,
				(long long)lock->fl.fl_end);
	nlmsvc_cancel_blocked(file, lock);
	lock->fl.fl_type = F_UNLCK;
	error = vfs_lock_file(file->f_file, F_SETLK, &lock->fl, NULL);
	return (error < 0)? nlm_lck_denied_nolocks : nlm_granted;
}