提交 63b1ffab 编写于 作者: S Stefan Hajnoczi 提交者: Caspar Zhang

fuse: export fuse_end_request()

task #28910367
commit 04ec5af0776e9baefed59891f12adbcb5fa71a23 upstream

virtio-fs will need to complete requests from outside fs/fuse/dev.c.
Make the symbol visible.
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: NLiu Bo <bo.liu@linux.alibaba.com>
Reviewed-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
上级 0fdc23c2
...@@ -380,7 +380,7 @@ static void flush_bg_queue(struct fuse_conn *fc) ...@@ -380,7 +380,7 @@ static void flush_bg_queue(struct fuse_conn *fc)
* the 'end' callback is called if given, else the reference to the * the 'end' callback is called if given, else the reference to the
* request is released * request is released
*/ */
static void request_end(struct fuse_conn *fc, struct fuse_req *req) void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req)
{ {
struct fuse_iqueue *fiq = &fc->iq; struct fuse_iqueue *fiq = &fc->iq;
...@@ -424,6 +424,7 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req) ...@@ -424,6 +424,7 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
put_request: put_request:
fuse_put_request(fc, req); fuse_put_request(fc, req);
} }
EXPORT_SYMBOL_GPL(fuse_request_end);
static void queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req) static void queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req)
{ {
...@@ -497,13 +498,15 @@ static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) ...@@ -497,13 +498,15 @@ static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
} else { } else {
req->in.h.unique = fuse_get_unique(fiq); req->in.h.unique = fuse_get_unique(fiq);
queue_request(fiq, req); queue_request(fiq, req);
/* acquire extra reference, since request is still needed /*
after request_end() */ * acquire extra reference, since request is still
* needed after fuse_request_end()
*/
__fuse_get_request(req); __fuse_get_request(req);
spin_unlock(&fiq->lock); spin_unlock(&fiq->lock);
request_wait_answer(fc, req); request_wait_answer(fc, req);
/* Pairs with smp_wmb() in request_end() */ /* Pairs with smp_wmb() in fuse_request_end() */
smp_rmb(); smp_rmb();
} }
} }
...@@ -1236,7 +1239,7 @@ __releases(fiq->lock) ...@@ -1236,7 +1239,7 @@ __releases(fiq->lock)
* the pending list and copies request data to userspace buffer. If * the pending list and copies request data to userspace buffer. If
* no reply is needed (FORGET) or request has been aborted or there * no reply is needed (FORGET) or request has been aborted or there
* was an error during the copying then it's finished by calling * was an error during the copying then it's finished by calling
* request_end(). Otherwise add it to the processing list, and set * fuse_request_end(). Otherwise add it to the processing list, and set
* the 'sent' flag. * the 'sent' flag.
*/ */
static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
...@@ -1298,7 +1301,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, ...@@ -1298,7 +1301,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
/* SETXATTR is special, since it may contain too large data */ /* SETXATTR is special, since it may contain too large data */
if (in->h.opcode == FUSE_SETXATTR) if (in->h.opcode == FUSE_SETXATTR)
req->out.h.error = -E2BIG; req->out.h.error = -E2BIG;
request_end(fc, req); fuse_request_end(fc, req);
goto restart; goto restart;
} }
spin_lock(&fpq->lock); spin_lock(&fpq->lock);
...@@ -1340,7 +1343,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, ...@@ -1340,7 +1343,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
if (!test_bit(FR_PRIVATE, &req->flags)) if (!test_bit(FR_PRIVATE, &req->flags))
list_del_init(&req->list); list_del_init(&req->list);
spin_unlock(&fpq->lock); spin_unlock(&fpq->lock);
request_end(fc, req); fuse_request_end(fc, req);
return err; return err;
err_unlock: err_unlock:
...@@ -1847,7 +1850,7 @@ static int copy_out_args(struct fuse_copy_state *cs, struct fuse_out *out, ...@@ -1847,7 +1850,7 @@ static int copy_out_args(struct fuse_copy_state *cs, struct fuse_out *out,
* the write buffer. The request is then searched on the processing * the write buffer. The request is then searched on the processing
* list by the unique ID found in the header. If found, then remove * list by the unique ID found in the header. If found, then remove
* it from the list and copy the rest of the buffer to the request. * it from the list and copy the rest of the buffer to the request.
* The request is finished by calling request_end() * The request is finished by calling fuse_request_end().
*/ */
static ssize_t fuse_dev_do_write(struct fuse_dev *fud, static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
struct fuse_copy_state *cs, size_t nbytes) struct fuse_copy_state *cs, size_t nbytes)
...@@ -1934,7 +1937,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud, ...@@ -1934,7 +1937,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
list_del_init(&req->list); list_del_init(&req->list);
spin_unlock(&fpq->lock); spin_unlock(&fpq->lock);
request_end(fc, req); fuse_request_end(fc, req);
return err ? err : nbytes; return err ? err : nbytes;
...@@ -2080,7 +2083,7 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head) ...@@ -2080,7 +2083,7 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head)
req->out.h.error = -ECONNABORTED; req->out.h.error = -ECONNABORTED;
clear_bit(FR_SENT, &req->flags); clear_bit(FR_SENT, &req->flags);
list_del_init(&req->list); list_del_init(&req->list);
request_end(fc, req); fuse_request_end(fc, req);
} }
} }
......
...@@ -879,6 +879,11 @@ void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req); ...@@ -879,6 +879,11 @@ void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req);
void fuse_request_send_background_locked(struct fuse_conn *fc, void fuse_request_send_background_locked(struct fuse_conn *fc,
struct fuse_req *req); struct fuse_req *req);
/**
* End a finished request
*/
void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req);
/* Abort all requests */ /* Abort all requests */
void fuse_abort_conn(struct fuse_conn *fc, bool is_abort); void fuse_abort_conn(struct fuse_conn *fc, bool is_abort);
void fuse_wait_aborted(struct fuse_conn *fc); void fuse_wait_aborted(struct fuse_conn *fc);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册