Here's the mdadm patch...
Paul Clements wrote:
Neil,
here are a couple of patches -- this one for the kernel, the next for mdadm. They fix a few issues that I found while testing the new bitmap intent logging code.
Briefly, the issues were:
kernel:
added call to bitmap_daemon_work() from raid1d so that the bitmap would actually get cleared
fixed the marking of pages with BITMAP_CLEAN so that the bitmap would get cleared correctly after resync and normal write I/O
pass back errors from write_page() since it now does actual writes itself
sync_size changed to sectors (was array_size which was KB) -- some divisions by 2 were needed
mdadm:
avoid setting of sb->events_lo = 1 when creating a 0.90 superblock -- it doesn't seem to be necessary and it was causing the event counters to start at 4 billion+ (events_lo is actually the high part of the events counter, on little endian machines anyway)
some sync_size changes, as in the kernel
if'ed out super1 definition which is now in the kernel headers
included sys/time.h to avoid compile error
Thanks, Paul
diff -purN --exclude makepkg --exclude rpm --exclude *.DIST --exclude md_u.h
--exclude md_p.h --exclude bitmap.h --exclude mdadm.steeleye.spec
--exclude-from /export/public/clemep/tmp/dontdiff
mdadm-2.0-devel-1-PRISTINE/bitmap.c mdadm-2.0-devel-1-bitmap-bug-fix/bitmap.c
--- mdadm-2.0-devel-1-PRISTINE/bitmap.c Sun Feb 13 22:00:00 2005
+++ mdadm-2.0-devel-1-bitmap-bug-fix/bitmap.c Mon Mar 7 12:15:38 2005
@@ -168,7 +168,8 @@ bitmap_info_t *bitmap_fd_read(int fd, in
if (read_bits < total_bits) { /* file truncated... */
fprintf(stderr, Name ": WARNING: bitmap file is not large "
- "enough for array size %llu!\n\n", info->sb.sync_size);
+ "enough for array size %lluKB (%llu/%llu)!\n\n",
+ info->sb.sync_size / 2, read_bits, total_bits);
total_bits = read_bits;
}
out:
@@ -226,13 +227,16 @@ int ExamineBitmap(char *filename, int br
*(__u32 *)(sb->uuid+4),
*(__u32 *)(sb->uuid+8),
*(__u32 *)(sb->uuid+12));
- printf(" Events : %llu\n", sb->events);
- printf(" Events Cleared : %llu\n", sb->events_cleared);
+ printf(" Events : %llu (%d.%llu)\n", sb->events,
+ (__u32)sb->events, sb->events >> 32);
+ printf(" Events Cleared : %llu (%d.%llu)\n", sb->events_cleared,
+ (__u32)sb->events_cleared,
+ sb->events_cleared >> 32);
printf(" State : %s\n", bitmap_state(sb->state));
printf(" Chunksize : %s\n", human_chunksize(sb->chunksize));
printf(" Daemon : %ds flush period\n", sb->daemon_sleep);
- printf(" Sync Size : %llu%s\n", sb->sync_size,
- human_size(sb->sync_size * 1024));
+ printf(" Sync Size : %lluKB%s\n", sb->sync_size / 2,
+ human_size(sb->sync_size * 512));
if (brief)
goto free_info;
printf(" Bitmap : %llu bits (chunks), %llu dirty (%2.1f%%)\n",
diff -purN --exclude makepkg --exclude rpm --exclude *.DIST --exclude md_u.h
--exclude md_p.h --exclude bitmap.h --exclude mdadm.steeleye.spec
--exclude-from /export/public/clemep/tmp/dontdiff
mdadm-2.0-devel-1-PRISTINE/mdstat.c mdadm-2.0-devel-1-bitmap-bug-fix/mdstat.c
--- mdadm-2.0-devel-1-PRISTINE/mdstat.c Tue Aug 10 21:28:50 2004
+++ mdadm-2.0-devel-1-bitmap-bug-fix/mdstat.c Mon Mar 7 11:09:29 2005
@@ -86,6 +86,7 @@
#include "mdadm.h"
#include "dlink.h"
#include <sys/select.h>
+#include <sys/time.h>
void free_mdstat(struct mdstat_ent *ms)
{
diff -purN --exclude makepkg --exclude rpm --exclude *.DIST --exclude md_u.h
--exclude md_p.h --exclude bitmap.h --exclude mdadm.steeleye.spec
--exclude-from /export/public/clemep/tmp/dontdiff
mdadm-2.0-devel-1-PRISTINE/super0.c mdadm-2.0-devel-1-bitmap-bug-fix/super0.c
--- mdadm-2.0-devel-1-PRISTINE/super0.c Sun Feb 13 21:59:45 2005
+++ mdadm-2.0-devel-1-bitmap-bug-fix/super0.c Mon Mar 7 13:27:38 2005
@@ -364,7 +364,8 @@ static int init_super0(void **sbp, mdu_a
sb->failed_disks = info->failed_disks;
sb->spare_disks = info->spare_disks;
sb->events_hi = 0;
- sb->events_lo = 1;
+ // PRC: why? sb->events_lo = 1;
+ sb->events_lo = 0;
sb->layout = info->layout;
sb->chunk_size = info->chunk_size;
diff -purN --exclude makepkg --exclude rpm --exclude *.DIST --exclude md_u.h
--exclude md_p.h --exclude bitmap.h --exclude mdadm.steeleye.spec
--exclude-from /export/public/clemep/tmp/dontdiff
mdadm-2.0-devel-1-PRISTINE/super1.c mdadm-2.0-devel-1-bitmap-bug-fix/super1.c
--- mdadm-2.0-devel-1-PRISTINE/super1.c Sun Feb 13 22:00:44 2005
+++ mdadm-2.0-devel-1-bitmap-bug-fix/super1.c Mon Mar 7 11:34:16 2005
@@ -37,6 +37,7 @@
* total size: 256 bytes plus 2 per device.
* 1K allows 384 devices.
*/
+#if 0 // already in kernel headers:
struct mdp_superblock_1 {
/* constant array information - 128 bytes */
__u32 magic; /* MD_SB_MAGIC: 0xa92b4efc - little endian */
@@ -82,6 +83,8 @@ struct mdp_superblock_1 {
*/
__u16 dev_roles[0]; /* role in array, or 0xffff for a spare, or
0xfffe for faulty */
};
+
+#endif
#ifndef offsetof
#define offsetof(t,f) ((int)&(((t*)0)->f))
