diff options
Diffstat (limited to 'fs/fuse/dev.c')
-rw-r--r-- | fs/fuse/dev.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 32e0e74e8f4d..7f37e55edc0e 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -1328,7 +1328,8 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file, return reqsize; out_end: - list_del_init(&req->list); + if (!test_bit(FR_PRIVATE, &req->flags)) + list_del_init(&req->list); spin_unlock(&fpq->lock); request_end(fc, req); return err; @@ -1945,7 +1946,8 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc, err = -ENOENT; else if (err) req->out.h.error = -EIO; - list_del_init(&req->list); + if (!test_bit(FR_PRIVATE, &req->flags)) + list_del_init(&req->list); spin_unlock(&fpq->lock); request_end(fc, req); @@ -2149,8 +2151,10 @@ void fuse_abort_conn(struct fuse_conn *fc) req->out.h.error = -ECONNABORTED; spin_lock(&req->waitq.lock); set_bit(FR_ABORTED, &req->flags); - if (!test_bit(FR_LOCKED, &req->flags)) + if (!test_bit(FR_LOCKED, &req->flags)) { + set_bit(FR_PRIVATE, &req->flags); list_move(&req->list, &to_end1); + } spin_unlock(&req->waitq.lock); } list_splice_init(&fpq->processing, &to_end2); |