|
@@ -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)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
cmd = F_GETLK;
|
|
cmd = F_GETLK;
|
|
- file_lock.fl_flags |= FL_OFDLCK;
|
|
|
|
- file_lock.fl_owner = filp;
|
|
|
|
|
|
+ fl->fl_flags |= FL_OFDLCK;
|
|
|
|
+ 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;
|
|
|
|
- if (file_lock.fl_type != F_UNLCK) {
|
|
|
|
- error = posix_lock_to_flock(flock, &file_lock);
|
|
|
|
|
|
+ flock->l_type = fl->fl_type;
|
|
|
|
+ if (fl->fl_type != F_UNLCK) {
|
|
|
|
+ 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 @@ out:
|
|
*/
|
|
*/
|
|
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)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
cmd = F_GETLK64;
|
|
cmd = F_GETLK64;
|
|
- file_lock.fl_flags |= FL_OFDLCK;
|
|
|
|
- file_lock.fl_owner = filp;
|
|
|
|
|
|
+ fl->fl_flags |= FL_OFDLCK;
|
|
|
|
+ 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;
|
|
|
|
- if (file_lock.fl_type != F_UNLCK)
|
|
|
|
- posix_lock_to_flock64(flock, &file_lock);
|
|
|
|
|
|
+ flock->l_type = fl->fl_type;
|
|
|
|
+ if (fl->fl_type != F_UNLCK)
|
|
|
|
+ posix_lock_to_flock64(flock, fl);
|
|
|
|
|
|
- locks_release_private(&file_lock);
|
|
|
|
out:
|
|
out:
|
|
|
|
+ locks_free_lock(fl);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|