summaryrefslogtreecommitdiffstats
path: root/sys/dev/softraid.c
diff options
context:
space:
mode:
authormarco <marco@openbsd.org>2007-05-29 23:20:02 +0000
committermarco <marco@openbsd.org>2007-05-29 23:20:02 +0000
commitebaee36da9551c20b43c9b389cd94086239605e7 (patch)
treee218effcaccabf22860bd210c55e84d1e8cdb286 /sys/dev/softraid.c
parentallow the control handling code to send messages back to the parent. (diff)
downloadwireguard-openbsd-ebaee36da9551c20b43c9b389cd94086239605e7.tar.xz
wireguard-openbsd-ebaee36da9551c20b43c9b389cd94086239605e7.zip
Add dirty bit for volumes
Diffstat (limited to 'sys/dev/softraid.c')
-rw-r--r--sys/dev/softraid.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index dee53cdc2fe..84af7ae27a2 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.56 2007/05/29 22:12:42 marco Exp $ */
+/* $OpenBSD: softraid.c,v 1.57 2007/05/29 23:20:02 marco Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
*
@@ -131,7 +131,7 @@ void sr_get_uuid(struct sr_uuid *);
void sr_print_uuid(struct sr_uuid *, int);
u_int32_t sr_checksum(char *, u_int32_t *, u_int32_t);
int sr_clear_metadata(struct sr_discipline *);
-int sr_save_metadata(struct sr_discipline *);
+int sr_save_metadata(struct sr_discipline *, u_int32_t);
int sr_boot_assembly(struct sr_softc *);
int sr_already_assembled(struct sr_discipline *);
int sr_validate_metadata(struct sr_softc *, dev_t,
@@ -956,11 +956,11 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
strlcpy(sd->sd_vol.sv_meta.svm_devname, dev->dv_xname,
sizeof(sd->sd_vol.sv_meta.svm_devname));
- rv = sr_save_metadata(sd); /* save metadata to disk */
- } else {
- /* XXX compare scsibus & sdXX to metadata */
}
+ /* save metadata to disk */
+ rv = sr_save_metadata(sd, SR_VOL_DIRTY);
+
#ifndef SMALL_KERNEL
if (sr_create_sensors(sd))
printf("%s: unable to create sensor for %s\n", DEVNAME(sc),
@@ -1274,6 +1274,9 @@ sr_unwind_chunks(struct sr_softc *sc, struct sr_chunk_head *cl)
void
sr_free_discipline(struct sr_discipline *sd)
{
+#ifdef SR_DEBUG
+ struct sr_softc *sc = sd->sd_sc;
+#endif
if (!sd)
return;
@@ -2090,7 +2093,7 @@ sr_already_assembled(struct sr_discipline *sd)
}
int
-sr_save_metadata(struct sr_discipline *sd)
+sr_save_metadata(struct sr_discipline *sd, u_int32_t flags)
{
struct sr_softc *sc = sd->sd_sc;
struct sr_metadata *sm = sd->sd_meta;
@@ -2151,6 +2154,7 @@ sr_save_metadata(struct sr_discipline *sd)
/* from here on out metadata is updated */
sm->ssd_ondisk++;
+ im_sv->svm_flags |= flags;
sm->ssd_vd_chk = sr_checksum(DEVNAME(sc),
(u_int32_t *)im_sv, sm->ssd_vd_size);
@@ -2537,6 +2541,8 @@ sr_shutdown(void *arg)
DNPRINTF(SR_D_DIS, "%s: sr_shutdown %s\n",
DEVNAME(sc), sd->sd_vol.sv_meta.svm_devname);
+ sr_save_metadata(sd, 0);
+
sr_shutdown_discipline(sd);
}