Commit 9d6a8c5c authored by Marc Eshel's avatar Marc Eshel Committed by J. Bruce Fields

locks: give posix_test_lock same interface as ->lock

posix_test_lock() and ->lock() do the same job but have gratuitously
different interfaces.  Modify posix_test_lock() so the two agree,
simplifying some code in the process.
Signed-off-by: default avatarMarc Eshel <eshel@almaden.ibm.com>
Signed-off-by: default avatar"J. Bruce Fields" <bfields@citi.umich.edu>
parent 70cc6487
...@@ -738,8 +738,7 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) ...@@ -738,8 +738,7 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl)
if (cmd == F_GETLK) { if (cmd == F_GETLK) {
if (fc->no_lock) { if (fc->no_lock) {
if (!posix_test_lock(file, fl, fl)) posix_test_lock(file, fl);
fl->fl_type = F_UNLCK;
err = 0; err = 0;
} else } else
err = fuse_getlk(file, fl); err = fuse_getlk(file, fl);
......
...@@ -164,13 +164,7 @@ static void nolock_unhold_lvb(void *lock, char *lvb) ...@@ -164,13 +164,7 @@ static void nolock_unhold_lvb(void *lock, char *lvb)
static int nolock_plock_get(void *lockspace, struct lm_lockname *name, static int nolock_plock_get(void *lockspace, struct lm_lockname *name,
struct file *file, struct file_lock *fl) struct file *file, struct file_lock *fl)
{ {
struct file_lock tmp; posix_test_lock(file, fl);
int ret;
ret = posix_test_lock(file, fl, &tmp);
fl->fl_type = F_UNLCK;
if (ret)
memcpy(fl, &tmp, sizeof(struct file_lock));
return 0; return 0;
} }
......
...@@ -513,12 +513,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) ...@@ -513,12 +513,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl)
if (sdp->sd_args.ar_localflocks) { if (sdp->sd_args.ar_localflocks) {
if (IS_GETLK(cmd)) { if (IS_GETLK(cmd)) {
struct file_lock tmp; posix_test_lock(file, fl);
int ret;
ret = posix_test_lock(file, fl, &tmp);
fl->fl_type = F_UNLCK;
if (ret)
memcpy(fl, &tmp, sizeof(struct file_lock));
return 0; return 0;
} else { } else {
return posix_lock_file_wait(file, fl); return posix_lock_file_wait(file, fl);
......
...@@ -426,15 +426,18 @@ nlmsvc_testlock(struct nlm_file *file, struct nlm_lock *lock, ...@@ -426,15 +426,18 @@ nlmsvc_testlock(struct nlm_file *file, struct nlm_lock *lock,
(long long)lock->fl.fl_start, (long long)lock->fl.fl_start,
(long long)lock->fl.fl_end); (long long)lock->fl.fl_end);
if (posix_test_lock(file->f_file, &lock->fl, &conflock->fl)) { if (posix_test_lock(file->f_file, &lock->fl)) {
dprintk("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n", dprintk("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n",
conflock->fl.fl_type, lock->fl.fl_type,
(long long)conflock->fl.fl_start, (long long)lock->fl.fl_start,
(long long)conflock->fl.fl_end); (long long)lock->fl.fl_end);
conflock->caller = "somehost"; /* FIXME */ conflock->caller = "somehost"; /* FIXME */
conflock->len = strlen(conflock->caller); conflock->len = strlen(conflock->caller);
conflock->oh.len = 0; /* don't return OH info */ conflock->oh.len = 0; /* don't return OH info */
conflock->svid = conflock->fl.fl_pid; conflock->svid = lock->fl.fl_pid;
conflock->fl.fl_type = lock->fl.fl_type;
conflock->fl.fl_start = lock->fl.fl_start;
conflock->fl.fl_end = lock->fl.fl_end;
return nlm_lck_denied; return nlm_lck_denied;
} }
......
...@@ -666,11 +666,11 @@ static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *w ...@@ -666,11 +666,11 @@ static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *w
} }
int int
posix_test_lock(struct file *filp, struct file_lock *fl, posix_test_lock(struct file *filp, struct file_lock *fl)
struct file_lock *conflock)
{ {
struct file_lock *cfl; struct file_lock *cfl;
fl->fl_type = F_UNLCK;
lock_kernel(); lock_kernel();
for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) { for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) {
if (!IS_POSIX(cfl)) if (!IS_POSIX(cfl))
...@@ -679,7 +679,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl, ...@@ -679,7 +679,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl,
break; break;
} }
if (cfl) { if (cfl) {
__locks_copy_lock(conflock, cfl); __locks_copy_lock(fl, cfl);
unlock_kernel(); unlock_kernel();
return 1; return 1;
} }
...@@ -1648,7 +1648,7 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) ...@@ -1648,7 +1648,7 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
*/ */
int fcntl_getlk(struct file *filp, struct flock __user *l) int fcntl_getlk(struct file *filp, struct flock __user *l)
{ {
struct file_lock *fl, cfl, file_lock; struct file_lock file_lock;
struct flock flock; struct flock flock;
int error; int error;
...@@ -1667,15 +1667,12 @@ int fcntl_getlk(struct file *filp, struct flock __user *l) ...@@ -1667,15 +1667,12 @@ int fcntl_getlk(struct file *filp, struct flock __user *l)
error = filp->f_op->lock(filp, F_GETLK, &file_lock); error = filp->f_op->lock(filp, F_GETLK, &file_lock);
if (error < 0) if (error < 0)
goto out; goto out;
else } else
fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock); posix_test_lock(filp, &file_lock);
} else {
fl = (posix_test_lock(filp, &file_lock, &cfl) ? &cfl : NULL);
}
flock.l_type = F_UNLCK; flock.l_type = file_lock.fl_type;
if (fl != NULL) { if (file_lock.fl_type != F_UNLCK) {
error = posix_lock_to_flock(&flock, fl); error = posix_lock_to_flock(&flock, &file_lock);
if (error) if (error)
goto out; goto out;
} }
...@@ -1785,7 +1782,7 @@ out: ...@@ -1785,7 +1782,7 @@ out:
*/ */
int fcntl_getlk64(struct file *filp, struct flock64 __user *l) int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
{ {
struct file_lock *fl, cfl, file_lock; struct file_lock file_lock;
struct flock64 flock; struct flock64 flock;
int error; int error;
...@@ -1804,15 +1801,13 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l) ...@@ -1804,15 +1801,13 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
error = filp->f_op->lock(filp, F_GETLK, &file_lock); error = filp->f_op->lock(filp, F_GETLK, &file_lock);
if (error < 0) if (error < 0)
goto out; goto out;
else } else
fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock); posix_test_lock(filp, &file_lock);
} else {
fl = (posix_test_lock(filp, &file_lock, &cfl) ? &cfl : NULL); flock.l_type = file_lock.fl_type;
} if (file_lock.fl_type != F_UNLCK)
posix_lock_to_flock64(&flock, &file_lock);
flock.l_type = F_UNLCK;
if (fl != NULL)
posix_lock_to_flock64(&flock, fl);
error = -EFAULT; error = -EFAULT;
if (!copy_to_user(l, &flock, sizeof(flock))) if (!copy_to_user(l, &flock, sizeof(flock)))
error = 0; error = 0;
......
...@@ -391,17 +391,12 @@ out_swapfile: ...@@ -391,17 +391,12 @@ out_swapfile:
static int do_getlk(struct file *filp, int cmd, struct file_lock *fl) static int do_getlk(struct file *filp, int cmd, struct file_lock *fl)
{ {
struct file_lock cfl;
struct inode *inode = filp->f_mapping->host; struct inode *inode = filp->f_mapping->host;
int status = 0; int status = 0;
lock_kernel(); lock_kernel();
/* Try local locking first */ /* Try local locking first */
if (posix_test_lock(filp, fl, &cfl)) { if (posix_test_lock(filp, fl)) {
fl->fl_start = cfl.fl_start;
fl->fl_end = cfl.fl_end;
fl->fl_type = cfl.fl_type;
fl->fl_pid = cfl.fl_pid;
goto out; goto out;
} }
......
...@@ -2813,7 +2813,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -2813,7 +2813,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
struct inode *inode; struct inode *inode;
struct file file; struct file file;
struct file_lock file_lock; struct file_lock file_lock;
struct file_lock conflock;
__be32 status; __be32 status;
if (nfs4_in_grace()) if (nfs4_in_grace())
...@@ -2878,9 +2877,10 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -2878,9 +2877,10 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
file.f_path.dentry = cstate->current_fh.fh_dentry; file.f_path.dentry = cstate->current_fh.fh_dentry;
status = nfs_ok; status = nfs_ok;
if (posix_test_lock(&file, &file_lock, &conflock)) { posix_test_lock(&file, &file_lock);
if (file_lock.fl_type != F_UNLCK) {
status = nfserr_denied; status = nfserr_denied;
nfs4_set_lock_denied(&conflock, &lockt->lt_denied); nfs4_set_lock_denied(&file_lock, &lockt->lt_denied);
} }
out: out:
nfs4_unlock_state(); nfs4_unlock_state();
......
...@@ -851,7 +851,7 @@ extern void locks_init_lock(struct file_lock *); ...@@ -851,7 +851,7 @@ extern void locks_init_lock(struct file_lock *);
extern void locks_copy_lock(struct file_lock *, struct file_lock *); extern void locks_copy_lock(struct file_lock *, struct file_lock *);
extern void locks_remove_posix(struct file *, fl_owner_t); extern void locks_remove_posix(struct file *, fl_owner_t);
extern void locks_remove_flock(struct file *); extern void locks_remove_flock(struct file *);
extern int posix_test_lock(struct file *, struct file_lock *, struct file_lock *); extern int posix_test_lock(struct file *, struct file_lock *);
extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_lock *); extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_lock *);
extern int posix_lock_file(struct file *, struct file_lock *); extern int posix_lock_file(struct file *, struct file_lock *);
extern int posix_lock_file_wait(struct file *, struct file_lock *); extern int posix_lock_file_wait(struct file *, struct file_lock *);
......
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