aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fuse')
-rw-r--r--fs/fuse/fuse_i.h5
-rw-r--r--fs/fuse/inode.c119
2 files changed, 67 insertions, 57 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index c08e7e890923..eb488d48b833 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -650,6 +650,11 @@ void fuse_invalidate_entry_cache(struct dentry *entry);
650struct fuse_conn *fuse_conn_get(struct fuse_conn *fc); 650struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
651 651
652/** 652/**
653 * Initialize fuse_conn
654 */
655int fuse_conn_init(struct fuse_conn *fc, struct super_block *sb);
656
657/**
653 * Release reference to fuse_conn 658 * Release reference to fuse_conn
654 */ 659 */
655void fuse_conn_put(struct fuse_conn *fc); 660void fuse_conn_put(struct fuse_conn *fc);
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index ee91639c6d35..6c9fa03aa367 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -462,70 +462,69 @@ static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt)
462 return 0; 462 return 0;
463} 463}
464 464
465static struct fuse_conn *new_conn(struct super_block *sb) 465int fuse_conn_init(struct fuse_conn *fc, struct super_block *sb)
466{ 466{
467 struct fuse_conn *fc;
468 int err; 467 int err;
469 468
470 fc = kzalloc(sizeof(*fc), GFP_KERNEL); 469 memset(fc, 0, sizeof(*fc));
471 if (fc) { 470 spin_lock_init(&fc->lock);
472 spin_lock_init(&fc->lock); 471 mutex_init(&fc->inst_mutex);
473 mutex_init(&fc->inst_mutex); 472 atomic_set(&fc->count, 1);
474 atomic_set(&fc->count, 1); 473 init_waitqueue_head(&fc->waitq);
475 init_waitqueue_head(&fc->waitq); 474 init_waitqueue_head(&fc->blocked_waitq);
476 init_waitqueue_head(&fc->blocked_waitq); 475 init_waitqueue_head(&fc->reserved_req_waitq);
477 init_waitqueue_head(&fc->reserved_req_waitq); 476 INIT_LIST_HEAD(&fc->pending);
478 INIT_LIST_HEAD(&fc->pending); 477 INIT_LIST_HEAD(&fc->processing);
479 INIT_LIST_HEAD(&fc->processing); 478 INIT_LIST_HEAD(&fc->io);
480 INIT_LIST_HEAD(&fc->io); 479 INIT_LIST_HEAD(&fc->interrupts);
481 INIT_LIST_HEAD(&fc->interrupts); 480 INIT_LIST_HEAD(&fc->bg_queue);
482 INIT_LIST_HEAD(&fc->bg_queue); 481 INIT_LIST_HEAD(&fc->entry);
483 atomic_set(&fc->num_waiting, 0); 482 atomic_set(&fc->num_waiting, 0);
484 fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE; 483 fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
485 fc->bdi.unplug_io_fn = default_unplug_io_fn; 484 fc->bdi.unplug_io_fn = default_unplug_io_fn;
486 /* fuse does it's own writeback accounting */ 485 /* fuse does it's own writeback accounting */
487 fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB; 486 fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB;
488 fc->khctr = 0; 487 fc->khctr = 0;
489 fc->polled_files = RB_ROOT; 488 fc->polled_files = RB_ROOT;
490 fc->dev = sb->s_dev; 489 fc->dev = sb->s_dev;
491 err = bdi_init(&fc->bdi); 490 err = bdi_init(&fc->bdi);
492 if (err) 491 if (err)
493 goto error_kfree; 492 goto error_mutex_destroy;
494 if (sb->s_bdev) { 493 if (sb->s_bdev) {
495 err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk", 494 err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk",
496 MAJOR(fc->dev), MINOR(fc->dev)); 495 MAJOR(fc->dev), MINOR(fc->dev));
497 } else { 496 } else {
498 err = bdi_register_dev(&fc->bdi, fc->dev); 497 err = bdi_register_dev(&fc->bdi, fc->dev);
499 }
500 if (err)
501 goto error_bdi_destroy;
502 /*
503 * For a single fuse filesystem use max 1% of dirty +
504 * writeback threshold.
505 *
506 * This gives about 1M of write buffer for memory maps on a
507 * machine with 1G and 10% dirty_ratio, which should be more
508 * than enough.
509 *
510 * Privileged users can raise it by writing to
511 *
512 * /sys/class/bdi/<bdi>/max_ratio
513 */
514 bdi_set_max_ratio(&fc->bdi, 1);
515 fc->reqctr = 0;
516 fc->blocked = 1;
517 fc->attr_version = 1;
518 get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
519 } 498 }
520 return fc; 499 if (err)
500 goto error_bdi_destroy;
501 /*
502 * For a single fuse filesystem use max 1% of dirty +
503 * writeback threshold.
504 *
505 * This gives about 1M of write buffer for memory maps on a
506 * machine with 1G and 10% dirty_ratio, which should be more
507 * than enough.
508 *
509 * Privileged users can raise it by writing to
510 *
511 * /sys/class/bdi/<bdi>/max_ratio
512 */
513 bdi_set_max_ratio(&fc->bdi, 1);
514 fc->reqctr = 0;
515 fc->blocked = 1;
516 fc->attr_version = 1;
517 get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
518
519 return 0;
521 520
522error_bdi_destroy: 521 error_bdi_destroy:
523 bdi_destroy(&fc->bdi); 522 bdi_destroy(&fc->bdi);
524error_kfree: 523 error_mutex_destroy:
525 mutex_destroy(&fc->inst_mutex); 524 mutex_destroy(&fc->inst_mutex);
526 kfree(fc); 525 return err;
527 return NULL;
528} 526}
527EXPORT_SYMBOL_GPL(fuse_conn_init);
529 528
530void fuse_conn_put(struct fuse_conn *fc) 529void fuse_conn_put(struct fuse_conn *fc)
531{ 530{
@@ -828,10 +827,16 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
828 if (file->f_op != &fuse_dev_operations) 827 if (file->f_op != &fuse_dev_operations)
829 return -EINVAL; 828 return -EINVAL;
830 829
831 fc = new_conn(sb); 830 fc = kmalloc(sizeof(*fc), GFP_KERNEL);
832 if (!fc) 831 if (!fc)
833 return -ENOMEM; 832 return -ENOMEM;
834 833
834 err = fuse_conn_init(fc, sb);
835 if (err) {
836 kfree(fc);
837 return err;
838 }
839
835 fc->flags = d.flags; 840 fc->flags = d.flags;
836 fc->user_id = d.user_id; 841 fc->user_id = d.user_id;
837 fc->group_id = d.group_id; 842 fc->group_id = d.group_id;