Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 18651
b: refs/heads/master
c: 83cfd49
h: refs/heads/master
i:
  18649: 33e0a97
  18647: 00cd8fe
v: v3
  • Loading branch information
Miklos Szeredi authored and Linus Torvalds committed Jan 17, 2006
1 parent b8cf759 commit b1fce27
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6383bdaa2ed2d461d9f4d369dfaa9d610fc972e3
refs/heads/master: 83cfd4935124b165e942c317dc3e9ebb0a3e6a63
14 changes: 8 additions & 6 deletions trunk/fs/fuse/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
*/
static void request_end(struct fuse_conn *fc, struct fuse_req *req)
{
req->finished = 1;
req->state = FUSE_REQ_FINISHED;
spin_unlock(&fuse_lock);
if (req->background) {
down_read(&fc->sbput_sem);
Expand Down Expand Up @@ -250,10 +250,10 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req)

spin_unlock(&fuse_lock);
block_sigs(&oldset);
wait_event_interruptible(req->waitq, req->finished);
wait_event_interruptible(req->waitq, req->state == FUSE_REQ_FINISHED);
restore_sigs(&oldset);
spin_lock(&fuse_lock);
if (req->finished)
if (req->state == FUSE_REQ_FINISHED)
return;

req->out.h.error = -EINTR;
Expand All @@ -268,10 +268,10 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req)
wait_event(req->waitq, !req->locked);
spin_lock(&fuse_lock);
}
if (!req->sent && !list_empty(&req->list)) {
if (req->state == FUSE_REQ_PENDING) {
list_del(&req->list);
__fuse_put_request(req);
} else if (!req->finished && req->sent)
} else if (req->state == FUSE_REQ_SENT)
background_request(fc, req);
}

Expand Down Expand Up @@ -306,6 +306,7 @@ static void queue_request(struct fuse_conn *fc, struct fuse_req *req)
fc->outstanding_debt++;
}
list_add_tail(&req->list, &fc->pending);
req->state = FUSE_REQ_PENDING;
wake_up(&fc->waitq);
}

Expand Down Expand Up @@ -639,6 +640,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov,
goto err_unlock;

req = list_entry(fc->pending.next, struct fuse_req, list);
req->state = FUSE_REQ_READING;
list_del_init(&req->list);

in = &req->in;
Expand Down Expand Up @@ -672,7 +674,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov,
if (!req->isreply)
request_end(fc, req);
else {
req->sent = 1;
req->state = FUSE_REQ_SENT;
list_add_tail(&req->list, &fc->processing);
spin_unlock(&fuse_lock);
}
Expand Down
16 changes: 11 additions & 5 deletions trunk/fs/fuse/fuse_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ struct fuse_out {
struct fuse_arg args[3];
};

/** The request state */
enum fuse_req_state {
FUSE_REQ_INIT = 0,
FUSE_REQ_PENDING,
FUSE_REQ_READING,
FUSE_REQ_SENT,
FUSE_REQ_FINISHED
};

/**
* A request to the client
*/
Expand Down Expand Up @@ -140,11 +149,8 @@ struct fuse_req {
/** Data is being copied to/from the request */
unsigned locked:1;

/** Request has been sent to userspace */
unsigned sent:1;

/** The request is finished */
unsigned finished:1;
/** State of the request */
enum fuse_req_state state;

/** The request input */
struct fuse_in in;
Expand Down

0 comments on commit b1fce27

Please sign in to comment.