Commit 52306e88 authored by Benjamin Coddington's avatar Benjamin Coddington Committed by Jeff Layton

fs/locks: Use allocation rather than the stack in fcntl_getlk()

Struct file_lock is fairly large, so let's save some space on the stack by
using an allocation for struct file_lock in fcntl_getlk(), just as we do
for fcntl_setlk().
Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
parent 5771a8c0
...@@ -2086,14 +2086,17 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) ...@@ -2086,14 +2086,17 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
*/ */
int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock) int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock)
{ {
struct file_lock file_lock; struct file_lock *fl;
int error; int error;
fl = locks_alloc_lock();
if (fl == NULL)
return -ENOMEM;
error = -EINVAL; error = -EINVAL;
if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK) if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)
goto out; goto out;
error = flock_to_posix_lock(filp, &file_lock, flock); error = flock_to_posix_lock(filp, fl, flock);
if (error) if (error)
goto out; goto out;
...@@ -2103,23 +2106,22 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock) ...@@ -2103,23 +2106,22 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock)
goto out; goto out;
cmd = F_GETLK; cmd = F_GETLK;
file_lock.fl_flags |= FL_OFDLCK; fl->fl_flags |= FL_OFDLCK;
file_lock.fl_owner = filp; fl->fl_owner = filp;
} }
error = vfs_test_lock(filp, &file_lock); error = vfs_test_lock(filp, fl);
if (error) if (error)
goto out; goto out;
flock->l_type = file_lock.fl_type; flock->l_type = fl->fl_type;
if (file_lock.fl_type != F_UNLCK) { if (fl->fl_type != F_UNLCK) {
error = posix_lock_to_flock(flock, &file_lock); error = posix_lock_to_flock(flock, fl);
if (error) if (error)
goto rel_priv; goto out;
} }
rel_priv:
locks_release_private(&file_lock);
out: out:
locks_free_lock(fl);
return error; return error;
} }
...@@ -2298,14 +2300,18 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd, ...@@ -2298,14 +2300,18 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
*/ */
int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock) int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock)
{ {
struct file_lock file_lock; struct file_lock *fl;
int error; int error;
fl = locks_alloc_lock();
if (fl == NULL)
return -ENOMEM;
error = -EINVAL; error = -EINVAL;
if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK) if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)
goto out; goto out;
error = flock64_to_posix_lock(filp, &file_lock, flock); error = flock64_to_posix_lock(filp, fl, flock);
if (error) if (error)
goto out; goto out;
...@@ -2315,20 +2321,20 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock) ...@@ -2315,20 +2321,20 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock)
goto out; goto out;
cmd = F_GETLK64; cmd = F_GETLK64;
file_lock.fl_flags |= FL_OFDLCK; fl->fl_flags |= FL_OFDLCK;
file_lock.fl_owner = filp; fl->fl_owner = filp;
} }
error = vfs_test_lock(filp, &file_lock); error = vfs_test_lock(filp, fl);
if (error) if (error)
goto out; goto out;
flock->l_type = file_lock.fl_type; flock->l_type = fl->fl_type;
if (file_lock.fl_type != F_UNLCK) if (fl->fl_type != F_UNLCK)
posix_lock_to_flock64(flock, &file_lock); posix_lock_to_flock64(flock, fl);
locks_release_private(&file_lock);
out: out:
locks_free_lock(fl);
return error; return error;
} }
......
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