This belongs in the transport layer. Signed-off-by: Miklos Szeredi --- fs/fuse/dev.c | 17 ++++++++++++----- fs/fuse/fuse_dev_i.h | 5 ++++- fs/fuse/fuse_i.h | 3 --- fs/fuse/inode.c | 2 -- fs/fuse/req_timeout.c | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 416c144c6e0d..18bad9089917 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -342,13 +342,20 @@ void fuse_chan_release(struct fuse_chan *fch) void fuse_chan_free(struct fuse_chan *fch) { + WARN_ON(!list_empty(&fch->devices)); kfree(fch); } EXPORT_SYMBOL_GPL(fuse_chan_free); struct fuse_chan *fuse_chan_new(void) { - return kzalloc_obj(struct fuse_chan); + struct fuse_chan *fch = kzalloc_obj(struct fuse_chan); + if (!fch) + return NULL; + + INIT_LIST_HEAD(&fch->devices); + + return fch; } EXPORT_SYMBOL_GPL(fuse_chan_new); @@ -417,7 +424,7 @@ void fuse_dev_install(struct fuse_dev *fud, struct fuse_conn *fc) */ fc->connected = 0; } else { - list_add_tail(&fud->entry, &fc->devices); + list_add_tail(&fud->entry, &fc->chan->devices); fuse_conn_get(fc); } spin_unlock(&fc->lock); @@ -2046,7 +2053,7 @@ static void fuse_resend(struct fuse_conn *fc) return; } - list_for_each_entry(fud, &fc->devices, entry) { + list_for_each_entry(fud, &fc->chan->devices, entry) { struct fuse_pqueue *fpq = &fud->pq; spin_lock(&fpq->lock); @@ -2519,7 +2526,7 @@ void fuse_abort_conn(struct fuse_conn *fc) spin_unlock(&fc->bg_lock); fuse_set_initialized(fc); - list_for_each_entry(fud, &fc->devices, entry) { + list_for_each_entry(fud, &fc->chan->devices, entry) { struct fuse_pqueue *fpq = &fud->pq; spin_lock(&fpq->lock); @@ -2605,7 +2612,7 @@ int fuse_dev_release(struct inode *inode, struct file *file) spin_lock(&fc->lock); list_del(&fud->entry); /* Are we the last open device? */ - last = list_empty(&fc->devices); + last = list_empty(&fc->chan->devices); spin_unlock(&fc->lock); if (last) { diff --git a/fs/fuse/fuse_dev_i.h b/fs/fuse/fuse_dev_i.h index e80409c2f496..459f37ece46a 100644 --- a/fs/fuse/fuse_dev_i.h +++ b/fs/fuse/fuse_dev_i.h @@ -90,6 +90,9 @@ struct fuse_iqueue { struct fuse_chan { /** Input queue */ struct fuse_iqueue iq; + + /** List of device instances belonging to this connection */ + struct list_head devices; }; #define FUSE_PQ_HASH_BITS 8 @@ -125,7 +128,7 @@ struct fuse_dev { /** Processing queue */ struct fuse_pqueue pq; - /** list entry on fc->devices */ + /** list entry on fch->devices */ struct list_head entry; }; diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index fd5f741693ca..6185b97df106 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -835,9 +835,6 @@ struct fuse_conn { */ struct rw_semaphore killsb; - /** List of device instances belonging to this connection */ - struct list_head devices; - #ifdef CONFIG_FUSE_DAX /* Dax mode */ enum fuse_dax_mode dax_mode; diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index ac6a0b736fb9..4d958c53900f 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -982,7 +982,6 @@ void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm, init_waitqueue_head(&fc->blocked_waitq); INIT_LIST_HEAD(&fc->bg_queue); INIT_LIST_HEAD(&fc->entry); - INIT_LIST_HEAD(&fc->devices); atomic_set(&fc->num_waiting, 0); fc->max_background = FUSE_DEFAULT_MAX_BACKGROUND; fc->congestion_threshold = FUSE_DEFAULT_CONGESTION_THRESHOLD; @@ -1543,7 +1542,6 @@ EXPORT_SYMBOL_GPL(fuse_send_init); void fuse_free_conn(struct fuse_conn *fc) { - WARN_ON(!list_empty(&fc->devices)); kfree(fc); } EXPORT_SYMBOL_GPL(fuse_free_conn); diff --git a/fs/fuse/req_timeout.c b/fs/fuse/req_timeout.c index 5357a2d63b3f..ca44a7940174 100644 --- a/fs/fuse/req_timeout.c +++ b/fs/fuse/req_timeout.c @@ -94,7 +94,7 @@ static void fuse_check_timeout(struct work_struct *work) spin_unlock(&fc->lock); return; } - list_for_each_entry(fud, &fc->devices, entry) { + list_for_each_entry(fud, &fc->chan->devices, entry) { fpq = &fud->pq; spin_lock(&fpq->lock); if (fuse_request_expired(fc, &fpq->io) || -- 2.53.0