Skip to content

Commit

Permalink
[fuse] Fix accounting the number of waiting requests
Browse files Browse the repository at this point in the history
Properly accounting the number of waiting requests was forgotten in
"clean up request accounting" patch.

Signed-off-by: Miklos Szeredi <[email protected]>
  • Loading branch information
szmi committed Apr 11, 2006
1 parent 73ce835 commit 9bc5ddd
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
25 changes: 19 additions & 6 deletions fs/fuse/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,30 +92,39 @@ struct fuse_req *fuse_get_req(struct fuse_conn *fc)
{
struct fuse_req *req;
sigset_t oldset;
int intr;
int err;

atomic_inc(&fc->num_waiting);
block_sigs(&oldset);
err = wait_event_interruptible(fc->blocked_waitq, !fc->blocked);
intr = wait_event_interruptible(fc->blocked_waitq, !fc->blocked);
restore_sigs(&oldset);
if (err)
return ERR_PTR(-EINTR);
err = -EINTR;
if (intr)
goto out;

req = fuse_request_alloc();
err = -ENOMEM;
if (!req)
return ERR_PTR(-ENOMEM);
goto out;

atomic_inc(&fc->num_waiting);
fuse_request_init(req);
req->in.h.uid = current->fsuid;
req->in.h.gid = current->fsgid;
req->in.h.pid = current->pid;
req->waiting = 1;
return req;

out:
atomic_dec(&fc->num_waiting);
return ERR_PTR(err);
}

void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
{
if (atomic_dec_and_test(&req->count)) {
atomic_dec(&fc->num_waiting);
if (req->waiting)
atomic_dec(&fc->num_waiting);
fuse_request_free(req);
}
}
Expand Down Expand Up @@ -281,6 +290,10 @@ static void queue_request(struct fuse_conn *fc, struct fuse_req *req)
len_args(req->in.numargs, (struct fuse_arg *) req->in.args);
list_add_tail(&req->list, &fc->pending);
req->state = FUSE_REQ_PENDING;
if (!req->waiting) {
req->waiting = 1;
atomic_inc(&fc->num_waiting);
}
wake_up(&fc->waitq);
kill_fasync(&fc->fasync, SIGIO, POLL_IN);
}
Expand Down
3 changes: 3 additions & 0 deletions fs/fuse/fuse_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ struct fuse_req {
/** Data is being copied to/from the request */
unsigned locked:1;

/** Request is counted as "waiting" */
unsigned waiting:1;

/** State of the request */
enum fuse_req_state state;

Expand Down

0 comments on commit 9bc5ddd

Please sign in to comment.