diff options
| author | Tejun Heo <tj@kernel.org> | 2009-04-14 10:54:52 +0900 | 
|---|---|---|
| committer | Miklos Szeredi <mszeredi@suse.cz> | 2009-04-28 16:56:41 +0200 | 
| commit | a325f9b92273d6c64ec56167905b951b9827ec33 (patch) | |
| tree | 05c80627acf609f12c8117c254c3e1feb2ec5689 /fs/fuse | |
| parent | 797759aaf31351a1ab1b9130c4f180ce496f46c5 (diff) | |
| download | linux-a325f9b92273d6c64ec56167905b951b9827ec33.tar.bz2 | |
fuse: update fuse_conn_init() and separate out fuse_conn_kill()
Update fuse_conn_init() such that it doesn't take @sb and move bdi
registration into a separate function.  Also separate out
fuse_conn_kill() from fuse_put_super().
These will be used to implement cuse.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse')
| -rw-r--r-- | fs/fuse/dev.c | 5 | ||||
| -rw-r--r-- | fs/fuse/fuse_i.h | 5 | ||||
| -rw-r--r-- | fs/fuse/inode.c | 115 | 
3 files changed, 72 insertions, 53 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index ba76b68c52ff..368189fd4056 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -282,7 +282,7 @@ __releases(&fc->lock)  			wake_up_all(&fc->blocked_waitq);  		}  		if (fc->num_background == FUSE_CONGESTION_THRESHOLD && -		    fc->connected) { +		    fc->connected && fc->bdi_initialized) {  			clear_bdi_congested(&fc->bdi, READ);  			clear_bdi_congested(&fc->bdi, WRITE);  		} @@ -408,7 +408,8 @@ static void fuse_request_send_nowait_locked(struct fuse_conn *fc,  	fc->num_background++;  	if (fc->num_background == FUSE_MAX_BACKGROUND)  		fc->blocked = 1; -	if (fc->num_background == FUSE_CONGESTION_THRESHOLD) { +	if (fc->num_background == FUSE_CONGESTION_THRESHOLD && +	    fc->bdi_initialized) {  		set_bdi_congested(&fc->bdi, READ);  		set_bdi_congested(&fc->bdi, WRITE);  	} diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index ef2e1f3780b5..2efcf12b763a 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -394,6 +394,9 @@ struct fuse_conn {  	/** Filesystem supports NFS exporting.  Only set in INIT */  	unsigned export_support:1; +	/** Set if bdi is valid */ +	unsigned bdi_initialized:1; +  	/*  	 * The following bitfields are only for optimization purposes  	 * and hence races in setting them will not cause malfunction @@ -662,7 +665,7 @@ struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);  /**   * Initialize fuse_conn   */ -int fuse_conn_init(struct fuse_conn *fc, struct super_block *sb); +void fuse_conn_init(struct fuse_conn *fc);  /**   * Release reference to fuse_conn diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 75ca5ac603ae..fea7c1064d30 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -274,11 +274,14 @@ static void fuse_send_destroy(struct fuse_conn *fc)  	}  } -static void fuse_put_super(struct super_block *sb) +static void fuse_bdi_destroy(struct fuse_conn *fc)  { -	struct fuse_conn *fc = get_fuse_conn_super(sb); +	if (fc->bdi_initialized) +		bdi_destroy(&fc->bdi); +} -	fuse_send_destroy(fc); +static void fuse_conn_kill(struct fuse_conn *fc) +{  	spin_lock(&fc->lock);  	fc->connected = 0;  	fc->blocked = 0; @@ -292,7 +295,15 @@ static void fuse_put_super(struct super_block *sb)  	list_del(&fc->entry);  	fuse_ctl_remove_conn(fc);  	mutex_unlock(&fuse_mutex); -	bdi_destroy(&fc->bdi); +	fuse_bdi_destroy(fc); +} + +static void fuse_put_super(struct super_block *sb) +{ +	struct fuse_conn *fc = get_fuse_conn_super(sb); + +	fuse_send_destroy(fc); +	fuse_conn_kill(fc);  	fuse_conn_put(fc);  } @@ -463,10 +474,8 @@ static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt)  	return 0;  } -int fuse_conn_init(struct fuse_conn *fc, struct super_block *sb) +void fuse_conn_init(struct fuse_conn *fc)  { -	int err; -  	memset(fc, 0, sizeof(*fc));  	spin_lock_init(&fc->lock);  	mutex_init(&fc->inst_mutex); @@ -481,49 +490,12 @@ int fuse_conn_init(struct fuse_conn *fc, struct super_block *sb)  	INIT_LIST_HEAD(&fc->bg_queue);  	INIT_LIST_HEAD(&fc->entry);  	atomic_set(&fc->num_waiting, 0); -	fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE; -	fc->bdi.unplug_io_fn = default_unplug_io_fn; -	/* fuse does it's own writeback accounting */ -	fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB;  	fc->khctr = 0;  	fc->polled_files = RB_ROOT; -	fc->dev = sb->s_dev; -	err = bdi_init(&fc->bdi); -	if (err) -		goto error_mutex_destroy; -	if (sb->s_bdev) { -		err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk", -				   MAJOR(fc->dev), MINOR(fc->dev)); -	} else { -		err = bdi_register_dev(&fc->bdi, fc->dev); -	} -	if (err) -		goto error_bdi_destroy; -	/* -	 * For a single fuse filesystem use max 1% of dirty + -	 * writeback threshold. -	 * -	 * This gives about 1M of write buffer for memory maps on a -	 * machine with 1G and 10% dirty_ratio, which should be more -	 * than enough. -	 * -	 * Privileged users can raise it by writing to -	 * -	 *    /sys/class/bdi/<bdi>/max_ratio -	 */ -	bdi_set_max_ratio(&fc->bdi, 1);  	fc->reqctr = 0;  	fc->blocked = 1;  	fc->attr_version = 1;  	get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); - -	return 0; - - error_bdi_destroy: -	bdi_destroy(&fc->bdi); - error_mutex_destroy: -	mutex_destroy(&fc->inst_mutex); -	return err;  }  EXPORT_SYMBOL_GPL(fuse_conn_init); @@ -794,6 +766,48 @@ static void fuse_free_conn(struct fuse_conn *fc)  	kfree(fc);  } +static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb) +{ +	int err; + +	fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE; +	fc->bdi.unplug_io_fn = default_unplug_io_fn; +	/* fuse does it's own writeback accounting */ +	fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB; + +	err = bdi_init(&fc->bdi); +	if (err) +		return err; + +	fc->bdi_initialized = 1; + +	if (sb->s_bdev) { +		err =  bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk", +				    MAJOR(fc->dev), MINOR(fc->dev)); +	} else { +		err = bdi_register_dev(&fc->bdi, fc->dev); +	} + +	if (err) +		return err; + +	/* +	 * For a single fuse filesystem use max 1% of dirty + +	 * writeback threshold. +	 * +	 * This gives about 1M of write buffer for memory maps on a +	 * machine with 1G and 10% dirty_ratio, which should be more +	 * than enough. +	 * +	 * Privileged users can raise it by writing to +	 * +	 *    /sys/class/bdi/<bdi>/max_ratio +	 */ +	bdi_set_max_ratio(&fc->bdi, 1); + +	return 0; +} +  static int fuse_fill_super(struct super_block *sb, void *data, int silent)  {  	struct fuse_conn *fc; @@ -840,11 +854,12 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)  	if (!fc)  		goto err_fput; -	err = fuse_conn_init(fc, sb); -	if (err) { -		kfree(fc); -		goto err_fput; -	} +	fuse_conn_init(fc); + +	fc->dev = sb->s_dev; +	err = fuse_bdi_init(fc, sb); +	if (err) +		goto err_put_conn;  	fc->release = fuse_free_conn;  	fc->flags = d.flags; @@ -908,7 +923,7 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)   err_put_root:  	dput(root_dentry);   err_put_conn: -	bdi_destroy(&fc->bdi); +	fuse_bdi_destroy(fc);  	fuse_conn_put(fc);   err_fput:  	fput(file);  |