Commit 04ec5af0 authored by Stefan Hajnoczi's avatar Stefan Hajnoczi Committed by Miklos Szeredi
Browse files

fuse: export fuse_end_request()



virtio-fs will need to complete requests from outside fs/fuse/dev.c.  Make
the symbol visible.

Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent f22f812d
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ static void flush_bg_queue(struct fuse_conn *fc)
 * the 'end' callback is called if given, else the reference to the
 * 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;
	bool async = req->args->end;
@@ -309,6 +309,7 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
put_request:
	fuse_put_request(fc, req);
}
EXPORT_SYMBOL_GPL(fuse_request_end);

static int queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req)
{
@@ -396,12 +397,12 @@ static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
		req->in.h.unique = fuse_get_unique(fiq);
		queue_request(fiq, req);
		/* acquire extra reference, since request is still needed
		   after request_end() */
		   after fuse_request_end() */
		__fuse_get_request(req);
		spin_unlock(&fiq->lock);

		request_wait_answer(fc, req);
		/* Pairs with smp_wmb() in request_end() */
		/* Pairs with smp_wmb() in fuse_request_end() */
		smp_rmb();
	}
}
@@ -1151,7 +1152,7 @@ __releases(fiq->lock)
 * the pending list and copies request data to userspace buffer.  If
 * no reply is needed (FORGET) or request has been aborted or there
 * 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.
 */
static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
@@ -1232,7 +1233,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 */
		if (args->opcode == FUSE_SETXATTR)
			req->out.h.error = -E2BIG;
		request_end(fc, req);
		fuse_request_end(fc, req);
		goto restart;
	}
	spin_lock(&fpq->lock);
@@ -1275,7 +1276,7 @@ out_end:
	if (!test_bit(FR_PRIVATE, &req->flags))
		list_del_init(&req->list);
	spin_unlock(&fpq->lock);
	request_end(fc, req);
	fuse_request_end(fc, req);
	return err;

 err_unlock:
@@ -1799,7 +1800,7 @@ static int copy_out_args(struct fuse_copy_state *cs, struct fuse_args *args,
 * the write buffer.  The request is then searched on the processing
 * 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.
 * 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,
				 struct fuse_copy_state *cs, size_t nbytes)
@@ -1889,7 +1890,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
		list_del_init(&req->list);
	spin_unlock(&fpq->lock);

	request_end(fc, req);
	fuse_request_end(fc, req);
out:
	return err ? err : nbytes;

@@ -2029,7 +2030,7 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head)
		req->out.h.error = -ECONNABORTED;
		clear_bit(FR_SENT, &req->flags);
		list_del_init(&req->list);
		request_end(fc, req);
		fuse_request_end(fc, req);
	}
}

+5 −0
Original line number Diff line number Diff line
@@ -829,6 +829,11 @@ ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args);
int fuse_simple_background(struct fuse_conn *fc, struct fuse_args *args,
			   gfp_t gfp_flags);

/**
 * End a finished request
 */
void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req);

/* Abort all requests */
void fuse_abort_conn(struct fuse_conn *fc);
void fuse_wait_aborted(struct fuse_conn *fc);