Re: [PATCH 16/25] fuse: Convert to separately allocated bdi
From: Jan Kara <jack@suse.cz>
Date: 2017-05-17 07:47:03
Also in:
linux-fsdevel
On Tue 16-05-17 17:24:21, Jens Axboe wrote:
On May 16, 2017, at 12:37 PM, Rakesh Pandit [off-list ref] wrote:quoted
quoted
On Tue, May 16, 2017 at 12:48:31PM +0200, Jan Kara wrote:quoted
On Mon 15-05-17 23:34:00, Rakesh Pandit wrote: Hi Jan, Miklos,quoted
On Wed, Apr 12, 2017 at 12:24:40PM +0200, Jan Kara wrote: Allocate struct backing_dev_info separately instead of embedding it inside the superblock. This unifies handling of bdi among users.....quoted
quoted
...quoted
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb) { int err; + char *suffix = ""; - fc->bdi.name = "fuse"; - fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE; - /* fuse does it's own writeback accounting */ - fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT; - - err = bdi_init(&fc->bdi); + if (sb->s_bdev) + suffix = "-fuseblk"; + err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev), + MINOR(fc->dev), suffix); if (err) return err;This call to super_setup_bdi_name would only work with "fuse" but not with "fuseblk" as mounting a block device in userspace triggers mount_bdev call which results in set_bdev_super taking a reference from block device's BDI. But super_setup_bdi_name allocates a new bdi and ignores the already existing reference which triggers: WARN_ON(sb->s_bdi != &noop_backing_dev_info); as sb->s_bdi already has a reference from set_bdev_super. This works for "fuse" (without a blocking device) for obvious reasons. I can reproduce this on -rc1 and also found a report on lkml: https://lkml.org/lkml/2017/5/2/445 Only sane solution seems to be maintaining a private bdi instace just for fuseblk and let fuse use the common new infrastructure.Thanks for analysis! Does the attached patch fix the warning for you?Yes, tested. Feel free to add: Tested-by: Rakesh Pandit <redacted>Jan, want me to add it with the tested-by?
Yes, please. Thanks! Honza -- Jan Kara [off-list ref] SUSE Labs, CR