diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-08-01 10:44:45 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-08-01 10:44:45 +0000 |
commit | cac547059462a58ec26159cdc408f5828cfe40e5 (patch) | |
tree | d818e5b4c1b5b5152bfdeff76ea2ae6f485d6cef /kernel/file.c | |
parent | 56a61f09299d7257dde0f7dcaf041558bd334a05 (diff) | |
download | libfuse-cac547059462a58ec26159cdc408f5828cfe40e5.tar.gz |
fix
Diffstat (limited to 'kernel/file.c')
-rw-r--r-- | kernel/file.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/kernel/file.c b/kernel/file.c index 9cf7413..5ceea6e 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -686,18 +686,29 @@ static int fuse_setlk(struct file *file, struct file_lock *fl) 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); - req = fuse_get_request(fc); - if (!req) - return -EINTR; + if (!sleep) { + req = fuse_get_request(fc); + if (!req) + return -EINTR; + } else { + /* SETLKW can wait indefinately so we do not use up a + request from the pool, but allocate an unaccounted + new one */ + req = fuse_request_alloc(); + if (!req) + return -ENOMEM; + req->unaccounted = 1; + } memset(&arg, 0, sizeof(arg)); convert_file_lock(fl, &arg.lk); - req->in.h.opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK; + req->in.h.opcode = sleep ? FUSE_SETLKW : FUSE_SETLK; req->in.h.nodeid = get_node_id(inode); req->inode = inode; req->in.numargs = 1; |