Commit 24754db2 authored by Max Reitz's avatar Max Reitz Committed by Miklos Szeredi

fuse: store fuse_conn in fuse_req

Every fuse_req belongs to a fuse_conn.  Right now, we always know which
fuse_conn that is based on the respective device, but we want to allow
multiple (sub)mounts per single connection, and then the corresponding
filesystem is not going to be so trivial to obtain.

Storing a pointer to the associated fuse_conn in every fuse_req will
allow us to trivially find any request's superblock (and thus
filesystem) even then.
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent c6ff213f
...@@ -40,20 +40,21 @@ static struct fuse_dev *fuse_get_dev(struct file *file) ...@@ -40,20 +40,21 @@ static struct fuse_dev *fuse_get_dev(struct file *file)
return READ_ONCE(file->private_data); return READ_ONCE(file->private_data);
} }
static void fuse_request_init(struct fuse_req *req) static void fuse_request_init(struct fuse_conn *fc, struct fuse_req *req)
{ {
INIT_LIST_HEAD(&req->list); INIT_LIST_HEAD(&req->list);
INIT_LIST_HEAD(&req->intr_entry); INIT_LIST_HEAD(&req->intr_entry);
init_waitqueue_head(&req->waitq); init_waitqueue_head(&req->waitq);
refcount_set(&req->count, 1); refcount_set(&req->count, 1);
__set_bit(FR_PENDING, &req->flags); __set_bit(FR_PENDING, &req->flags);
req->fc = fc;
} }
static struct fuse_req *fuse_request_alloc(gfp_t flags) static struct fuse_req *fuse_request_alloc(struct fuse_conn *fc, gfp_t flags)
{ {
struct fuse_req *req = kmem_cache_zalloc(fuse_req_cachep, flags); struct fuse_req *req = kmem_cache_zalloc(fuse_req_cachep, flags);
if (req) if (req)
fuse_request_init(req); fuse_request_init(fc, req);
return req; return req;
} }
...@@ -125,7 +126,7 @@ static struct fuse_req *fuse_get_req(struct fuse_conn *fc, bool for_background) ...@@ -125,7 +126,7 @@ static struct fuse_req *fuse_get_req(struct fuse_conn *fc, bool for_background)
if (fc->conn_error) if (fc->conn_error)
goto out; goto out;
req = fuse_request_alloc(GFP_KERNEL); req = fuse_request_alloc(fc, GFP_KERNEL);
err = -ENOMEM; err = -ENOMEM;
if (!req) { if (!req) {
if (for_background) if (for_background)
...@@ -480,7 +481,7 @@ ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) ...@@ -480,7 +481,7 @@ ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args)
if (args->force) { if (args->force) {
atomic_inc(&fc->num_waiting); atomic_inc(&fc->num_waiting);
req = fuse_request_alloc(GFP_KERNEL | __GFP_NOFAIL); req = fuse_request_alloc(fc, GFP_KERNEL | __GFP_NOFAIL);
if (!args->nocreds) if (!args->nocreds)
fuse_force_creds(fc, req); fuse_force_creds(fc, req);
...@@ -547,7 +548,7 @@ int fuse_simple_background(struct fuse_conn *fc, struct fuse_args *args, ...@@ -547,7 +548,7 @@ int fuse_simple_background(struct fuse_conn *fc, struct fuse_args *args,
if (args->force) { if (args->force) {
WARN_ON(!args->nocreds); WARN_ON(!args->nocreds);
req = fuse_request_alloc(gfp_flags); req = fuse_request_alloc(fc, gfp_flags);
if (!req) if (!req)
return -ENOMEM; return -ENOMEM;
__set_bit(FR_BACKGROUND, &req->flags); __set_bit(FR_BACKGROUND, &req->flags);
......
...@@ -374,6 +374,9 @@ struct fuse_req { ...@@ -374,6 +374,9 @@ struct fuse_req {
/** virtio-fs's physically contiguous buffer for in and out args */ /** virtio-fs's physically contiguous buffer for in and out args */
void *argbuf; void *argbuf;
#endif #endif
/** fuse_conn this request belongs to */
struct fuse_conn *fc;
}; };
struct fuse_iqueue; struct fuse_iqueue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment