MD bitmap: Revert DM dirty log hooks
Revert most of commite384e58549
md/bitmap: prepare for storing write-intent-bitmap via dm-dirty-log. MD should not need to use DM's dirty log - we decided to use md's bitmaps instead. Keeping the DIV_ROUND_UP clean-ups that were part of commite384e58549
, however. Signed-off-by: Jonathan Brassow <jbrassow@redhat.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
committed by
NeilBrown
parent
654e8b5abc
commit
3520fa4db7
@@ -29,7 +29,6 @@
|
|||||||
#include "md.h"
|
#include "md.h"
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
|
|
||||||
#include <linux/dm-dirty-log.h>
|
|
||||||
/* debug macros */
|
/* debug macros */
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
@@ -777,8 +776,6 @@ static inline unsigned long file_page_offset(struct bitmap *bitmap, unsigned lon
|
|||||||
static inline struct page *filemap_get_page(struct bitmap *bitmap,
|
static inline struct page *filemap_get_page(struct bitmap *bitmap,
|
||||||
unsigned long chunk)
|
unsigned long chunk)
|
||||||
{
|
{
|
||||||
if (bitmap->filemap == NULL)
|
|
||||||
return NULL;
|
|
||||||
if (file_page_index(bitmap, chunk) >= bitmap->file_pages)
|
if (file_page_index(bitmap, chunk) >= bitmap->file_pages)
|
||||||
return NULL;
|
return NULL;
|
||||||
return bitmap->filemap[file_page_index(bitmap, chunk)
|
return bitmap->filemap[file_page_index(bitmap, chunk)
|
||||||
@@ -878,28 +875,19 @@ enum bitmap_page_attr {
|
|||||||
static inline void set_page_attr(struct bitmap *bitmap, struct page *page,
|
static inline void set_page_attr(struct bitmap *bitmap, struct page *page,
|
||||||
enum bitmap_page_attr attr)
|
enum bitmap_page_attr attr)
|
||||||
{
|
{
|
||||||
if (page)
|
|
||||||
__set_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
__set_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
||||||
else
|
|
||||||
__set_bit(attr, &bitmap->logattrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void clear_page_attr(struct bitmap *bitmap, struct page *page,
|
static inline void clear_page_attr(struct bitmap *bitmap, struct page *page,
|
||||||
enum bitmap_page_attr attr)
|
enum bitmap_page_attr attr)
|
||||||
{
|
{
|
||||||
if (page)
|
|
||||||
__clear_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
__clear_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
||||||
else
|
|
||||||
__clear_bit(attr, &bitmap->logattrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long test_page_attr(struct bitmap *bitmap, struct page *page,
|
static inline unsigned long test_page_attr(struct bitmap *bitmap, struct page *page,
|
||||||
enum bitmap_page_attr attr)
|
enum bitmap_page_attr attr)
|
||||||
{
|
{
|
||||||
if (page)
|
|
||||||
return test_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
return test_bit((page->index<<2) + attr, bitmap->filemap_attr);
|
||||||
else
|
|
||||||
return test_bit(attr, &bitmap->logattrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -912,15 +900,12 @@ static inline unsigned long test_page_attr(struct bitmap *bitmap, struct page *p
|
|||||||
static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
|
static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
|
||||||
{
|
{
|
||||||
unsigned long bit;
|
unsigned long bit;
|
||||||
struct page *page = NULL;
|
struct page *page;
|
||||||
void *kaddr;
|
void *kaddr;
|
||||||
unsigned long chunk = block >> CHUNK_BLOCK_SHIFT(bitmap);
|
unsigned long chunk = block >> CHUNK_BLOCK_SHIFT(bitmap);
|
||||||
|
|
||||||
if (!bitmap->filemap) {
|
if (!bitmap->filemap)
|
||||||
struct dm_dirty_log *log = bitmap->mddev->bitmap_info.log;
|
return;
|
||||||
if (log)
|
|
||||||
log->type->mark_region(log, chunk);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
page = filemap_get_page(bitmap, chunk);
|
page = filemap_get_page(bitmap, chunk);
|
||||||
if (!page)
|
if (!page)
|
||||||
@@ -935,7 +920,6 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
|
|||||||
__set_bit_le(bit, kaddr);
|
__set_bit_le(bit, kaddr);
|
||||||
kunmap_atomic(kaddr, KM_USER0);
|
kunmap_atomic(kaddr, KM_USER0);
|
||||||
PRINTK("set file bit %lu page %lu\n", bit, page->index);
|
PRINTK("set file bit %lu page %lu\n", bit, page->index);
|
||||||
}
|
|
||||||
/* record page number so it gets flushed to disk when unplug occurs */
|
/* record page number so it gets flushed to disk when unplug occurs */
|
||||||
set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
|
set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
|
||||||
}
|
}
|
||||||
@@ -952,16 +936,6 @@ void bitmap_unplug(struct bitmap *bitmap)
|
|||||||
|
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
return;
|
return;
|
||||||
if (!bitmap->filemap) {
|
|
||||||
/* Must be using a dirty_log */
|
|
||||||
struct dm_dirty_log *log = bitmap->mddev->bitmap_info.log;
|
|
||||||
dirty = test_and_clear_bit(BITMAP_PAGE_DIRTY, &bitmap->logattrs);
|
|
||||||
need_write = test_and_clear_bit(BITMAP_PAGE_NEEDWRITE, &bitmap->logattrs);
|
|
||||||
if (dirty || need_write)
|
|
||||||
if (log->type->flush(log))
|
|
||||||
bitmap->flags |= BITMAP_WRITE_ERROR;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look at each page to see if there are any set bits that need to be
|
/* look at each page to see if there are any set bits that need to be
|
||||||
* flushed out to disk */
|
* flushed out to disk */
|
||||||
@@ -990,7 +964,6 @@ void bitmap_unplug(struct bitmap *bitmap)
|
|||||||
else
|
else
|
||||||
md_super_wait(bitmap->mddev);
|
md_super_wait(bitmap->mddev);
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
if (bitmap->flags & BITMAP_WRITE_ERROR)
|
if (bitmap->flags & BITMAP_WRITE_ERROR)
|
||||||
bitmap_file_kick(bitmap);
|
bitmap_file_kick(bitmap);
|
||||||
}
|
}
|
||||||
@@ -1199,7 +1172,6 @@ void bitmap_daemon_work(mddev_t *mddev)
|
|||||||
struct page *page = NULL, *lastpage = NULL;
|
struct page *page = NULL, *lastpage = NULL;
|
||||||
sector_t blocks;
|
sector_t blocks;
|
||||||
void *paddr;
|
void *paddr;
|
||||||
struct dm_dirty_log *log = mddev->bitmap_info.log;
|
|
||||||
|
|
||||||
/* Use a mutex to guard daemon_work against
|
/* Use a mutex to guard daemon_work against
|
||||||
* bitmap_destroy.
|
* bitmap_destroy.
|
||||||
@@ -1224,11 +1196,10 @@ void bitmap_daemon_work(mddev_t *mddev)
|
|||||||
spin_lock_irqsave(&bitmap->lock, flags);
|
spin_lock_irqsave(&bitmap->lock, flags);
|
||||||
for (j = 0; j < bitmap->chunks; j++) {
|
for (j = 0; j < bitmap->chunks; j++) {
|
||||||
bitmap_counter_t *bmc;
|
bitmap_counter_t *bmc;
|
||||||
if (!bitmap->filemap) {
|
if (!bitmap->filemap)
|
||||||
if (!log)
|
|
||||||
/* error or shutdown */
|
/* error or shutdown */
|
||||||
break;
|
break;
|
||||||
} else
|
|
||||||
page = filemap_get_page(bitmap, j);
|
page = filemap_get_page(bitmap, j);
|
||||||
|
|
||||||
if (page != lastpage) {
|
if (page != lastpage) {
|
||||||
@@ -1298,7 +1269,6 @@ void bitmap_daemon_work(mddev_t *mddev)
|
|||||||
-1);
|
-1);
|
||||||
|
|
||||||
/* clear the bit */
|
/* clear the bit */
|
||||||
if (page) {
|
|
||||||
paddr = kmap_atomic(page, KM_USER0);
|
paddr = kmap_atomic(page, KM_USER0);
|
||||||
if (bitmap->flags & BITMAP_HOSTENDIAN)
|
if (bitmap->flags & BITMAP_HOSTENDIAN)
|
||||||
clear_bit(file_page_offset(bitmap, j),
|
clear_bit(file_page_offset(bitmap, j),
|
||||||
@@ -1309,8 +1279,6 @@ void bitmap_daemon_work(mddev_t *mddev)
|
|||||||
j),
|
j),
|
||||||
paddr);
|
paddr);
|
||||||
kunmap_atomic(paddr, KM_USER0);
|
kunmap_atomic(paddr, KM_USER0);
|
||||||
} else
|
|
||||||
log->type->clear_region(log, j);
|
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
j |= PAGE_COUNTER_MASK;
|
j |= PAGE_COUNTER_MASK;
|
||||||
@@ -1318,16 +1286,12 @@ void bitmap_daemon_work(mddev_t *mddev)
|
|||||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||||
|
|
||||||
/* now sync the final page */
|
/* now sync the final page */
|
||||||
if (lastpage != NULL || log != NULL) {
|
if (lastpage != NULL) {
|
||||||
spin_lock_irqsave(&bitmap->lock, flags);
|
spin_lock_irqsave(&bitmap->lock, flags);
|
||||||
if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) {
|
if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) {
|
||||||
clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
|
clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
|
||||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||||
if (lastpage)
|
|
||||||
write_page(bitmap, lastpage, 0);
|
write_page(bitmap, lastpage, 0);
|
||||||
else
|
|
||||||
if (log->type->flush(log))
|
|
||||||
bitmap->flags |= BITMAP_WRITE_ERROR;
|
|
||||||
} else {
|
} else {
|
||||||
set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
|
set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
|
||||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||||
@@ -1769,12 +1733,10 @@ int bitmap_create(mddev_t *mddev)
|
|||||||
BUILD_BUG_ON(sizeof(bitmap_super_t) != 256);
|
BUILD_BUG_ON(sizeof(bitmap_super_t) != 256);
|
||||||
|
|
||||||
if (!file
|
if (!file
|
||||||
&& !mddev->bitmap_info.offset
|
&& !mddev->bitmap_info.offset) /* bitmap disabled, nothing to do */
|
||||||
&& !mddev->bitmap_info.log) /* bitmap disabled, nothing to do */
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
BUG_ON(file && mddev->bitmap_info.offset);
|
BUG_ON(file && mddev->bitmap_info.offset);
|
||||||
BUG_ON(mddev->bitmap_info.offset && mddev->bitmap_info.log);
|
|
||||||
|
|
||||||
bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL);
|
bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL);
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
@@ -1865,6 +1827,7 @@ int bitmap_create(mddev_t *mddev)
|
|||||||
int bitmap_load(mddev_t *mddev)
|
int bitmap_load(mddev_t *mddev)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
sector_t start = 0;
|
||||||
sector_t sector = 0;
|
sector_t sector = 0;
|
||||||
struct bitmap *bitmap = mddev->bitmap;
|
struct bitmap *bitmap = mddev->bitmap;
|
||||||
|
|
||||||
@@ -1883,16 +1846,6 @@ int bitmap_load(mddev_t *mddev)
|
|||||||
}
|
}
|
||||||
bitmap_close_sync(bitmap);
|
bitmap_close_sync(bitmap);
|
||||||
|
|
||||||
if (mddev->bitmap_info.log) {
|
|
||||||
unsigned long i;
|
|
||||||
struct dm_dirty_log *log = mddev->bitmap_info.log;
|
|
||||||
for (i = 0; i < bitmap->chunks; i++)
|
|
||||||
if (!log->type->in_sync(log, i, 1))
|
|
||||||
bitmap_set_memory_bits(bitmap,
|
|
||||||
(sector_t)i << CHUNK_BLOCK_SHIFT(bitmap),
|
|
||||||
1);
|
|
||||||
} else {
|
|
||||||
sector_t start = 0;
|
|
||||||
if (mddev->degraded == 0
|
if (mddev->degraded == 0
|
||||||
|| bitmap->events_cleared == mddev->events)
|
|| bitmap->events_cleared == mddev->events)
|
||||||
/* no need to keep dirty bits to optimise a
|
/* no need to keep dirty bits to optimise a
|
||||||
@@ -1900,7 +1853,7 @@ int bitmap_load(mddev_t *mddev)
|
|||||||
start = mddev->recovery_cp;
|
start = mddev->recovery_cp;
|
||||||
|
|
||||||
err = bitmap_init_from_disk(bitmap, start);
|
err = bitmap_init_from_disk(bitmap, start);
|
||||||
}
|
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@@ -212,10 +212,6 @@ struct bitmap {
|
|||||||
unsigned long file_pages; /* number of pages in the file */
|
unsigned long file_pages; /* number of pages in the file */
|
||||||
int last_page_size; /* bytes in the last page */
|
int last_page_size; /* bytes in the last page */
|
||||||
|
|
||||||
unsigned long logattrs; /* used when filemap_attr doesn't exist
|
|
||||||
* because we are working with a dirty_log
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
int allclean;
|
int allclean;
|
||||||
@@ -237,7 +233,6 @@ struct bitmap {
|
|||||||
wait_queue_head_t behind_wait;
|
wait_queue_head_t behind_wait;
|
||||||
|
|
||||||
struct sysfs_dirent *sysfs_can_clear;
|
struct sysfs_dirent *sysfs_can_clear;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* the bitmap API */
|
/* the bitmap API */
|
||||||
|
@@ -307,11 +307,6 @@ struct mddev_s
|
|||||||
* hot-adding a bitmap. It should
|
* hot-adding a bitmap. It should
|
||||||
* eventually be settable by sysfs.
|
* eventually be settable by sysfs.
|
||||||
*/
|
*/
|
||||||
/* When md is serving under dm, it might use a
|
|
||||||
* dirty_log to store the bits.
|
|
||||||
*/
|
|
||||||
struct dm_dirty_log *log;
|
|
||||||
|
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
unsigned long chunksize;
|
unsigned long chunksize;
|
||||||
unsigned long daemon_sleep; /* how many jiffies between updates? */
|
unsigned long daemon_sleep; /* how many jiffies between updates? */
|
||||||
|
Reference in New Issue
Block a user