diff options
Diffstat (limited to 'drivers/md/bitmap.c')
| -rw-r--r-- | drivers/md/bitmap.c | 135 | 
1 files changed, 45 insertions, 90 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 574b09afedd..0dc6546b77a 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -29,7 +29,6 @@  #include "md.h"  #include "bitmap.h" -#include <linux/dm-dirty-log.h>  /* debug macros */  #define DEBUG 0 @@ -775,10 +774,8 @@ static inline unsigned long file_page_offset(struct bitmap *bitmap, unsigned lon   * 0 or page 1   */  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)  		return NULL;  	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,  				enum bitmap_page_attr attr)  { -	if (page) -		__set_bit((page->index<<2) + attr, bitmap->filemap_attr); -	else -		__set_bit(attr, &bitmap->logattrs); +	__set_bit((page->index<<2) + attr, bitmap->filemap_attr);  }  static inline void clear_page_attr(struct bitmap *bitmap, struct page *page,  				enum bitmap_page_attr attr)  { -	if (page) -		__clear_bit((page->index<<2) + attr, bitmap->filemap_attr); -	else -		__clear_bit(attr, &bitmap->logattrs); +	__clear_bit((page->index<<2) + attr, bitmap->filemap_attr);  }  static inline unsigned long test_page_attr(struct bitmap *bitmap, struct page *page,  					   enum bitmap_page_attr attr)  { -	if (page) -		return test_bit((page->index<<2) + attr, bitmap->filemap_attr); -	else -		return test_bit(attr, &bitmap->logattrs); +	return test_bit((page->index<<2) + attr, bitmap->filemap_attr);  }  /* @@ -912,30 +900,26 @@ 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)  {  	unsigned long bit; -	struct page *page = NULL; +	struct page *page;  	void *kaddr;  	unsigned long chunk = block >> CHUNK_BLOCK_SHIFT(bitmap); -	if (!bitmap->filemap) { -		struct dm_dirty_log *log = bitmap->mddev->bitmap_info.log; -		if (log) -			log->type->mark_region(log, chunk); -	} else { +	if (!bitmap->filemap) +		return; -		page = filemap_get_page(bitmap, chunk); -		if (!page) -			return; -		bit = file_page_offset(bitmap, chunk); +	page = filemap_get_page(bitmap, chunk); +	if (!page) +		return; +	bit = file_page_offset(bitmap, chunk); -		/* set the bit */ -		kaddr = kmap_atomic(page, KM_USER0); -		if (bitmap->flags & BITMAP_HOSTENDIAN) -			set_bit(bit, kaddr); -		else -			__test_and_set_bit_le(bit, kaddr); -		kunmap_atomic(kaddr, KM_USER0); -		PRINTK("set file bit %lu page %lu\n", bit, page->index); -	} +	/* set the bit */ +	kaddr = kmap_atomic(page, KM_USER0); +	if (bitmap->flags & BITMAP_HOSTENDIAN) +		set_bit(bit, kaddr); +	else +		__set_bit_le(bit, kaddr); +	kunmap_atomic(kaddr, KM_USER0); +	PRINTK("set file bit %lu page %lu\n", bit, page->index);  	/* record page number so it gets flushed to disk when unplug occurs */  	set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);  } @@ -952,16 +936,6 @@ void bitmap_unplug(struct bitmap *bitmap)  	if (!bitmap)  		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  	 * flushed out to disk */ @@ -990,7 +964,6 @@ void bitmap_unplug(struct bitmap *bitmap)  		else  			md_super_wait(bitmap->mddev);  	} -out:  	if (bitmap->flags & BITMAP_WRITE_ERROR)  		bitmap_file_kick(bitmap);  } @@ -1199,7 +1172,6 @@ void bitmap_daemon_work(mddev_t *mddev)  	struct page *page = NULL, *lastpage = NULL;  	sector_t blocks;  	void *paddr; -	struct dm_dirty_log *log = mddev->bitmap_info.log;  	/* Use a mutex to guard daemon_work against  	 * bitmap_destroy. @@ -1224,12 +1196,11 @@ void bitmap_daemon_work(mddev_t *mddev)  	spin_lock_irqsave(&bitmap->lock, flags);  	for (j = 0; j < bitmap->chunks; j++) {  		bitmap_counter_t *bmc; -		if (!bitmap->filemap) { -			if (!log) -				/* error or shutdown */ -				break; -		} else -			page = filemap_get_page(bitmap, j); +		if (!bitmap->filemap) +			/* error or shutdown */ +			break; + +		page = filemap_get_page(bitmap, j);  		if (page != lastpage) {  			/* skip this page unless it's marked as needing cleaning */ @@ -1298,17 +1269,16 @@ void bitmap_daemon_work(mddev_t *mddev)  						  -1);  				/* clear the bit */ -				if (page) { -					paddr = kmap_atomic(page, KM_USER0); -					if (bitmap->flags & BITMAP_HOSTENDIAN) -						clear_bit(file_page_offset(bitmap, j), -							  paddr); -					else -						__test_and_clear_bit_le(file_page_offset(bitmap, j), -							       paddr); -					kunmap_atomic(paddr, KM_USER0); -				} else -					log->type->clear_region(log, j); +				paddr = kmap_atomic(page, KM_USER0); +				if (bitmap->flags & BITMAP_HOSTENDIAN) +					clear_bit(file_page_offset(bitmap, j), +						  paddr); +				else +					__clear_bit_le( +							file_page_offset(bitmap, +									 j), +							paddr); +				kunmap_atomic(paddr, KM_USER0);  			}  		} else  			j |= PAGE_COUNTER_MASK; @@ -1316,16 +1286,12 @@ void bitmap_daemon_work(mddev_t *mddev)  	spin_unlock_irqrestore(&bitmap->lock, flags);  	/* now sync the final page */ -	if (lastpage != NULL || log != NULL) { +	if (lastpage != NULL) {  		spin_lock_irqsave(&bitmap->lock, flags);  		if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) {  			clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);  			spin_unlock_irqrestore(&bitmap->lock, flags); -			if (lastpage) -				write_page(bitmap, lastpage, 0); -			else -				if (log->type->flush(log)) -					bitmap->flags |= BITMAP_WRITE_ERROR; +			write_page(bitmap, lastpage, 0);  		} else {  			set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);  			spin_unlock_irqrestore(&bitmap->lock, flags); @@ -1767,12 +1733,10 @@ int bitmap_create(mddev_t *mddev)  	BUILD_BUG_ON(sizeof(bitmap_super_t) != 256);  	if (!file -	    && !mddev->bitmap_info.offset -	    && !mddev->bitmap_info.log) /* bitmap disabled, nothing to do */ +	    && !mddev->bitmap_info.offset) /* bitmap disabled, nothing to do */  		return 0;  	BUG_ON(file && mddev->bitmap_info.offset); -	BUG_ON(mddev->bitmap_info.offset && mddev->bitmap_info.log);  	bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL);  	if (!bitmap) @@ -1863,6 +1827,7 @@ int bitmap_create(mddev_t *mddev)  int bitmap_load(mddev_t *mddev)  {  	int err = 0; +	sector_t start = 0;  	sector_t sector = 0;  	struct bitmap *bitmap = mddev->bitmap; @@ -1881,24 +1846,14 @@ int bitmap_load(mddev_t *mddev)  	}  	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 -		    || bitmap->events_cleared == mddev->events) -			/* no need to keep dirty bits to optimise a -			 * re-add of a missing device */ -			start = mddev->recovery_cp; +	if (mddev->degraded == 0 +	    || bitmap->events_cleared == mddev->events) +		/* no need to keep dirty bits to optimise a +		 * re-add of a missing device */ +		start = mddev->recovery_cp; + +	err = bitmap_init_from_disk(bitmap, start); -		err = bitmap_init_from_disk(bitmap, start); -	}  	if (err)  		goto out;  |