diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-02 14:56:09 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-02 14:56:09 +0000 |
commit | 0716de0eed50a3ad4b1d966561aa914165175aa8 (patch) | |
tree | 2bd5179e6bde8f1b62021afe6af8c9a42bb8ced9 /kernel/file.c | |
parent | 564878188251c3f66c0a297dcad7d6c095ac2efd (diff) | |
download | libfuse-0716de0eed50a3ad4b1d966561aa914165175aa8.tar.gz |
fix
Diffstat (limited to 'kernel/file.c')
-rw-r--r-- | kernel/file.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/kernel/file.c b/kernel/file.c index 013093d..cce2777 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -685,17 +685,16 @@ static int fuse_getlk(struct file *file, struct file_lock *fl) return err; } -static int fuse_setlk(struct file *file, struct file_lock *fl) +static int fuse_setlk(struct file *file, struct file_lock *fl, int sleep) { struct inode *inode = file->f_dentry->d_inode; struct fuse_conn *fc = get_fuse_conn(inode); struct fuse_req *req; struct fuse_lk_in_out arg; - int sleep = fl->fl_flags & FL_SLEEP; int err; if (fc->no_lk) - return posix_lock_file_wait(file, fl); + return -ENOSYS; if (!sleep) { req = fuse_get_request(fc); @@ -722,10 +721,8 @@ static int fuse_setlk(struct file *file, struct file_lock *fl) request_send(fc, req); err = req->out.h.error; fuse_put_request(fc, req); - if (err == -ENOSYS) { + if (err == -ENOSYS) fc->no_lk = 1; - err = posix_lock_file_wait(file, fl); - } return err; } @@ -734,8 +731,19 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) { if (cmd == F_GETLK) return fuse_getlk(file, fl); - else - return fuse_setlk(file, fl); + else { +#ifdef KERNEL_2_6 + int err = fuse_setlk(file, fl, fl->fl_flags & FL_SLEEP); + if (err == -ENOSYS) + err = posix_lock_file_wait(file, fl); +#else + int err = fuse_setlk(file, fl, + cmd == F_SETLKW || cmd == F_SETLKW64); + if (err == -ENOSYS) + err = 0; +#endif + return err; + } } #ifndef KERNEL_2_6 |