Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse
Pull fuse updates from Miklos Szeredi: "Support for pid namespaces from Seth and refcount_t work from Elena" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: fuse: Add support for pid namespaces fuse: convert fuse_conn.count from atomic_t to refcount_t fuse: convert fuse_req.count from atomic_t to refcount_t fuse: convert fuse_file.count from atomic_t to refcount_t
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include <linux/pipe_fs_i.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/splice.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
|
||||
MODULE_ALIAS("devname:fuse");
|
||||
@@ -45,7 +46,7 @@ static void fuse_request_init(struct fuse_req *req, struct page **pages,
|
||||
INIT_LIST_HEAD(&req->list);
|
||||
INIT_LIST_HEAD(&req->intr_entry);
|
||||
init_waitqueue_head(&req->waitq);
|
||||
atomic_set(&req->count, 1);
|
||||
refcount_set(&req->count, 1);
|
||||
req->pages = pages;
|
||||
req->page_descs = page_descs;
|
||||
req->max_pages = npages;
|
||||
@@ -102,21 +103,20 @@ void fuse_request_free(struct fuse_req *req)
|
||||
|
||||
void __fuse_get_request(struct fuse_req *req)
|
||||
{
|
||||
atomic_inc(&req->count);
|
||||
refcount_inc(&req->count);
|
||||
}
|
||||
|
||||
/* Must be called with > 1 refcount */
|
||||
static void __fuse_put_request(struct fuse_req *req)
|
||||
{
|
||||
BUG_ON(atomic_read(&req->count) < 2);
|
||||
atomic_dec(&req->count);
|
||||
refcount_dec(&req->count);
|
||||
}
|
||||
|
||||
static void fuse_req_init_context(struct fuse_req *req)
|
||||
static void fuse_req_init_context(struct fuse_conn *fc, struct fuse_req *req)
|
||||
{
|
||||
req->in.h.uid = from_kuid_munged(&init_user_ns, current_fsuid());
|
||||
req->in.h.gid = from_kgid_munged(&init_user_ns, current_fsgid());
|
||||
req->in.h.pid = current->pid;
|
||||
req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns);
|
||||
}
|
||||
|
||||
void fuse_set_initialized(struct fuse_conn *fc)
|
||||
@@ -163,7 +163,7 @@ static struct fuse_req *__fuse_get_req(struct fuse_conn *fc, unsigned npages,
|
||||
goto out;
|
||||
}
|
||||
|
||||
fuse_req_init_context(req);
|
||||
fuse_req_init_context(fc, req);
|
||||
__set_bit(FR_WAITING, &req->flags);
|
||||
if (for_background)
|
||||
__set_bit(FR_BACKGROUND, &req->flags);
|
||||
@@ -256,7 +256,7 @@ struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc,
|
||||
if (!req)
|
||||
req = get_reserved_req(fc, file);
|
||||
|
||||
fuse_req_init_context(req);
|
||||
fuse_req_init_context(fc, req);
|
||||
__set_bit(FR_WAITING, &req->flags);
|
||||
__clear_bit(FR_BACKGROUND, &req->flags);
|
||||
return req;
|
||||
@@ -264,7 +264,7 @@ struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc,
|
||||
|
||||
void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
|
||||
{
|
||||
if (atomic_dec_and_test(&req->count)) {
|
||||
if (refcount_dec_and_test(&req->count)) {
|
||||
if (test_bit(FR_BACKGROUND, &req->flags)) {
|
||||
/*
|
||||
* We get here in the unlikely case that a background
|
||||
@@ -1222,6 +1222,9 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
|
||||
struct fuse_in *in;
|
||||
unsigned reqsize;
|
||||
|
||||
if (task_active_pid_ns(current) != fc->pid_ns)
|
||||
return -EIO;
|
||||
|
||||
restart:
|
||||
spin_lock(&fiq->waitq.lock);
|
||||
err = -EAGAIN;
|
||||
@@ -1820,6 +1823,9 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
|
||||
struct fuse_req *req;
|
||||
struct fuse_out_header oh;
|
||||
|
||||
if (task_active_pid_ns(current) != fc->pid_ns)
|
||||
return -EIO;
|
||||
|
||||
if (nbytes < sizeof(struct fuse_out_header))
|
||||
return -EINVAL;
|
||||
|
||||
|
Reference in New Issue
Block a user