Commit 7723ec97 authored by Marc Eshel's avatar Marc Eshel Committed by J. Bruce Fields
Browse files

locks: factor out generic/filesystem switch from setlock code



Factor out the code that switches between generic and filesystem-specific lock
methods; eventually we want to call this from lock managers (lockd and nfsd)
too; currently they only call the generic methods.

This patch does that for all the setlk code.

Signed-off-by: default avatarMarc Eshel <eshel@almaden.ibm.com>
Signed-off-by: default avatar"J. Bruce Fields" <bfields@citi.umich.edu>
parent 3ee17abd
Loading
Loading
Loading
Loading
+36 −32
Original line number Diff line number Diff line
@@ -1698,6 +1698,21 @@ out:
	return error;
}

/**
 * vfs_lock_file - file byte range lock
 * @filp: The file to apply the lock to
 * @cmd: type of locking operation (F_SETLK, F_GETLK, etc.)
 * @fl: The lock to be applied
 */
int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl)
{
	if (filp->f_op && filp->f_op->lock)
		return filp->f_op->lock(filp, cmd, fl);
	else
		return posix_lock_file(filp, fl);
}
EXPORT_SYMBOL_GPL(vfs_lock_file);

/* Apply the lock described by l to an open file descriptor.
 * This implements both the F_SETLK and F_SETLKW commands of fcntl().
 */
@@ -1760,11 +1775,8 @@ again:
	if (error)
		goto out;

	if (filp->f_op && filp->f_op->lock != NULL)
		error = filp->f_op->lock(filp, cmd, file_lock);
	else {
	for (;;) {
			error = posix_lock_file(filp, file_lock);
		error = vfs_lock_file(filp, cmd, file_lock);
		if (error != -EAGAIN || cmd == F_SETLK)
			break;
		error = wait_event_interruptible(file_lock->fl_wait,
@@ -1775,7 +1787,6 @@ again:
		locks_delete_block(file_lock);
		break;
	}
	}

	/*
	 * Attempt to detect a close/fcntl race and recover by
@@ -1890,11 +1901,8 @@ again:
	if (error)
		goto out;

	if (filp->f_op && filp->f_op->lock != NULL)
		error = filp->f_op->lock(filp, cmd, file_lock);
	else {
	for (;;) {
			error = posix_lock_file(filp, file_lock);
		error = vfs_lock_file(filp, cmd, file_lock);
		if (error != -EAGAIN || cmd == F_SETLK64)
			break;
		error = wait_event_interruptible(file_lock->fl_wait,
@@ -1905,7 +1913,6 @@ again:
		locks_delete_block(file_lock);
		break;
	}
	}

	/*
	 * Attempt to detect a close/fcntl race and recover by
@@ -1949,10 +1956,7 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner)
	lock.fl_ops = NULL;
	lock.fl_lmops = NULL;

	if (filp->f_op && filp->f_op->lock != NULL)
		filp->f_op->lock(filp, F_SETLK, &lock);
	else
		posix_lock_file(filp, &lock);
	vfs_lock_file(filp, F_SETLK, &lock);

	if (lock.fl_ops && lock.fl_ops->fl_release_private)
		lock.fl_ops->fl_release_private(&lock);
+1 −0
Original line number Diff line number Diff line
@@ -857,6 +857,7 @@ extern int posix_lock_file(struct file *, struct file_lock *);
extern int posix_lock_file_wait(struct file *, struct file_lock *);
extern int posix_unblock_lock(struct file *, struct file_lock *);
extern int vfs_test_lock(struct file *, struct file_lock *);
extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *);
extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl);
extern int __break_lease(struct inode *inode, unsigned int flags);
extern void lease_get_mtime(struct inode *, struct timespec *time);