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>
This commit is contained in:
parent
797759aaf3
commit
a325f9b922
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
115
fs/fuse/inode.c
115
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);
|
||||
|
|
Loading…
Reference in a new issue