Commit 16f9ce81 authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner

smb/server: 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-45-c6129007ee8d@kernel.orgReviewed-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 84e286c1
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/falloc.h> #include <linux/falloc.h>
#include <linux/mount.h> #include <linux/mount.h>
#define _NEED_FILE_LOCK_FIELD_MACROS
#include <linux/filelock.h> #include <linux/filelock.h>
#include "glob.h" #include "glob.h"
...@@ -6761,10 +6760,10 @@ struct file_lock *smb_flock_init(struct file *f) ...@@ -6761,10 +6760,10 @@ struct file_lock *smb_flock_init(struct file *f)
locks_init_lock(fl); locks_init_lock(fl);
fl->fl_owner = f; fl->c.flc_owner = f;
fl->fl_pid = current->tgid; fl->c.flc_pid = current->tgid;
fl->fl_file = f; fl->c.flc_file = f;
fl->fl_flags = FL_POSIX; fl->c.flc_flags = FL_POSIX;
fl->fl_ops = NULL; fl->fl_ops = NULL;
fl->fl_lmops = NULL; fl->fl_lmops = NULL;
...@@ -6781,30 +6780,30 @@ static int smb2_set_flock_flags(struct file_lock *flock, int flags) ...@@ -6781,30 +6780,30 @@ static int smb2_set_flock_flags(struct file_lock *flock, int flags)
case SMB2_LOCKFLAG_SHARED: case SMB2_LOCKFLAG_SHARED:
ksmbd_debug(SMB, "received shared request\n"); ksmbd_debug(SMB, "received shared request\n");
cmd = F_SETLKW; cmd = F_SETLKW;
flock->fl_type = F_RDLCK; flock->c.flc_type = F_RDLCK;
flock->fl_flags |= FL_SLEEP; flock->c.flc_flags |= FL_SLEEP;
break; break;
case SMB2_LOCKFLAG_EXCLUSIVE: case SMB2_LOCKFLAG_EXCLUSIVE:
ksmbd_debug(SMB, "received exclusive request\n"); ksmbd_debug(SMB, "received exclusive request\n");
cmd = F_SETLKW; cmd = F_SETLKW;
flock->fl_type = F_WRLCK; flock->c.flc_type = F_WRLCK;
flock->fl_flags |= FL_SLEEP; flock->c.flc_flags |= FL_SLEEP;
break; break;
case SMB2_LOCKFLAG_SHARED | SMB2_LOCKFLAG_FAIL_IMMEDIATELY: case SMB2_LOCKFLAG_SHARED | SMB2_LOCKFLAG_FAIL_IMMEDIATELY:
ksmbd_debug(SMB, ksmbd_debug(SMB,
"received shared & fail immediately request\n"); "received shared & fail immediately request\n");
cmd = F_SETLK; cmd = F_SETLK;
flock->fl_type = F_RDLCK; flock->c.flc_type = F_RDLCK;
break; break;
case SMB2_LOCKFLAG_EXCLUSIVE | SMB2_LOCKFLAG_FAIL_IMMEDIATELY: case SMB2_LOCKFLAG_EXCLUSIVE | SMB2_LOCKFLAG_FAIL_IMMEDIATELY:
ksmbd_debug(SMB, ksmbd_debug(SMB,
"received exclusive & fail immediately request\n"); "received exclusive & fail immediately request\n");
cmd = F_SETLK; cmd = F_SETLK;
flock->fl_type = F_WRLCK; flock->c.flc_type = F_WRLCK;
break; break;
case SMB2_LOCKFLAG_UNLOCK: case SMB2_LOCKFLAG_UNLOCK:
ksmbd_debug(SMB, "received unlock request\n"); ksmbd_debug(SMB, "received unlock request\n");
flock->fl_type = F_UNLCK; flock->c.flc_type = F_UNLCK;
cmd = F_SETLK; cmd = F_SETLK;
break; break;
} }
...@@ -6848,7 +6847,7 @@ static void smb2_remove_blocked_lock(void **argv) ...@@ -6848,7 +6847,7 @@ static void smb2_remove_blocked_lock(void **argv)
static inline bool lock_defer_pending(struct file_lock *fl) static inline bool lock_defer_pending(struct file_lock *fl)
{ {
/* check pending lock waiters */ /* check pending lock waiters */
return waitqueue_active(&fl->fl_wait); return waitqueue_active(&fl->c.flc_wait);
} }
/** /**
...@@ -6939,8 +6938,8 @@ int smb2_lock(struct ksmbd_work *work) ...@@ -6939,8 +6938,8 @@ int smb2_lock(struct ksmbd_work *work)
list_for_each_entry(cmp_lock, &lock_list, llist) { list_for_each_entry(cmp_lock, &lock_list, llist) {
if (cmp_lock->fl->fl_start <= flock->fl_start && if (cmp_lock->fl->fl_start <= flock->fl_start &&
cmp_lock->fl->fl_end >= flock->fl_end) { cmp_lock->fl->fl_end >= flock->fl_end) {
if (cmp_lock->fl->fl_type != F_UNLCK && if (cmp_lock->fl->c.flc_type != F_UNLCK &&
flock->fl_type != F_UNLCK) { flock->c.flc_type != F_UNLCK) {
pr_err("conflict two locks in one request\n"); pr_err("conflict two locks in one request\n");
err = -EINVAL; err = -EINVAL;
locks_free_lock(flock); locks_free_lock(flock);
...@@ -6988,12 +6987,12 @@ int smb2_lock(struct ksmbd_work *work) ...@@ -6988,12 +6987,12 @@ int smb2_lock(struct ksmbd_work *work)
list_for_each_entry(conn, &conn_list, conns_list) { list_for_each_entry(conn, &conn_list, conns_list) {
spin_lock(&conn->llist_lock); spin_lock(&conn->llist_lock);
list_for_each_entry_safe(cmp_lock, tmp2, &conn->lock_list, clist) { list_for_each_entry_safe(cmp_lock, tmp2, &conn->lock_list, clist) {
if (file_inode(cmp_lock->fl->fl_file) != if (file_inode(cmp_lock->fl->c.flc_file) !=
file_inode(smb_lock->fl->fl_file)) file_inode(smb_lock->fl->c.flc_file))
continue; continue;
if (lock_is_unlock(smb_lock->fl)) { if (lock_is_unlock(smb_lock->fl)) {
if (cmp_lock->fl->fl_file == smb_lock->fl->fl_file && if (cmp_lock->fl->c.flc_file == smb_lock->fl->c.flc_file &&
cmp_lock->start == smb_lock->start && cmp_lock->start == smb_lock->start &&
cmp_lock->end == smb_lock->end && cmp_lock->end == smb_lock->end &&
!lock_defer_pending(cmp_lock->fl)) { !lock_defer_pending(cmp_lock->fl)) {
...@@ -7010,7 +7009,7 @@ int smb2_lock(struct ksmbd_work *work) ...@@ -7010,7 +7009,7 @@ int smb2_lock(struct ksmbd_work *work)
continue; continue;
} }
if (cmp_lock->fl->fl_file == smb_lock->fl->fl_file) { if (cmp_lock->fl->c.flc_file == smb_lock->fl->c.flc_file) {
if (smb_lock->flags & SMB2_LOCKFLAG_SHARED) if (smb_lock->flags & SMB2_LOCKFLAG_SHARED)
continue; continue;
} else { } else {
...@@ -7176,7 +7175,7 @@ int smb2_lock(struct ksmbd_work *work) ...@@ -7176,7 +7175,7 @@ int smb2_lock(struct ksmbd_work *work)
struct file_lock *rlock = NULL; struct file_lock *rlock = NULL;
rlock = smb_flock_init(filp); rlock = smb_flock_init(filp);
rlock->fl_type = F_UNLCK; rlock->c.flc_type = F_UNLCK;
rlock->fl_start = smb_lock->start; rlock->fl_start = smb_lock->start;
rlock->fl_end = smb_lock->end; rlock->fl_end = smb_lock->end;
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/fs.h> #include <linux/fs.h>
#define _NEED_FILE_LOCK_FIELD_MACROS
#include <linux/filelock.h> #include <linux/filelock.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
...@@ -349,7 +348,7 @@ static int check_lock_range(struct file *filp, loff_t start, loff_t end, ...@@ -349,7 +348,7 @@ static int check_lock_range(struct file *filp, loff_t start, loff_t end,
} }
} else if (lock_is_write(flock)) { } else if (lock_is_write(flock)) {
/* check owner in lock */ /* check owner in lock */
if (flock->fl_file != filp) { if (flock->c.flc_file != filp) {
error = 1; error = 1;
pr_err("not allow rw access by exclusive lock from other opens\n"); pr_err("not allow rw access by exclusive lock from other opens\n");
goto out; goto out;
...@@ -1838,13 +1837,13 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work, ...@@ -1838,13 +1837,13 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
void ksmbd_vfs_posix_lock_wait(struct file_lock *flock) void ksmbd_vfs_posix_lock_wait(struct file_lock *flock)
{ {
wait_event(flock->fl_wait, !flock->fl_blocker); wait_event(flock->c.flc_wait, !flock->c.flc_blocker);
} }
int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout) int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout)
{ {
return wait_event_interruptible_timeout(flock->fl_wait, return wait_event_interruptible_timeout(flock->c.flc_wait,
!flock->fl_blocker, !flock->c.flc_blocker,
timeout); timeout);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment