Unverified Commit 82a8cb96 authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner
Browse files

afs: adapt to breakup of struct file_lock



Most of the existing APIs have remained the same, but subsystems that
access file_lock fields directly need to reach into struct
file_lock_core now.

Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Link: https://lore.kernel.org/r/20240131-flsplit-v3-35-c6129007ee8d@kernel.org


Reviewed-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 459c814a
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -121,16 +121,15 @@ static void afs_next_locker(struct afs_vnode *vnode, int error)

	list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) {
		if (error &&
		    p->fl_type == type &&
		    afs_file_key(p->fl_file) == key) {
		    p->c.flc_type == type &&
		    afs_file_key(p->c.flc_file) == key) {
			list_del_init(&p->fl_u.afs.link);
			p->fl_u.afs.state = error;
			locks_wake_up(p);
		}

		/* Select the next locker to hand off to. */
		if (next &&
		    (lock_is_write(next) || lock_is_read(p)))
		if (next && (lock_is_write(next) || lock_is_read(p)))
			continue;
		next = p;
	}
@@ -464,7 +463,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl)

	_enter("{%llx:%llu},%llu-%llu,%u,%u",
	       vnode->fid.vid, vnode->fid.vnode,
	       fl->fl_start, fl->fl_end, fl->fl_type, mode);
	       fl->fl_start, fl->fl_end, fl->c.flc_type, mode);

	fl->fl_ops = &afs_lock_ops;
	INIT_LIST_HEAD(&fl->fl_u.afs.link);
@@ -524,7 +523,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl)
	}

	if (vnode->lock_state == AFS_VNODE_LOCK_NONE &&
	    !(fl->fl_flags & FL_SLEEP)) {
	    !(fl->c.flc_flags & FL_SLEEP)) {
		ret = -EAGAIN;
		if (type == AFS_LOCK_READ) {
			if (vnode->status.lock_count == -1)
@@ -621,7 +620,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl)
	return 0;

lock_is_contended:
	if (!(fl->fl_flags & FL_SLEEP)) {
	if (!(fl->c.flc_flags & FL_SLEEP)) {
		list_del_init(&fl->fl_u.afs.link);
		afs_next_locker(vnode, 0);
		ret = -EAGAIN;
@@ -641,7 +640,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl)
	spin_unlock(&vnode->lock);

	trace_afs_flock_ev(vnode, fl, afs_flock_waiting, 0);
	ret = wait_event_interruptible(fl->fl_wait,
	ret = wait_event_interruptible(fl->c.flc_wait,
				       fl->fl_u.afs.state != AFS_LOCK_PENDING);
	trace_afs_flock_ev(vnode, fl, afs_flock_waited, ret);

@@ -704,7 +703,8 @@ static int afs_do_unlk(struct file *file, struct file_lock *fl)
	struct afs_vnode *vnode = AFS_FS_I(file_inode(file));
	int ret;

	_enter("{%llx:%llu},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type);
	_enter("{%llx:%llu},%u", vnode->fid.vid, vnode->fid.vnode,
	       fl->c.flc_type);

	trace_afs_flock_op(vnode, fl, afs_flock_op_unlock);

@@ -730,7 +730,7 @@ static int afs_do_getlk(struct file *file, struct file_lock *fl)
	if (vnode->lock_state == AFS_VNODE_LOCK_DELETED)
		return -ENOENT;

	fl->fl_type = F_UNLCK;
	fl->c.flc_type = F_UNLCK;

	/* check local lock records first */
	posix_test_lock(file, fl);
@@ -743,18 +743,18 @@ static int afs_do_getlk(struct file *file, struct file_lock *fl)
		lock_count = READ_ONCE(vnode->status.lock_count);
		if (lock_count != 0) {
			if (lock_count > 0)
				fl->fl_type = F_RDLCK;
				fl->c.flc_type = F_RDLCK;
			else
				fl->fl_type = F_WRLCK;
				fl->c.flc_type = F_WRLCK;
			fl->fl_start = 0;
			fl->fl_end = OFFSET_MAX;
			fl->fl_pid = 0;
			fl->c.flc_pid = 0;
		}
	}

	ret = 0;
error:
	_leave(" = %d [%hd]", ret, fl->fl_type);
	_leave(" = %d [%hd]", ret, fl->c.flc_type);
	return ret;
}

@@ -769,7 +769,7 @@ int afs_lock(struct file *file, int cmd, struct file_lock *fl)

	_enter("{%llx:%llu},%d,{t=%x,fl=%x,r=%Ld:%Ld}",
	       vnode->fid.vid, vnode->fid.vnode, cmd,
	       fl->fl_type, fl->fl_flags,
	       fl->c.flc_type, fl->c.flc_flags,
	       (long long) fl->fl_start, (long long) fl->fl_end);

	if (IS_GETLK(cmd))
@@ -804,7 +804,7 @@ int afs_flock(struct file *file, int cmd, struct file_lock *fl)

	_enter("{%llx:%llu},%d,{t=%x,fl=%x}",
	       vnode->fid.vid, vnode->fid.vnode, cmd,
	       fl->fl_type, fl->fl_flags);
	       fl->c.flc_type, fl->c.flc_flags);

	/*
	 * No BSD flocks over NFS allowed.
@@ -813,7 +813,7 @@ int afs_flock(struct file *file, int cmd, struct file_lock *fl)
	 * Not sure whether that would be unique, though, or whether
	 * that would break in other places.
	 */
	if (!(fl->fl_flags & FL_FLOCK))
	if (!(fl->c.flc_flags & FL_FLOCK))
		return -ENOLCK;

	fl->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id);
@@ -843,7 +843,7 @@ int afs_flock(struct file *file, int cmd, struct file_lock *fl)
 */
static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl)
{
	struct afs_vnode *vnode = AFS_FS_I(file_inode(fl->fl_file));
	struct afs_vnode *vnode = AFS_FS_I(file_inode(fl->c.flc_file));

	_enter("");

@@ -861,7 +861,7 @@ static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl)
 */
static void afs_fl_release_private(struct file_lock *fl)
{
	struct afs_vnode *vnode = AFS_FS_I(file_inode(fl->fl_file));
	struct afs_vnode *vnode = AFS_FS_I(file_inode(fl->c.flc_file));

	_enter("");

+0 −1
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@
#include <linux/kernel.h>
#include <linux/ktime.h>
#include <linux/fs.h>
#define _NEED_FILE_LOCK_FIELD_MACROS
#include <linux/filelock.h>
#include <linux/pagemap.h>
#include <linux/rxrpc.h>
+2 −2
Original line number Diff line number Diff line
@@ -1164,8 +1164,8 @@ TRACE_EVENT(afs_flock_op,
		    __entry->from = fl->fl_start;
		    __entry->len = fl->fl_end - fl->fl_start + 1;
		    __entry->op = op;
		    __entry->type = fl->fl_type;
		    __entry->flags = fl->fl_flags;
		    __entry->type = fl->c.flc_type;
		    __entry->flags = fl->c.flc_flags;
		    __entry->debug_id = fl->fl_u.afs.debug_id;
			   ),