// SPDX-License-Identifier: GPL-2.0/* * virtio-fs: Virtio Filesystem * Copyright (C) 2018 Red Hat, Inc. */#include<linux/fs.h>#include<linux/module.h>#include<linux/virtio.h>#include<linux/virtio_fs.h>#include<linux/delay.h>#include<linux/fs_context.h>#include<linux/highmem.h>#include"fuse_i.h"/* List of virtio-fs device instances and a lock for the list. Also provides * mutual exclusion in device removal and mounting path */staticDEFINE_MUTEX(virtio_fs_mutex);staticLIST_HEAD(virtio_fs_instances);enum{VQ_HIPRIO,VQ_REQUEST};/* Per-virtqueue state */structvirtio_fs_vq{spinlock_tlock;structvirtqueue*vq;/* protected by ->lock */structwork_structdone_work;structlist_headqueued_reqs;structlist_headend_reqs;/* End these requests */structdelayed_workdispatch_work;structfuse_dev*fud;boolconnected;longin_flight;structcompletionin_flight_zero;/* No inflight requests */charname[24];}____cacheline_aligned_in_smp;/* A virtio-fs device instance */structvirtio_fs{structkrefrefcount;structlist_headlist;/* on virtio_fs_instances */char*tag;structvirtio_fs_vq*vqs;unsignedintnvqs;/* number of virtqueues */unsignedintnum_request_queues;/* number of request queues */};structvirtio_fs_forget_req{structfuse_in_headerih;structfuse_forget_inarg;};structvirtio_fs_forget{/* This request can be temporarily queued on virt queue */structlist_headlist;structvirtio_fs_forget_reqreq;};structvirtio_fs_req_work{structfuse_req*req;structvirtio_fs_vq*fsvq;structwork_structdone_work;};staticintvirtio_fs_enqueue_req(structvirtio_fs_vq*fsvq,structfuse_req*req,boolin_flight);staticinlinestructvirtio_fs_vq*vq_to_fsvq(structvirtqueue*vq){structvirtio_fs*fs=vq->vdev->priv;return&fs->vqs[vq->index];}staticinlinestructfuse_pqueue*vq_to_fpq(structvirtqueue*vq){return&vq_to_fsvq(vq)->fud->pq;}/* Should be called with fsvq->lock held. */staticinlinevoidinc_in_flight_req(structvirtio_fs_vq*fsvq){fsvq->in_flight++;}/* Should be called with fsvq->lock held. */staticinlinevoiddec_in_flight_req(structvirtio_fs_vq*fsvq){WARN_ON(fsvq->in_flight<=0);fsvq->in_flight--;if<