|
@@ -276,7 +276,7 @@ static void flush_bg_queue(struct fuse_conn *fc)
|
|
|
* Called with fc->lock, unlocks it
|
|
|
*/
|
|
|
static void request_end(struct fuse_conn *fc, struct fuse_req *req)
|
|
|
-__releases(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
{
|
|
|
void (*end) (struct fuse_conn *, struct fuse_req *) = req->end;
|
|
|
req->end = NULL;
|
|
@@ -306,8 +306,8 @@ __releases(&fc->lock)
|
|
|
|
|
|
static void wait_answer_interruptible(struct fuse_conn *fc,
|
|
|
struct fuse_req *req)
|
|
|
-__releases(&fc->lock)
|
|
|
-__acquires(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
{
|
|
|
if (signal_pending(current))
|
|
|
return;
|
|
@@ -325,8 +325,8 @@ static void queue_interrupt(struct fuse_conn *fc, struct fuse_req *req)
|
|
|
}
|
|
|
|
|
|
static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req)
|
|
|
-__releases(&fc->lock)
|
|
|
-__acquires(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
{
|
|
|
if (!fc->no_interrupt) {
|
|
|
/* Any signal may interrupt this */
|
|
@@ -905,8 +905,8 @@ static int request_pending(struct fuse_conn *fc)
|
|
|
|
|
|
/* Wait until a request is available on the pending list */
|
|
|
static void request_wait(struct fuse_conn *fc)
|
|
|
-__releases(&fc->lock)
|
|
|
-__acquires(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
{
|
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
|
|
|
@@ -934,7 +934,7 @@ __acquires(&fc->lock)
|
|
|
*/
|
|
|
static int fuse_read_interrupt(struct fuse_conn *fc, struct fuse_copy_state *cs,
|
|
|
size_t nbytes, struct fuse_req *req)
|
|
|
-__releases(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
{
|
|
|
struct fuse_in_header ih;
|
|
|
struct fuse_interrupt_in arg;
|
|
@@ -1720,8 +1720,8 @@ static unsigned fuse_dev_poll(struct file *file, poll_table *wait)
|
|
|
* This function releases and reacquires fc->lock
|
|
|
*/
|
|
|
static void end_requests(struct fuse_conn *fc, struct list_head *head)
|
|
|
-__releases(&fc->lock)
|
|
|
-__acquires(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
{
|
|
|
while (!list_empty(head)) {
|
|
|
struct fuse_req *req;
|
|
@@ -1744,8 +1744,8 @@ __acquires(&fc->lock)
|
|
|
* locked).
|
|
|
*/
|
|
|
static void end_io_requests(struct fuse_conn *fc)
|
|
|
-__releases(&fc->lock)
|
|
|
-__acquires(&fc->lock)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
{
|
|
|
while (!list_empty(&fc->io)) {
|
|
|
struct fuse_req *req =
|
|
@@ -1769,6 +1769,16 @@ __acquires(&fc->lock)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void end_queued_requests(struct fuse_conn *fc)
|
|
|
+__releases(fc->lock)
|
|
|
+__acquires(fc->lock)
|
|
|
+{
|
|
|
+ fc->max_background = UINT_MAX;
|
|
|
+ flush_bg_queue(fc);
|
|
|
+ end_requests(fc, &fc->pending);
|
|
|
+ end_requests(fc, &fc->processing);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Abort all requests.
|
|
|
*
|
|
@@ -1795,8 +1805,7 @@ void fuse_abort_conn(struct fuse_conn *fc)
|
|
|
fc->connected = 0;
|
|
|
fc->blocked = 0;
|
|
|
end_io_requests(fc);
|
|
|
- end_requests(fc, &fc->pending);
|
|
|
- end_requests(fc, &fc->processing);
|
|
|
+ end_queued_requests(fc);
|
|
|
wake_up_all(&fc->waitq);
|
|
|
wake_up_all(&fc->blocked_waitq);
|
|
|
kill_fasync(&fc->fasync, SIGIO, POLL_IN);
|
|
@@ -1811,8 +1820,9 @@ int fuse_dev_release(struct inode *inode, struct file *file)
|
|
|
if (fc) {
|
|
|
spin_lock(&fc->lock);
|
|
|
fc->connected = 0;
|
|
|
- end_requests(fc, &fc->pending);
|
|
|
- end_requests(fc, &fc->processing);
|
|
|
+ fc->blocked = 0;
|
|
|
+ end_queued_requests(fc);
|
|
|
+ wake_up_all(&fc->blocked_waitq);
|
|
|
spin_unlock(&fc->lock);
|
|
|
fuse_conn_put(fc);
|
|
|
}
|