Commit a34d4ef8 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Song Liu
Browse files

md: make bitmap file support optional



The support for write intent bitmaps in files on an external files in md
is a hot mess that abuses ->bmap to map file offsets into physical device
objects, and also abuses buffer_heads in a creative way.

Make this code optional so that MD can be built into future kernels
without buffer_head support, and so that we can eventually deprecate it.

Note this does not affect the internal bitmap support, which has none of
the problems.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarSong Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230615064840.629492-11-hch@lst.de
parent d7038f95
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -50,6 +50,16 @@ config MD_AUTODETECT

	  If unsure, say Y.

config MD_BITMAP_FILE
	bool "MD bitmap file support"
	default y
	help
	  If you say Y here, support for write intent bitmaps in files on an
	  external file system is enabled.  This is an alternative to the internal
	  bitmaps near the MD superblock, and very problematic code that abuses
	  various kernel APIs and can only work with files on a file system not
	  actually sitting on the MD device.

config MD_LINEAR
	tristate "Linear (append) mode (deprecated)"
	depends on BLK_DEV_MD
+15 −0
Original line number Diff line number Diff line
@@ -295,6 +295,7 @@ static void write_sb_page(struct bitmap *bitmap, unsigned long pg_index,

static void md_bitmap_file_kick(struct bitmap *bitmap);

#ifdef CONFIG_MD_BITMAP_FILE
static void write_file_page(struct bitmap *bitmap, struct page *page, int wait)
{
	struct buffer_head *bh = page_buffers(page);
@@ -408,6 +409,20 @@ static int read_file_page(struct file *file, unsigned long index,
		       ret);
	return ret;
}
#else /* CONFIG_MD_BITMAP_FILE */
static void write_file_page(struct bitmap *bitmap, struct page *page, int wait)
{
}
static int read_file_page(struct file *file, unsigned long index,
		struct bitmap *bitmap, unsigned long count, struct page *page)
{
	return -EIO;
}
static void free_buffers(struct page *page)
{
	put_page(page);
}
#endif /* CONFIG_MD_BITMAP_FILE */

/*
 * bitmap file superblock operations
+7 −0
Original line number Diff line number Diff line
@@ -7043,6 +7043,13 @@ static int set_bitmap_file(struct mddev *mddev, int fd)

		if (mddev->bitmap || mddev->bitmap_info.file)
			return -EEXIST; /* cannot add when bitmap is present */

		if (!IS_ENABLED(CONFIG_MD_BITMAP_FILE)) {
			pr_warn("%s: bitmap files not supported by this kernel\n",
				mdname(mddev));
			return -EINVAL;
		}

		f = fget(fd);

		if (f == NULL) {