Re: [PATCH] MD bitmap: Revert DM dirty log hooks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 14 Jul 2011 17:29:40 -0500 Jonathan Brassow <jbrassow@xxxxxxxxxx>
wrote:

> Neil,
> 
> Time to consider pulling out the dm-dirty-log hooks yet?

I guess so... Applied (though with a few minor white-space changes).

It is in my -next.

Thanks,
NeilBrown


> 
>  brassow
> 
> Revert most of commit e384e58549a2e9a83071ad80280c1a9053cfd84c
>   md/bitmap: prepare for storing write-intent-bitmap via dm-dirty-log.
> 
> MD should not need to use DM's dirty log.
> 
> Keeping the DIV_ROUND_UP clean-ups that were part of commit
> e384e58549a2e9a83071ad80280c1a9053cfd84c, however.
> 
> Signed-off-by: Jonathan Brassow <jbrassow@xxxxxxxxxx>
> 
> Index: linux-2.6/drivers/md/bitmap.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/bitmap.c
> +++ linux-2.6/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
> @@ -777,8 +776,6 @@ static inline unsigned long file_page_of
>  static inline struct page *filemap_get_page(struct bitmap *bitmap,
>  					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_at
>  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
> +		__test_and_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,14 @@ 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
> +					__test_and_clear_bit_le(file_page_offset(bitmap, j),
> +								paddr);
> +				kunmap_atomic(paddr, KM_USER0);
>  			}
>  		} else
>  			j |= PAGE_COUNTER_MASK;
> @@ -1316,16 +1284,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);
> @@ -1489,9 +1453,7 @@ void bitmap_endwrite(struct bitmap *bitm
>  		(*bmc)--;
>  		if (*bmc <= 2)
>  			set_page_attr(bitmap,
> -				      filemap_get_page(
> -					      bitmap,
> -					      offset >> CHUNK_BLOCK_SHIFT(bitmap)),
> +				      filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap)),
>  				      BITMAP_PAGE_CLEAN);
>  
>  		spin_unlock_irqrestore(&bitmap->lock, flags);
> @@ -1766,13 +1728,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 */
> +	if (!file && !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 +1822,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 +1841,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;
>  
> Index: linux-2.6/drivers/md/bitmap.h
> ===================================================================
> --- linux-2.6.orig/drivers/md/bitmap.h
> +++ linux-2.6/drivers/md/bitmap.h
> @@ -212,10 +212,6 @@ struct bitmap {
>  	unsigned long file_pages; /* number of pages in the file */
>  	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;
>  
>  	int allclean;
> @@ -237,7 +233,6 @@ struct bitmap {
>  	wait_queue_head_t behind_wait;
>  
>  	struct sysfs_dirent *sysfs_can_clear;
> -
>  };
>  
>  /* the bitmap API */
> Index: linux-2.6/drivers/md/md.h
> ===================================================================
> --- linux-2.6.orig/drivers/md/md.h
> +++ linux-2.6/drivers/md/md.h
> @@ -304,11 +304,6 @@ struct mddev_s
>  							 * hot-adding a bitmap.  It should
>  							 * 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;
>  		unsigned long		chunksize;
>  		unsigned long		daemon_sleep; /* how many jiffies between updates? */
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux