}
EXPORT_SYMBOL_GPL(fuse_dev_alloc);
-void fuse_dev_install(struct fuse_dev *fud, struct fuse_conn *fc)
+void fuse_dev_install(struct fuse_dev *fud, struct fuse_chan *fch)
{
- struct fuse_conn *old_fc;
+ struct fuse_chan *old_fch;
- spin_lock(&fc->chan->lock);
+ spin_lock(&fch->lock);
/*
* Pairs with:
* - xchg() in fuse_dev_release()
* - smp_load_acquire() in fuse_dev_fc_get()
*/
- old_fc = cmpxchg(&fud->fc, NULL, fc);
- if (old_fc) {
+ old_fch = cmpxchg(&fud->chan, NULL, fch);
+ if (old_fch) {
/*
- * failed to set fud->fc because
+ * failed to set fud->chan because
* - it was already set to a different fc
* - it was set to disconneted
*/
- fc->chan->connected = 0;
+ fch->connected = 0;
} else {
- list_add_tail(&fud->entry, &fc->chan->devices);
- fuse_conn_get(fc);
+ list_add_tail(&fud->entry, &fch->devices);
+ fuse_conn_get(fch->conn);
wake_up_all(&fuse_dev_waitq);
}
- spin_unlock(&fc->chan->lock);
+ spin_unlock(&fch->lock);
}
EXPORT_SYMBOL_GPL(fuse_dev_install);
-struct fuse_dev *fuse_dev_alloc_install(struct fuse_conn *fc)
+struct fuse_dev *fuse_dev_alloc_install(struct fuse_chan *fch)
{
struct fuse_dev *fud;
if (!fud)
return NULL;
- fuse_dev_install(fud, fc);
+ fuse_dev_install(fud, fch);
return fud;
}
EXPORT_SYMBOL_GPL(fuse_dev_alloc_install);
void fuse_dev_put(struct fuse_dev *fud)
{
- struct fuse_conn *fc;
+ struct fuse_chan *fch;
if (!refcount_dec_and_test(&fud->ref))
return;
- fc = fuse_dev_fc_get(fud);
- if (fc && fc != FUSE_DEV_FC_DISCONNECTED) {
+ fch = fuse_dev_chan_get(fud);
+ if (fch && fch != FUSE_DEV_CHAN_DISCONNECTED) {
/* This is the virtiofs case (fuse_dev_release() not called) */
- spin_lock(&fc->chan->lock);
+ spin_lock(&fch->lock);
list_del(&fud->entry);
- spin_unlock(&fc->chan->lock);
+ spin_unlock(&fch->lock);
- fuse_conn_put(fc);
+ fuse_conn_put(fch->conn);
}
kfree(fud->pq.processing);
kfree(fud);
bool fuse_dev_is_installed(struct fuse_dev *fud)
{
- struct fuse_conn *fc = fuse_dev_fc_get(fud);
+ struct fuse_chan *fch = fuse_dev_chan_get(fud);
- return fc != NULL && fc != FUSE_DEV_FC_DISCONNECTED;
+ return fch != NULL && fch != FUSE_DEV_CHAN_DISCONNECTED;
}
/*
* Checks if @fc matches the one installed in @fud
*/
-bool fuse_dev_verify(struct fuse_dev *fud, struct fuse_conn *fc)
+bool fuse_dev_verify(struct fuse_dev *fud, struct fuse_chan *fch)
{
- return fuse_dev_fc_get(fud) == fc;
+ return fuse_dev_chan_get(fud) == fch;
}
bool fuse_dev_is_sync_init(struct fuse_dev *fud)
struct fuse_copy_state *cs, size_t nbytes)
{
ssize_t err;
- struct fuse_conn *fc = fud->fc;
- struct fuse_iqueue *fiq = &fc->chan->iq;
+ struct fuse_chan *fch = fud->chan;
+ struct fuse_iqueue *fiq = &fch->iq;
struct fuse_pqueue *fpq = &fud->pq;
struct fuse_req *req;
struct fuse_args *args;
if (nbytes < max_t(size_t, FUSE_MIN_READ_BUFFER,
sizeof(struct fuse_in_header) +
sizeof(struct fuse_write_in) +
- fc->max_write))
+ fch->conn->max_write))
return -EINVAL;
restart:
}
if (!fiq->connected) {
- err = fc->chan->abort_with_err ? -ECONNABORTED : -ENODEV;
+ err = fch->abort_with_err ? -ECONNABORTED : -ENODEV;
goto err_unlock;
}
if (forget_pending(fiq)) {
if (list_empty(&fiq->pending) || fiq->forget_batch-- > 0)
- return fuse_read_forget(fc, fiq, cs, nbytes);
+ return fuse_read_forget(fch->conn, fiq, cs, nbytes);
if (fiq->forget_batch <= -8)
fiq->forget_batch = 16;
spin_lock(&fpq->lock);
clear_bit(FR_LOCKED, &req->flags);
if (!fpq->connected) {
- err = fc->chan->abort_with_err ? -ECONNABORTED : -ENODEV;
+ err = fch->abort_with_err ? -ECONNABORTED : -ENODEV;
goto out_end;
}
if (err) {
struct fuse_dev *fud = fuse_file_to_fud(file);
int err;
- if (unlikely(!fuse_dev_fc_get(fud))) {
+ if (unlikely(!fuse_dev_chan_get(fud))) {
/* only block waiting for mount if sync init was requested */
if (!fud->sync_init)
return ERR_PTR(-EPERM);
- err = wait_event_interruptible(fuse_dev_waitq, fuse_dev_fc_get(fud) != NULL);
+ err = wait_event_interruptible(fuse_dev_waitq, fuse_dev_chan_get(fud) != NULL);
if (err)
return ERR_PTR(err);
}
struct fuse_copy_state *cs, size_t nbytes)
{
int err;
- struct fuse_conn *fc = fud->fc;
+ struct fuse_chan *fch = fud->chan;
struct fuse_pqueue *fpq = &fud->pq;
struct fuse_req *req;
struct fuse_out_header oh;
* and error contains notification code.
*/
if (!oh.unique) {
- err = fuse_notify(fc, oh.error, nbytes - sizeof(oh), cs);
+ err = fuse_notify(fch->conn, oh.error, nbytes - sizeof(oh), cs);
goto copy_finish;
}
if (nbytes != sizeof(struct fuse_out_header))
err = -EINVAL;
else if (oh.error == -ENOSYS)
- fc->chan->no_interrupt = true;
+ fch->no_interrupt = 1;
else if (oh.error == -EAGAIN)
err = queue_interrupt(req);
if (IS_ERR(fud))
return EPOLLERR;
- fiq = &fud->fc->chan->iq;
+ fiq = &fud->chan->iq;
poll_wait(file, &fiq->waitq, wait);
spin_lock(&fiq->lock);
{
struct fuse_dev *fud = fuse_file_to_fud(file);
/* Pairs with cmpxchg() in fuse_dev_install() */
- struct fuse_conn *fc = xchg(&fud->fc, FUSE_DEV_FC_DISCONNECTED);
+ struct fuse_chan *fch = xchg(&fud->chan, FUSE_DEV_CHAN_DISCONNECTED);
- if (fc) {
+ if (fch) {
struct fuse_pqueue *fpq = &fud->pq;
LIST_HEAD(to_end);
unsigned int i;
fuse_dev_end_requests(&to_end);
- spin_lock(&fc->chan->lock);
+ spin_lock(&fch->lock);
list_del(&fud->entry);
/* Are we the last open device? */
- last = list_empty(&fc->chan->devices);
- spin_unlock(&fc->chan->lock);
+ last = list_empty(&fch->devices);
+ spin_unlock(&fch->lock);
if (last) {
- WARN_ON(fc->chan->iq.fasync != NULL);
- fuse_chan_abort(fc->chan, false);
+ WARN_ON(fch->iq.fasync != NULL);
+ fuse_chan_abort(fch, false);
}
- fuse_conn_put(fc);
+ fuse_conn_put(fch->conn);
}
fuse_dev_put(fud);
return 0;
return PTR_ERR(fud);
/* No locking - fasync_helper does its own locking */
- return fasync_helper(fd, file, on, &fud->fc->chan->iq.fasync);
+ return fasync_helper(fd, file, on, &fud->chan->iq.fasync);
}
static long fuse_dev_ioctl_clone(struct file *file, __u32 __user *argp)
return PTR_ERR(fud);
new_fud = fuse_file_to_fud(file);
- if (fuse_dev_fc_get(new_fud))
+ if (fuse_dev_chan_get(new_fud))
return -EINVAL;
- fuse_dev_install(new_fud, fud->fc);
+ fuse_dev_install(new_fud, fud->chan);
return 0;
}
if (copy_from_user(&map, argp, sizeof(map)))
return -EFAULT;
- return fuse_backing_open(fud->fc, &map);
+ return fuse_backing_open(fud->chan->conn, &map);
}
static long fuse_dev_ioctl_backing_close(struct file *file, __u32 __user *argp)
if (get_user(backing_id, argp))
return -EFAULT;
- return fuse_backing_close(fud->fc, backing_id);
+ return fuse_backing_close(fud->chan->conn, backing_id);
}
static long fuse_dev_ioctl_sync_init(struct file *file)
struct fuse_dev *fud = fuse_file_to_fud(file);
mutex_lock(&fuse_mutex);
- if (!fuse_dev_fc_get(fud)) {
+ if (!fuse_dev_chan_get(fud)) {
fud->sync_init = true;
err = 0;
}
if (!fud)
return;
- seq_printf(seq, "fuse_connection:\t%u\n", fud->fc->dev);
+ seq_printf(seq, "fuse_connection:\t%u\n", fud->chan->conn->dev);
}
#endif
/*
* Basic ring setup for this connection based on the provided configuration
*/
-static struct fuse_ring *fuse_uring_create(struct fuse_conn *fc)
+static struct fuse_ring *fuse_uring_create(struct fuse_chan *fch)
{
struct fuse_ring *ring;
size_t nr_queues = num_possible_cpus();
struct fuse_ring *res = NULL;
size_t max_payload_size;
- ring = kzalloc_obj(*fc->chan->ring, GFP_KERNEL_ACCOUNT);
+ ring = kzalloc_obj(*ring, GFP_KERNEL_ACCOUNT);
if (!ring)
return NULL;
if (!ring->queues)
goto out_err;
- max_payload_size = max(FUSE_MIN_READ_BUFFER, fc->max_write);
- max_payload_size = max(max_payload_size, fc->max_pages * PAGE_SIZE);
+ max_payload_size = max(FUSE_MIN_READ_BUFFER, fch->conn->max_write);
+ max_payload_size = max(max_payload_size, fch->conn->max_pages * PAGE_SIZE);
- spin_lock(&fc->chan->lock);
- if (!fc->chan->connected) {
- spin_unlock(&fc->chan->lock);
+ spin_lock(&fch->lock);
+ if (!fch->connected) {
+ spin_unlock(&fch->lock);
goto out_err;
}
- if (fc->chan->ring) {
+ if (fch->ring) {
/* race, another thread created the ring in the meantime */
- spin_unlock(&fc->chan->lock);
- res = fc->chan->ring;
+ spin_unlock(&fch->lock);
+ res = fch->ring;
goto out_err;
}
init_waitqueue_head(&ring->stop_waitq);
ring->nr_queues = nr_queues;
- ring->fc = fc;
+ ring->fc = fch->conn;
ring->max_payload_sz = max_payload_size;
- smp_store_release(&fc->chan->ring, ring);
+ smp_store_release(&fch->ring, ring);
- spin_unlock(&fc->chan->lock);
+ spin_unlock(&fch->lock);
return ring;
out_err:
/* FUSE_URING_CMD_COMMIT_AND_FETCH handler */
static int fuse_uring_commit_fetch(struct io_uring_cmd *cmd, int issue_flags,
- struct fuse_conn *fc)
+ struct fuse_chan *fch)
{
const struct fuse_uring_cmd_req *cmd_req = io_uring_sqe128_cmd(cmd->sqe,
struct fuse_uring_cmd_req);
struct fuse_ring_ent *ent;
int err;
- struct fuse_ring *ring = fc->chan->ring;
+ struct fuse_ring *ring = fch->ring;
struct fuse_ring_queue *queue;
uint64_t commit_id = READ_ONCE(cmd_req->commit_id);
unsigned int qid = READ_ONCE(cmd_req->qid);
return err;
fpq = &queue->fpq;
- if (!READ_ONCE(fc->chan->connected))
+ if (!READ_ONCE(fch->connected))
return err;
spin_lock(&queue->lock);
* entry as "ready to get fuse requests" on the queue
*/
static int fuse_uring_register(struct io_uring_cmd *cmd,
- unsigned int issue_flags, struct fuse_conn *fc)
+ unsigned int issue_flags, struct fuse_chan *fch)
{
const struct fuse_uring_cmd_req *cmd_req = io_uring_sqe128_cmd(cmd->sqe,
struct fuse_uring_cmd_req);
- struct fuse_ring *ring = smp_load_acquire(&fc->chan->ring);
+ struct fuse_ring *ring = smp_load_acquire(&fch->ring);
struct fuse_ring_queue *queue;
struct fuse_ring_ent *ent;
int err;
err = -ENOMEM;
if (!ring) {
- ring = fuse_uring_create(fc);
+ ring = fuse_uring_create(fch);
if (!ring)
return err;
}
int fuse_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags)
{
struct fuse_dev *fud;
- struct fuse_conn *fc;
+ struct fuse_chan *fch;
u32 cmd_op = cmd->cmd_op;
int err;
pr_info_ratelimited("No fuse device found\n");
return PTR_ERR(fud);
}
- fc = fud->fc;
+ fch = fud->chan;
/* Once a connection has io-uring enabled on it, it can't be disabled */
- if (!enable_uring && !fc->chan->io_uring) {
+ if (!enable_uring && !fch->io_uring) {
pr_info_ratelimited("fuse-io-uring is disabled\n");
return -EOPNOTSUPP;
}
- if (fc->chan->abort_with_err)
+ if (fch->abort_with_err)
return -ECONNABORTED;
- if (!fc->chan->connected)
+ if (!fch->connected)
return -ENOTCONN;
/*
* fuse_uring_register() needs the ring to be initialized,
* we need to know the max payload size
*/
- if (!fc->chan->initialized)
+ if (!fch->initialized)
return -EAGAIN;
switch (cmd_op) {
case FUSE_IO_URING_CMD_REGISTER:
- err = fuse_uring_register(cmd, issue_flags, fc);
+ err = fuse_uring_register(cmd, issue_flags, fch);
if (err) {
pr_info_once("FUSE_IO_URING_CMD_REGISTER failed err=%d\n",
err);
- fc->chan->io_uring = 0;
- wake_up_all(&fc->chan->blocked_waitq);
+ fch->io_uring = 0;
+ wake_up_all(&fch->blocked_waitq);
return err;
}
break;
case FUSE_IO_URING_CMD_COMMIT_AND_FETCH:
- err = fuse_uring_commit_fetch(cmd, issue_flags, fc);
+ err = fuse_uring_commit_fetch(cmd, issue_flags, fch);
if (err) {
pr_info_once("FUSE_IO_URING_COMMIT_AND_FETCH failed err=%d\n",
err);
/** Issue FUSE_INIT synchronously */
bool sync_init;
- /** Fuse connection for this device */
- struct fuse_conn *fc;
+ /** Fuse channel for this device */
+ struct fuse_chan *chan;
/** Processing queue */
struct fuse_pqueue pq;
} ring;
};
-/* fud->fc gets assigned to this value when /dev/fuse is closed */
-#define FUSE_DEV_FC_DISCONNECTED ((struct fuse_conn *) 1)
+/* fud->chan gets assigned to this value when /dev/fuse is closed */
+#define FUSE_DEV_CHAN_DISCONNECTED ((struct fuse_chan *) 1)
/*
- * Lockless access is OK, because fud->fc is set once during mount and is valid
+ * Lockless access is OK, because fud->chan is set once during mount and is valid
* until the file is released.
*
- * fud->fc is set to FUSE_DEV_FC_DISCONNECTED only after the containing file is
+ * fud->chan is set to FUSE_DEV_CHAN_DISCONNECTED only after the containing file is
* released, so result is safe to dereference in most cases. Exceptions are:
* fuse_dev_put() and fuse_fill_super_common().
*/
-static inline struct fuse_conn *fuse_dev_fc_get(struct fuse_dev *fud)
+static inline struct fuse_chan *fuse_dev_chan_get(struct fuse_dev *fud)
{
/* Pairs with xchg() in fuse_dev_install() */
- return smp_load_acquire(&fud->fc);
+ return smp_load_acquire(&fud->chan);
}
static inline struct fuse_dev *fuse_file_to_fud(struct file *file)
{
struct fuse_dev *fud = fuse_file_to_fud(file);
- if (!fuse_dev_fc_get(fud))
+ if (!fuse_dev_chan_get(fud))
return NULL;
return fud;
*/
u64 fuse_get_unique(struct fuse_iqueue *fiq);
-struct fuse_dev *fuse_dev_alloc_install(struct fuse_conn *fc);
+struct fuse_dev *fuse_dev_alloc_install(struct fuse_chan *fch);
struct fuse_dev *fuse_dev_alloc(void);
/**