[PATCH] fuse: introduce unified request state
Miklos Szeredi [Tue, 17 Jan 2006 06:14:31 +0000 (22:14 -0800)]
The state of request was made up of 2 bitfields (->sent and ->finished) and of
the fact that the request was on a list or not.

Unify this into a single state field.

Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

fs/fuse/dev.c
fs/fuse/fuse_i.h

index 4f1ca7b..bc8a384 100644 (file)
@@ -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);
@@ -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;
@@ -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);
 }
 
@@ -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);
 }
 
@@ -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;
@@ -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);
        }
index 27937e8..8cc87eb 100644 (file)
@@ -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
  */
@@ -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;