diff -up 1.0.0.rc14/lib/format/ataraid/isw.c.solitary-meta-block 1.0.0.rc14/lib/format/ataraid/isw.c
--- 1.0.0.rc14/lib/format/ataraid/isw.c.solitary-meta-block 2006-09-23 02:11:37.000000000 +0800
+++ 1.0.0.rc14/lib/format/ataraid/isw.c 2007-10-22 15:10:49.000000000 +0800
@@ -364,21 +364,26 @@ static int isw_write(struct lib_context
{
int ret;
struct isw *isw = META(rd, isw);
+ int large = div_up(isw->mpb_size, ISW_DISK_BLOCK_SIZE) > 1;
to_disk(isw, FULL);
- /*
- * Copy 1st metadata sector to after the extended ones
- * and increment metadata area pointer by one block, so
- * that the metadata is filed in the proper sequence.
- */
- memcpy((void*) isw + rd->meta_areas->size, isw, ISW_DISK_BLOCK_SIZE);
- rd->meta_areas->area += ISW_DISK_BLOCK_SIZE;
+ if (large) {
+ /*
+ * Copy 1st metadata sector to after the extended ones
+ * and increment metadata area pointer by one block, so
+ * that the metadata is filed in the proper sequence.
+ */
+ memcpy((void*) isw + rd->meta_areas->size, isw,
+ ISW_DISK_BLOCK_SIZE);
+ rd->meta_areas->area += ISW_DISK_BLOCK_SIZE;
+ }
ret = write_metadata(lc, handler, rd, -1, erase);
/* Correct metadata area pointer. */
- rd->meta_areas->area -= ISW_DISK_BLOCK_SIZE;
+ if (large)
+ rd->meta_areas->area -= ISW_DISK_BLOCK_SIZE;
to_cpu(isw, FULL);