linux_dsm_epyc7002/drivers/md
Alasdair G Kergon 0e56822d30 [PATCH] device-mapper: mirror log bitset fix
The linux bitset operators (test_bit, set_bit etc) work on arrays of "unsigned
long".  dm-log uses such bitsets but treats them as arrays of uint32_t, only
allocating and zeroing a multiple of 4 bytes (as 'clean_bits' is a uint32_t).

The patch below fixes this problem.

The problem is specific to 64-bit big endian machines such as s390x or ppc-64
and can prevent pvmove terminating.

In the simplest case, if "region_count" were (say) 30, then
bitset_size (below) would be 4 and bitset_uint32_count would be 1.
Thus the memory for this butset, after allocation and zeroing would
be
   0 0 0 0 X X X X
On a bigendian 64bit machine, bit 0 for this bitset is in the 8th
byte! (and every bit that dm-log would use would be in the X area).

   0 0 0 0 X X X X
                 ^
                 here

which hasn't been cleared properly.

As the dm-raid1 code only syncs and counts regions which have a 0 in the
'sync_bits' bitset, and only finishes when it has counted high enough, a large
number of 1's among those 'X's will cause the sync to not complete.

It is worth noting that the code uses the same bitsets for in-memory and
on-disk logs.  As these bitsets are host-endian and host-sized, this means
that they cannot safely be moved between computers with

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-11-22 09:14:31 -08:00
..
raid6test
bitmap.c [PATCH] md: don't pass a NULL file* into ->prepare_write() 2005-11-18 07:49:46 -08:00
dm-bio-list.h
dm-bio-record.h
dm-crypt.c
dm-emc.c
dm-exception-store.c
dm-hw-handler.c
dm-hw-handler.h
dm-io.c
dm-io.h
dm-ioctl.c [PATCH] device-mapper: list_versions fix 2005-11-22 09:14:31 -08:00
dm-linear.c
dm-log.c [PATCH] device-mapper: mirror log bitset fix 2005-11-22 09:14:31 -08:00
dm-log.h
dm-mpath.c
dm-mpath.h
dm-path-selector.c
dm-path-selector.h
dm-raid1.c
dm-round-robin.c
dm-snap.c
dm-snap.h
dm-stripe.c
dm-table.c
dm-target.c
dm-zero.c
dm.c
dm.h
faulty.c
Kconfig
kcopyd.c
kcopyd.h
linear.c
Makefile
md.c [PATCH] md: fix is_mddev_idle calculation now that disk/sector accounting happens when request completes 2005-11-18 07:49:46 -08:00
mktables.c
multipath.c [PATCH] md: convert 'faulty' and 'in_sync' fields to bits in 'flags' field 2005-11-09 07:56:38 -08:00
raid0.c
raid1.c [PATCH] md: make manual repair work for raid1 2005-11-09 07:56:39 -08:00
raid5.c [PATCH] md: fix some locking and module refcounting issues with md's use of sysfs 2005-11-09 07:56:39 -08:00
raid6.h
raid6algos.c
raid6altivec.uc
raid6int.uc
raid6main.c [PATCH] md: convert 'faulty' and 'in_sync' fields to bits in 'flags' field 2005-11-09 07:56:38 -08:00
raid6mmx.c
raid6recov.c
raid6sse1.c
raid6sse2.c
raid6x86.h
raid10.c [PATCH] md: convert 'faulty' and 'in_sync' fields to bits in 'flags' field 2005-11-09 07:56:38 -08:00
unroll.pl
xor.c