md: make bitmap file support optional
authorChristoph Hellwig <hch@lst.de>
Thu, 15 Jun 2023 06:48:39 +0000 (08:48 +0200)
committerSong Liu <song@kernel.org>
Thu, 27 Jul 2023 07:13:29 +0000 (00:13 -0700)
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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230615064840.629492-11-hch@lst.de
drivers/md/Kconfig
drivers/md/md-bitmap.c
drivers/md/md.c

index b0a22e9..9712ab9 100644 (file)
@@ -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
index a280bfd..a58a4c3 100644 (file)
@@ -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 @@ out:
                       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
index 320d715..f46996a 100644 (file)
@@ -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) {