From dfd4d8ee426fb71a369f494f95fe95b114a33c7c Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 9 Aug 2005 04:25:47 +0000 Subject: Add write-behind support Currently this includes --write-behind to set level of write-behind supported --write-mostly to flag devices as write-mostly. Signed-off-by: Neil Brown --- super0.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'super0.c') diff --git a/super0.c b/super0.c index 7a306b52..e3364390 100644 --- a/super0.c +++ b/super0.c @@ -148,15 +148,19 @@ static void examine_super0(void *sbv) mdp_disk_t *dp; char *dv; char nb[5]; + int wonly; if (d>=0) dp = &sb->disks[d]; else dp = &sb->this_disk; snprintf(nb, sizeof(nb), "%4d", d); printf("%4s %5d %5d %5d %5d ", d < 0 ? "this" : nb, dp->number, dp->major, dp->minor, dp->raid_disk); + wonly = dp->state & (1<state &= ~(1<state & (1<state & (1<state & (1<state & (1<state == 0) printf(" spare"); if ((dv=map_dev(dp->major, dp->minor))) printf(" %s", dv); @@ -312,8 +316,10 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, char *dev } if (strcmp(update, "assemble")==0) { int d = info->disk.number; + int wonly = sb->disks[d].state & (1<disks[d].state &= ~(1<disks[d].state != info->disk.state) { - sb->disks[d].state = info->disk.state; + sb->disks[d].state = info->disk.state & wonly; rv = 1; } } @@ -467,7 +473,7 @@ static int store_super0(struct supertype *st, int fd, void *sbv) static int write_init_super0(struct supertype *st, void *sbv, mdu_disk_info_t *dinfo, char *devname) { mdp_super_t *sb = sbv; - int fd = open(devname, O_RDWR, O_EXCL); + int fd = open(devname, O_RDWR|O_EXCL); int rv; if (fd < 0) { @@ -485,6 +491,7 @@ static int write_init_super0(struct supertype *st, void *sbv, mdu_disk_info_t *d if (sb->state & (1<state |= (1<magic = __le32_to_cpu(BITMAP_MAGIC); - bms->version = __le32_to_cpu(BITMAP_MAJOR); + bms->magic = __cpu_to_le32(BITMAP_MAGIC); + bms->version = __cpu_to_le32(BITMAP_MAJOR); uuid_from_super0((int*)bms->uuid, sb); - bms->chunksize = __le32_to_cpu(chunk); - bms->daemon_sleep = __le32_to_cpu(delay); - bms->sync_size = __le64_to_cpu(size); + bms->chunksize = __cpu_to_le32(chunk); + bms->daemon_sleep = __cpu_to_le32(delay); + bms->sync_size = __cpu_to_le64(size); + bms->write_behind = __cpu_to_le32(write_behind); @@ -776,6 +785,7 @@ int write_bitmap0(struct supertype *st, int fd, void *sbv) else break; } + fsync(fd); if (towrite) rv = -2; -- cgit v1.2.3