Commit 13fd6be1 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Stash a pointer to the filesystem for blk_holder_ops



Note that we open block devices before we allocate bch_fs, but once
attached to a filesystem they will be closed before the bch_fs is torn
down - so stashing a pointer without a refcount looks incorrect but it's
not.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent b31c0704
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -748,7 +748,7 @@ static int __bch2_read_super(const char *path, struct bch_opts *opts,
	memset(sb, 0, sizeof(*sb));
	sb->mode	= BLK_OPEN_READ;
	sb->have_bio	= true;
	sb->holder	= kmalloc(1, GFP_KERNEL);
	sb->holder	= kzalloc(sizeof(*sb->holder), GFP_KERNEL);
	if (!sb->holder)
		return -ENOMEM;

+7 −0
Original line number Diff line number Diff line
@@ -1431,6 +1431,13 @@ static int __bch2_dev_attach_bdev(struct bch_dev *ca, struct bch_sb_handle *sb)
	ca->disk_sb = *sb;
	memset(sb, 0, sizeof(*sb));

	/*
	 * Stash pointer to the filesystem for blk_holder_ops - note that once
	 * attached to a filesystem, we will always close the block device
	 * before tearing down the filesystem object.
	 */
	ca->disk_sb.holder->c = ca->fs;

	ca->dev = ca->disk_sb.bdev->bd_dev;

	percpu_ref_reinit(&ca->io_ref);
+7 −1
Original line number Diff line number Diff line
@@ -2,13 +2,19 @@
#ifndef _BCACHEFS_SUPER_TYPES_H
#define _BCACHEFS_SUPER_TYPES_H

struct bch_fs;

struct bch_sb_handle_holder {
	struct bch_fs		*c;
};

struct bch_sb_handle {
	struct bch_sb		*sb;
	struct file		*s_bdev_file;
	struct block_device	*bdev;
	char			*sb_name;
	struct bio		*bio;
	void			*holder;
	struct bch_sb_handle_holder *holder;
	size_t			buffer_size;
	blk_mode_t		mode;
	unsigned		have_layout:1;