Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f7f7543 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe
Browse files

fuse: Convert to separately allocated bdi



Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.

CC: Miklos Szeredi <miklos@szeredi.hu>
CC: linux-fsdevel@vger.kernel.org
Acked-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent c7f01477
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -383,8 +383,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)


		if (fc->num_background == fc->congestion_threshold &&
		if (fc->num_background == fc->congestion_threshold &&
		    fc->connected && fc->bdi_initialized) {
		    fc->connected && fc->bdi_initialized) {
			clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
			clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
			clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
			clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
		}
		}
		fc->num_background--;
		fc->num_background--;
		fc->active_background--;
		fc->active_background--;
@@ -575,8 +575,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
		fc->blocked = 1;
		fc->blocked = 1;
	if (fc->num_background == fc->congestion_threshold &&
	if (fc->num_background == fc->congestion_threshold &&
	    fc->bdi_initialized) {
	    fc->bdi_initialized) {
		set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
		set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
		set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
		set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
	}
	}
	list_add_tail(&req->list, &fc->bg_queue);
	list_add_tail(&req->list, &fc->bg_queue);
	flush_bg_queue(fc);
	flush_bg_queue(fc);
+0 −3
Original line number Original line Diff line number Diff line
@@ -631,9 +631,6 @@ struct fuse_conn {
	/** Negotiated minor version */
	/** Negotiated minor version */
	unsigned minor;
	unsigned minor;


	/** Backing dev info */
	struct backing_dev_info bdi;

	/** Entry on the fuse_conn_list */
	/** Entry on the fuse_conn_list */
	struct list_head entry;
	struct list_head entry;


+13 −29
Original line number Original line Diff line number Diff line
@@ -386,12 +386,6 @@ static void fuse_send_destroy(struct fuse_conn *fc)
	}
	}
}
}


static void fuse_bdi_destroy(struct fuse_conn *fc)
{
	if (fc->bdi_initialized)
		bdi_destroy(&fc->bdi);
}

static void fuse_put_super(struct super_block *sb)
static void fuse_put_super(struct super_block *sb)
{
{
	struct fuse_conn *fc = get_fuse_conn_super(sb);
	struct fuse_conn *fc = get_fuse_conn_super(sb);
@@ -403,7 +397,6 @@ static void fuse_put_super(struct super_block *sb)
	list_del(&fc->entry);
	list_del(&fc->entry);
	fuse_ctl_remove_conn(fc);
	fuse_ctl_remove_conn(fc);
	mutex_unlock(&fuse_mutex);
	mutex_unlock(&fuse_mutex);
	fuse_bdi_destroy(fc);


	fuse_conn_put(fc);
	fuse_conn_put(fc);
}
}
@@ -928,7 +921,8 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
			fc->no_flock = 1;
			fc->no_flock = 1;
		}
		}


		fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
		fc->sb->s_bdi->ra_pages =
				min(fc->sb->s_bdi->ra_pages, ra_pages);
		fc->minor = arg->minor;
		fc->minor = arg->minor;
		fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
		fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
		fc->max_write = max_t(unsigned, 4096, fc->max_write);
		fc->max_write = max_t(unsigned, 4096, fc->max_write);
@@ -944,7 +938,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)


	arg->major = FUSE_KERNEL_VERSION;
	arg->major = FUSE_KERNEL_VERSION;
	arg->minor = FUSE_KERNEL_MINOR_VERSION;
	arg->minor = FUSE_KERNEL_MINOR_VERSION;
	arg->max_readahead = fc->bdi.ra_pages * PAGE_SIZE;
	arg->max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
	arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
	arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
		FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
		FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
@@ -976,27 +970,20 @@ static void fuse_free_conn(struct fuse_conn *fc)
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
{
{
	int err;
	int err;
	char *suffix = "";


	fc->bdi.name = "fuse";
	if (sb->s_bdev)
	fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
		suffix = "-fuseblk";
	/* fuse does it's own writeback accounting */
	err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev),
	fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
				   MINOR(fc->dev), suffix);

	err = bdi_init(&fc->bdi);
	if (err)
	if (err)
		return err;
		return err;


	fc->bdi_initialized = 1;
	sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;

	/* fuse does it's own writeback accounting */
	if (sb->s_bdev) {
	sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
		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)
	fc->bdi_initialized = 1;
		return err;


	/*
	/*
	 * For a single fuse filesystem use max 1% of dirty +
	 * For a single fuse filesystem use max 1% of dirty +
@@ -1010,7 +997,7 @@ static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
	 *
	 *
	 *    /sys/class/bdi/<bdi>/max_ratio
	 *    /sys/class/bdi/<bdi>/max_ratio
	 */
	 */
	bdi_set_max_ratio(&fc->bdi, 1);
	bdi_set_max_ratio(sb->s_bdi, 1);


	return 0;
	return 0;
}
}
@@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
	if (err)
	if (err)
		goto err_dev_free;
		goto err_dev_free;


	sb->s_bdi = &fc->bdi;

	/* Handle umasking inside the fuse code */
	/* Handle umasking inside the fuse code */
	if (sb->s_flags & MS_POSIXACL)
	if (sb->s_flags & MS_POSIXACL)
		fc->dont_mask = 1;
		fc->dont_mask = 1;
@@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
 err_dev_free:
 err_dev_free:
	fuse_dev_free(fud);
	fuse_dev_free(fud);
 err_put_conn:
 err_put_conn:
	fuse_bdi_destroy(fc);
	fuse_conn_put(fc);
	fuse_conn_put(fc);
 err_fput:
 err_fput:
	fput(file);
	fput(file);