mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
File locking changes for v6.0
-----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEES8DXskRxsqGE6vXTAA5oQRlWghUFAmLnshQTHGpsYXl0b25A a2VybmVsLm9yZwAKCRAADmhBGVaCFa1ZEACWzjP9gDRO+b5HuovRofO5gCfi0LNK jQAnUQmFBbV28MuRBr8lzjZFsn52C3nEz/unHpl2NXrg1dErdXmTZIUYkZIoESQl 0hyA2lhdm/pvqfj5t9xwt9lK9xts7G+Q1Q2JsT53QlpGd7q9VOq0CFrFTuIe+HmZ qw9Sy/3rfP/rPALv1OzIlGDdBuslfPuijJJZq0wYx4WupA6vlGGSZXn+LxF2dHW9 Ex/Z+n6o5mzEuPedopBBsCvdMTO2/sVmz33puqM0KBb/gmL47i15o1XXdg1O0cbL 7LxIDOfaIm6gFsznUwrJV54WrL8zISQd/BhXbQOrbE8kmnNii1kfIyJHYx55Sa4X y6TmqVbYERXIwCFquO78Uywt8UgjRjuxG8SRe0AmqsxvIn/IxTjqMn5yaMURCTxA uyOmXHxLss3Jf2LNfd6nnrK5qKpOnPOBAn8I/4UY+eNdJGqesLyKoVPZ9O6K1dr3 +jZJ8Ju4TVs7L3fljq6pHvbhAWivM3JEZmYrv+y8QKSRZBV0XqHagwDGHUaaLe9H 6eHgU5yxCb+fj8EXbwxzKnJkhHXJikd4bbPOaJC+QZEKPCJJMo/pyXmDkCVwhJ73 pjO4W0w6TGmCHinlVX6dkyYrCvWYjWglHyO5BnTY2F0Ub87/59KmepZz4dh81hi+ ZdOIvHoF6uca3A== =wDtt -----END PGP SIGNATURE----- Merge tag 'filelock-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux Pull file locking updates from Jeff Layton: "Just a couple of flock() patches from Kuniyuki Iwashima. The main change is that this moves a file_lock allocation from the slab to the stack" * tag 'filelock-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux: fs/lock: Rearrange ops in flock syscall. fs/lock: Don't allocate file_lock in flock_make_lock().
This commit is contained in:
commit
e6a7cf70a3
77
fs/locks.c
77
fs/locks.c
@ -425,21 +425,9 @@ static inline int flock_translate_cmd(int cmd) {
|
||||
}
|
||||
|
||||
/* Fill in a file_lock structure with an appropriate FLOCK lock. */
|
||||
static struct file_lock *
|
||||
flock_make_lock(struct file *filp, unsigned int cmd, struct file_lock *fl)
|
||||
static void flock_make_lock(struct file *filp, struct file_lock *fl, int type)
|
||||
{
|
||||
int type = flock_translate_cmd(cmd);
|
||||
|
||||
if (type < 0)
|
||||
return ERR_PTR(type);
|
||||
|
||||
if (fl == NULL) {
|
||||
fl = locks_alloc_lock();
|
||||
if (fl == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
} else {
|
||||
locks_init_lock(fl);
|
||||
}
|
||||
locks_init_lock(fl);
|
||||
|
||||
fl->fl_file = filp;
|
||||
fl->fl_owner = filp;
|
||||
@ -447,8 +435,6 @@ flock_make_lock(struct file *filp, unsigned int cmd, struct file_lock *fl)
|
||||
fl->fl_flags = FL_FLOCK;
|
||||
fl->fl_type = type;
|
||||
fl->fl_end = OFFSET_MAX;
|
||||
|
||||
return fl;
|
||||
}
|
||||
|
||||
static int assign_type(struct file_lock *fl, long type)
|
||||
@ -2097,21 +2083,9 @@ EXPORT_SYMBOL(locks_lock_inode_wait);
|
||||
*/
|
||||
SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
struct file_lock *lock;
|
||||
int can_sleep, unlock;
|
||||
int error;
|
||||
|
||||
error = -EBADF;
|
||||
if (!f.file)
|
||||
goto out;
|
||||
|
||||
can_sleep = !(cmd & LOCK_NB);
|
||||
cmd &= ~LOCK_NB;
|
||||
unlock = (cmd == LOCK_UN);
|
||||
|
||||
if (!unlock && !(f.file->f_mode & (FMODE_READ|FMODE_WRITE)))
|
||||
goto out_putf;
|
||||
int can_sleep, error, type;
|
||||
struct file_lock fl;
|
||||
struct fd f;
|
||||
|
||||
/*
|
||||
* LOCK_MAND locks were broken for a long time in that they never
|
||||
@ -2123,36 +2097,41 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
|
||||
*/
|
||||
if (cmd & LOCK_MAND) {
|
||||
pr_warn_once("Attempt to set a LOCK_MAND lock via flock(2). This support has been removed and the request ignored.\n");
|
||||
error = 0;
|
||||
goto out_putf;
|
||||
return 0;
|
||||
}
|
||||
|
||||
lock = flock_make_lock(f.file, cmd, NULL);
|
||||
if (IS_ERR(lock)) {
|
||||
error = PTR_ERR(lock);
|
||||
type = flock_translate_cmd(cmd & ~LOCK_NB);
|
||||
if (type < 0)
|
||||
return type;
|
||||
|
||||
error = -EBADF;
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
return error;
|
||||
|
||||
if (type != F_UNLCK && !(f.file->f_mode & (FMODE_READ | FMODE_WRITE)))
|
||||
goto out_putf;
|
||||
}
|
||||
|
||||
if (can_sleep)
|
||||
lock->fl_flags |= FL_SLEEP;
|
||||
flock_make_lock(f.file, &fl, type);
|
||||
|
||||
error = security_file_lock(f.file, lock->fl_type);
|
||||
error = security_file_lock(f.file, fl.fl_type);
|
||||
if (error)
|
||||
goto out_free;
|
||||
goto out_putf;
|
||||
|
||||
can_sleep = !(cmd & LOCK_NB);
|
||||
if (can_sleep)
|
||||
fl.fl_flags |= FL_SLEEP;
|
||||
|
||||
if (f.file->f_op->flock)
|
||||
error = f.file->f_op->flock(f.file,
|
||||
(can_sleep) ? F_SETLKW : F_SETLK,
|
||||
lock);
|
||||
(can_sleep) ? F_SETLKW : F_SETLK,
|
||||
&fl);
|
||||
else
|
||||
error = locks_lock_file_wait(f.file, lock);
|
||||
|
||||
out_free:
|
||||
locks_free_lock(lock);
|
||||
error = locks_lock_file_wait(f.file, &fl);
|
||||
|
||||
out_putf:
|
||||
fdput(f);
|
||||
out:
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -2614,7 +2593,7 @@ locks_remove_flock(struct file *filp, struct file_lock_context *flctx)
|
||||
if (list_empty(&flctx->flc_flock))
|
||||
return;
|
||||
|
||||
flock_make_lock(filp, LOCK_UN, &fl);
|
||||
flock_make_lock(filp, &fl, F_UNLCK);
|
||||
fl.fl_flags |= FL_CLOSE;
|
||||
|
||||
if (filp->f_op->flock)
|
||||
|
Loading…
Reference in New Issue
Block a user