diff mbox

[17/24] fuse: Convert to separately allocated bdi

Message ID 20170202173422.3240-18-jack@suse.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Kara Feb. 2, 2017, 5:34 p.m. UTC
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
Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/fuse/dev.c    |  8 ++++----
 fs/fuse/fuse_i.h |  3 ---
 fs/fuse/inode.c  | 42 +++++++++++++-----------------------------
 3 files changed, 17 insertions(+), 36 deletions(-)

Comments

Miklos Szeredi Feb. 7, 2017, 9:16 a.m. UTC | #1
On Thu, Feb 2, 2017 at 6:34 PM, Jan Kara <jack@suse.cz> wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.

Acked-by: Miklos Szeredi <mszeredi@redhat.com>

A follow on patch could get rid of fc->bdi_initialized too (replace
remaining uses with fc->sb).

Thanks,
Miklos

>
> CC: Miklos Szeredi <miklos@szeredi.hu>
> CC: linux-fsdevel@vger.kernel.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/fuse/dev.c    |  8 ++++----
>  fs/fuse/fuse_i.h |  3 ---
>  fs/fuse/inode.c  | 42 +++++++++++++-----------------------------
>  3 files changed, 17 insertions(+), 36 deletions(-)
>
> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> index 70ea57c7b6bb..1912164d57e9 100644
> --- a/fs/fuse/dev.c
> +++ b/fs/fuse/dev.c
> @@ -382,8 +382,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
>
>                 if (fc->num_background == fc->congestion_threshold &&
>                     fc->connected && fc->bdi_initialized) {
> -                       clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> -                       clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> +                       clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> +                       clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
>                 }
>                 fc->num_background--;
>                 fc->active_background--;
> @@ -570,8 +570,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
>                 fc->blocked = 1;
>         if (fc->num_background == fc->congestion_threshold &&
>             fc->bdi_initialized) {
> -               set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> -               set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> +               set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> +               set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
>         }
>         list_add_tail(&req->list, &fc->bg_queue);
>         flush_bg_queue(fc);
> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> index 91307940c8ac..effab9e9607f 100644
> --- a/fs/fuse/fuse_i.h
> +++ b/fs/fuse/fuse_i.h
> @@ -631,9 +631,6 @@ struct fuse_conn {
>         /** Negotiated minor version */
>         unsigned minor;
>
> -       /** Backing dev info */
> -       struct backing_dev_info bdi;
> -
>         /** Entry on the fuse_conn_list */
>         struct list_head entry;
>
> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> index 6fe6a88ecb4a..90bacbc87fb3 100644
> --- a/fs/fuse/inode.c
> +++ b/fs/fuse/inode.c
> @@ -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)
>  {
>         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);
>         fuse_ctl_remove_conn(fc);
>         mutex_unlock(&fuse_mutex);
> -       fuse_bdi_destroy(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->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->max_write = arg->minor < 5 ? 4096 : arg->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->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 |
>                 FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
>                 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)
>  {
>         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;
>
> -       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);
> -       }
> +       sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> +       /* fuse does it's own writeback accounting */
> +       sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
>
> -       if (err)
> -               return err;
> +       fc->bdi_initialized = 1;
>
>         /*
>          * 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
>          */
> -       bdi_set_max_ratio(&fc->bdi, 1);
> +       bdi_set_max_ratio(sb->s_bdi, 1);
>
>         return 0;
>  }
> @@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
>         if (err)
>                 goto err_dev_free;
>
> -       sb->s_bdi = &fc->bdi;
> -
>         /* Handle umasking inside the fuse code */
>         if (sb->s_flags & MS_POSIXACL)
>                 fc->dont_mask = 1;
> @@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
>   err_dev_free:
>         fuse_dev_free(fud);
>   err_put_conn:
> -       fuse_bdi_destroy(fc);
>         fuse_conn_put(fc);
>   err_fput:
>         fput(file);
> --
> 2.10.2
>
Jan Kara Feb. 7, 2017, 11:35 a.m. UTC | #2
On Tue 07-02-17 10:16:58, Miklos Szeredi wrote:
> On Thu, Feb 2, 2017 at 6:34 PM, Jan Kara <jack@suse.cz> wrote:
> > Allocate struct backing_dev_info separately instead of embedding it
> > inside the superblock. This unifies handling of bdi among users.
> 
> Acked-by: Miklos Szeredi <mszeredi@redhat.com>
> 
> A follow on patch could get rid of fc->bdi_initialized too (replace
> remaining uses with fc->sb).

Yeah, I was looking at that but was not 100% sure about it from a quick
look. I'll do that.

								Honza
