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

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
...@@ -50,6 +50,16 @@ config MD_AUTODETECT ...@@ -50,6 +50,16 @@ config MD_AUTODETECT
If unsure, say Y. 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 config MD_LINEAR
tristate "Linear (append) mode (deprecated)" tristate "Linear (append) mode (deprecated)"
depends on BLK_DEV_MD depends on BLK_DEV_MD
......
...@@ -295,6 +295,7 @@ static void write_sb_page(struct bitmap *bitmap, unsigned long pg_index, ...@@ -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); 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) static void write_file_page(struct bitmap *bitmap, struct page *page, int wait)
{ {
struct buffer_head *bh = page_buffers(page); struct buffer_head *bh = page_buffers(page);
...@@ -408,6 +409,20 @@ static int read_file_page(struct file *file, unsigned long index, ...@@ -408,6 +409,20 @@ static int read_file_page(struct file *file, unsigned long index,
ret); ret);
return 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 * bitmap file superblock operations
......
...@@ -7043,6 +7043,13 @@ static int set_bitmap_file(struct mddev *mddev, int fd) ...@@ -7043,6 +7043,13 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
if (mddev->bitmap || mddev->bitmap_info.file) if (mddev->bitmap || mddev->bitmap_info.file)
return -EEXIST; /* cannot add when bitmap is present */ 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); f = fget(fd);
if (f == NULL) { if (f == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment