mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
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: Jeff Layton <jlayton@kernel.org> Link: https://lore.kernel.org/r/20240131-flsplit-v3-45-c6129007ee8d@kernel.org Reviewed-by: NeilBrown <neilb@suse.de> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
84e286c1bb
commit
16f9ce8189
@ -12,7 +12,6 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/falloc.h>
|
||||
#include <linux/mount.h>
|
||||
#define _NEED_FILE_LOCK_FIELD_MACROS
|
||||
#include <linux/filelock.h>
|
||||
|
||||
#include "glob.h"
|
||||
@ -6761,10 +6760,10 @@ struct file_lock *smb_flock_init(struct file *f)
|
||||
|
||||
locks_init_lock(fl);
|
||||
|
||||
fl->fl_owner = f;
|
||||
fl->fl_pid = current->tgid;
|
||||
fl->fl_file = f;
|
||||
fl->fl_flags = FL_POSIX;
|
||||
fl->c.flc_owner = f;
|
||||
fl->c.flc_pid = current->tgid;
|
||||
fl->c.flc_file = f;
|
||||
fl->c.flc_flags = FL_POSIX;
|
||||
fl->fl_ops = NULL;
|
||||
fl->fl_lmops = NULL;
|
||||
|
||||
@ -6781,30 +6780,30 @@ static int smb2_set_flock_flags(struct file_lock *flock, int flags)
|
||||
case SMB2_LOCKFLAG_SHARED:
|
||||
ksmbd_debug(SMB, "received shared request\n");
|
||||
cmd = F_SETLKW;
|
||||
flock->fl_type = F_RDLCK;
|
||||
flock->fl_flags |= FL_SLEEP;
|
||||
flock->c.flc_type = F_RDLCK;
|
||||
flock->c.flc_flags |= FL_SLEEP;
|
||||
break;
|
||||
case SMB2_LOCKFLAG_EXCLUSIVE:
|
||||
ksmbd_debug(SMB, "received exclusive request\n");
|
||||
cmd = F_SETLKW;
|
||||
flock->fl_type = F_WRLCK;
|
||||
flock->fl_flags |= FL_SLEEP;
|
||||
flock->c.flc_type = F_WRLCK;
|
||||
flock->c.flc_flags |= FL_SLEEP;
|
||||
break;
|
||||
case SMB2_LOCKFLAG_SHARED | SMB2_LOCKFLAG_FAIL_IMMEDIATELY:
|
||||
ksmbd_debug(SMB,
|
||||
"received shared & fail immediately request\n");
|
||||
cmd = F_SETLK;
|
||||
flock->fl_type = F_RDLCK;
|
||||
flock->c.flc_type = F_RDLCK;
|
||||
break;
|
||||
case SMB2_LOCKFLAG_EXCLUSIVE | SMB2_LOCKFLAG_FAIL_IMMEDIATELY:
|
||||
ksmbd_debug(SMB,
|
||||
"received exclusive & fail immediately request\n");
|
||||
cmd = F_SETLK;
|
||||
flock->fl_type = F_WRLCK;
|
||||
flock->c.flc_type = F_WRLCK;
|
||||
break;
|
||||
case SMB2_LOCKFLAG_UNLOCK:
|
||||
ksmbd_debug(SMB, "received unlock request\n");
|
||||
flock->fl_type = F_UNLCK;
|
||||
flock->c.flc_type = F_UNLCK;
|
||||
cmd = F_SETLK;
|
||||
break;
|
||||
}
|
||||
@ -6848,7 +6847,7 @@ static void smb2_remove_blocked_lock(void **argv)
|
||||
static inline bool lock_defer_pending(struct file_lock *fl)
|
||||
{
|
||||
/* 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)
|
||||
list_for_each_entry(cmp_lock, &lock_list, llist) {
|
||||
if (cmp_lock->fl->fl_start <= flock->fl_start &&
|
||||
cmp_lock->fl->fl_end >= flock->fl_end) {
|
||||
if (cmp_lock->fl->fl_type != F_UNLCK &&
|
||||
flock->fl_type != F_UNLCK) {
|
||||
if (cmp_lock->fl->c.flc_type != F_UNLCK &&
|
||||
flock->c.flc_type != F_UNLCK) {
|
||||
pr_err("conflict two locks in one request\n");
|
||||
err = -EINVAL;
|
||||
locks_free_lock(flock);
|
||||
@ -6988,12 +6987,12 @@ int smb2_lock(struct ksmbd_work *work)
|
||||
list_for_each_entry(conn, &conn_list, conns_list) {
|
||||
spin_lock(&conn->llist_lock);
|
||||
list_for_each_entry_safe(cmp_lock, tmp2, &conn->lock_list, clist) {
|
||||
if (file_inode(cmp_lock->fl->fl_file) !=
|
||||
file_inode(smb_lock->fl->fl_file))
|
||||
if (file_inode(cmp_lock->fl->c.flc_file) !=
|
||||
file_inode(smb_lock->fl->c.flc_file))
|
||||
continue;
|
||||
|
||||
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->end == smb_lock->end &&
|
||||
!lock_defer_pending(cmp_lock->fl)) {
|
||||
@ -7010,7 +7009,7 @@ int smb2_lock(struct ksmbd_work *work)
|
||||
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)
|
||||
continue;
|
||||
} else {
|
||||
@ -7176,7 +7175,7 @@ out:
|
||||
struct file_lock *rlock = NULL;
|
||||
|
||||
rlock = smb_flock_init(filp);
|
||||
rlock->fl_type = F_UNLCK;
|
||||
rlock->c.flc_type = F_UNLCK;
|
||||
rlock->fl_start = smb_lock->start;
|
||||
rlock->fl_end = smb_lock->end;
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#define _NEED_FILE_LOCK_FIELD_MACROS
|
||||
#include <linux/filelock.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/backing-dev.h>
|
||||
@ -349,7 +348,7 @@ static int check_lock_range(struct file *filp, loff_t start, loff_t end,
|
||||
}
|
||||
} else if (lock_is_write(flock)) {
|
||||
/* check owner in lock */
|
||||
if (flock->fl_file != filp) {
|
||||
if (flock->c.flc_file != filp) {
|
||||
error = 1;
|
||||
pr_err("not allow rw access by exclusive lock from other opens\n");
|
||||
goto out;
|
||||
@ -1838,13 +1837,13 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
|
||||
|
||||
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)
|
||||
{
|
||||
return wait_event_interruptible_timeout(flock->fl_wait,
|
||||
!flock->fl_blocker,
|
||||
return wait_event_interruptible_timeout(flock->c.flc_wait,
|
||||
!flock->c.flc_blocker,
|
||||
timeout);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user