> >
> > CC: Miklos Szeredi <miklos@szeredi.hu>
> > CC: linux-fsdevel@vger.kernel.org
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> >  fs/fuse/dev.c    |  8 ++++----
> >  fs/fuse/fuse_i.h |  3 ---
> >  fs/fuse/inode.c  | 42 +++++++++++++-----------------------------
> >  3 files changed, 17 insertions(+), 36 deletions(-)
> >
> > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> > index 70ea57c7b6bb..1912164d57e9 100644
> > --- a/fs/fuse/dev.c
> > +++ b/fs/fuse/dev.c
> > @@ -382,8 +382,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
> >
> >                 if (fc->num_background == fc->congestion_threshold &&
> >                     fc->connected && fc->bdi_initialized) {
> > -                       clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> > -                       clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> > +                       clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> > +                       clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> >                 }
> >                 fc->num_background--;
> >                 fc->active_background--;
> > @@ -570,8 +570,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
> >                 fc->blocked = 1;
> >         if (fc->num_background == fc->congestion_threshold &&
> >             fc->bdi_initialized) {
> > -               set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> > -               set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> > +               set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> > +               set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> >         }
> >         list_add_tail(&req->list, &fc->bg_queue);
> >         flush_bg_queue(fc);
> > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> > index 91307940c8ac..effab9e9607f 100644
> > --- a/fs/fuse/fuse_i.h
> > +++ b/fs/fuse/fuse_i.h
> > @@ -631,9 +631,6 @@ struct fuse_conn {
> >         /** Negotiated minor version */
> >         unsigned minor;
> >
> > -       /** Backing dev info */
> > -       struct backing_dev_info bdi;
> > -
> >         /** Entry on the fuse_conn_list */
> >         struct list_head entry;
> >
> > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> > index 6fe6a88ecb4a..90bacbc87fb3 100644
> > --- a/fs/fuse/inode.c
> > +++ b/fs/fuse/inode.c
> > @@ -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)
> >  {
> >         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);
> >         fuse_ctl_remove_conn(fc);
> >         mutex_unlock(&fuse_mutex);
> > -       fuse_bdi_destroy(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->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->max_write = arg->minor < 5 ? 4096 : arg->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->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 |
> >                 FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
> >                 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)
> >  {
> >         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;
> >
> > -       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);
> > -       }
> > +       sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> > +       /* fuse does it's own writeback accounting */
> > +       sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
> >
> > -       if (err)
> > -               return err;
> > +       fc->bdi_initialized = 1;
> >
> >         /*
> >          * 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
> >          */
> > -       bdi_set_max_ratio(&fc->bdi, 1);
> > +       bdi_set_max_ratio(sb->s_bdi, 1);
> >
> >         return 0;
> >  }
> > @@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> >         if (err)
> >                 goto err_dev_free;
> >
> > -       sb->s_bdi = &fc->bdi;
> > -
> >         /* Handle umasking inside the fuse code */
> >         if (sb->s_flags & MS_POSIXACL)
> >                 fc->dont_mask = 1;
> > @@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> >   err_dev_free:
> >         fuse_dev_free(fud);
> >   err_put_conn:
> > -       fuse_bdi_destroy(fc);
> >         fuse_conn_put(fc);
> >   err_fput:
> >         fput(file);
> > --
> > 2.10.2
> >
diff mbox

Patch

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 70ea57c7b6bb..1912164d57e9 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -382,8 +382,8 @@  static void request_end(struct fuse_conn *fc, struct fuse_req *req)
 
 		if (fc->num_background == fc->congestion_threshold &&
 		    fc->connected && fc->bdi_initialized) {
-			clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
-			clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
+			clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
+			clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
 		}
 		fc->num_background--;
 		fc->active_background--;
@@ -570,8 +570,8 @@  void fuse_request_send_background_locked(struct fuse_conn *fc,
 		fc->blocked = 1;
 	if (fc->num_background == fc->congestion_threshold &&
 	    fc->bdi_initialized) {
-		set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
-		set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
+		set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
+		set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
 	}
 	list_add_tail(&req->list, &fc->bg_queue);
 	flush_bg_queue(fc);
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 91307940c8ac..effab9e9607f 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -631,9 +631,6 @@  struct fuse_conn {
 	/** Negotiated minor version */
 	unsigned minor;
 
-	/** Backing dev info */
-	struct backing_dev_info bdi;
-
 	/** Entry on the fuse_conn_list */
 	struct list_head entry;
 
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 6fe6a88ecb4a..90bacbc87fb3 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -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)
 {
 	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);
 	fuse_ctl_remove_conn(fc);
 	mutex_unlock(&fuse_mutex);
-	fuse_bdi_destroy(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->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->max_write = arg->minor < 5 ? 4096 : arg->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->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 |
 		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
 		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)
 {
 	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;
 
-	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);
-	}
+	sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
+	/* fuse does it's own writeback accounting */
+	sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
 
-	if (err)
-		return err;
+	fc->bdi_initialized = 1;
 
 	/*
 	 * 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
 	 */
-	bdi_set_max_ratio(&fc->bdi, 1);
+	bdi_set_max_ratio(sb->s_bdi, 1);
 
 	return 0;
 }
@@ -1113,8 +1100,6 @@  static int fuse_fill_super(struct super_block *sb, void *data, int silent)
 	if (err)
 		goto err_dev_free;
 
-	sb->s_bdi = &fc->bdi;
-
 	/* Handle umasking inside the fuse code */
 	if (sb->s_flags & MS_POSIXACL)
 		fc->dont_mask = 1;
@@ -1182,7 +1167,6 @@  static int fuse_fill_super(struct super_block *sb, void *data, int silent)
  err_dev_free:
 	fuse_dev_free(fud);
  err_put_conn:
-	fuse_bdi_destroy(fc);
 	fuse_conn_put(fc);
  err_fput:
 	fput(file);