diff options
Diffstat (limited to 'drivers/md/dm-log.c')
| -rw-r--r-- | drivers/md/dm-log.c | 32 | 
1 files changed, 18 insertions, 14 deletions
| diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c index 948e3f4925bf..3b52bb72bd1f 100644 --- a/drivers/md/dm-log.c +++ b/drivers/md/dm-log.c @@ -197,15 +197,21 @@ EXPORT_SYMBOL(dm_dirty_log_destroy);  #define MIRROR_DISK_VERSION 2  #define LOG_OFFSET 2 -struct log_header { -	uint32_t magic; +struct log_header_disk { +	__le32 magic;  	/*  	 * Simple, incrementing version. no backward  	 * compatibility.  	 */ +	__le32 version; +	__le64 nr_regions; +} __packed; + +struct log_header_core { +	uint32_t magic;  	uint32_t version; -	sector_t nr_regions; +	uint64_t nr_regions;  };  struct log_c { @@ -239,10 +245,10 @@ struct log_c {  	int log_dev_failed;  	int log_dev_flush_failed;  	struct dm_dev *log_dev; -	struct log_header header; +	struct log_header_core header;  	struct dm_io_region header_location; -	struct log_header *disk_header; +	struct log_header_disk *disk_header;  };  /* @@ -251,34 +257,34 @@ struct log_c {   */  static inline int log_test_bit(uint32_t *bs, unsigned bit)  { -	return test_bit_le(bit, (unsigned long *) bs) ? 1 : 0; +	return test_bit_le(bit, bs) ? 1 : 0;  }  static inline void log_set_bit(struct log_c *l,  			       uint32_t *bs, unsigned bit)  { -	__test_and_set_bit_le(bit, (unsigned long *) bs); +	__set_bit_le(bit, bs);  	l->touched_cleaned = 1;  }  static inline void log_clear_bit(struct log_c *l,  				 uint32_t *bs, unsigned bit)  { -	__test_and_clear_bit_le(bit, (unsigned long *) bs); +	__clear_bit_le(bit, bs);  	l->touched_dirtied = 1;  }  /*----------------------------------------------------------------   * Header IO   *--------------------------------------------------------------*/ -static void header_to_disk(struct log_header *core, struct log_header *disk) +static void header_to_disk(struct log_header_core *core, struct log_header_disk *disk)  {  	disk->magic = cpu_to_le32(core->magic);  	disk->version = cpu_to_le32(core->version);  	disk->nr_regions = cpu_to_le64(core->nr_regions);  } -static void header_from_disk(struct log_header *core, struct log_header *disk) +static void header_from_disk(struct log_header_core *core, struct log_header_disk *disk)  {  	core->magic = le32_to_cpu(disk->magic);  	core->version = le32_to_cpu(disk->version); @@ -486,7 +492,7 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,  	memset(lc->sync_bits, (sync == NOSYNC) ? -1 : 0, bitset_size);  	lc->sync_count = (sync == NOSYNC) ? region_count : 0; -	lc->recovering_bits = vmalloc(bitset_size); +	lc->recovering_bits = vzalloc(bitset_size);  	if (!lc->recovering_bits) {  		DMWARN("couldn't allocate sync bitset");  		vfree(lc->sync_bits); @@ -498,7 +504,6 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,  		kfree(lc);  		return -ENOMEM;  	} -	memset(lc->recovering_bits, 0, bitset_size);  	lc->sync_search = 0;  	log->context = lc; @@ -739,8 +744,7 @@ static int core_get_resync_work(struct dm_dirty_log *log, region_t *region)  		return 0;  	do { -		*region = find_next_zero_bit_le( -					     (unsigned long *) lc->sync_bits, +		*region = find_next_zero_bit_le(lc->sync_bits,  					     lc->region_count,  					     lc->sync_search);  		lc->sync_search = *region + 1; | 
