summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/lvm
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys/lvm')
-rw-r--r--usr/src/uts/common/sys/lvm/md_mirror.h39
-rw-r--r--usr/src/uts/common/sys/lvm/md_sp.h11
-rw-r--r--usr/src/uts/common/sys/lvm/mdio.h33
-rw-r--r--usr/src/uts/common/sys/lvm/mdmn_commd.x52
-rw-r--r--usr/src/uts/common/sys/lvm/mdvar.h6
5 files changed, 120 insertions, 21 deletions
diff --git a/usr/src/uts/common/sys/lvm/md_mirror.h b/usr/src/uts/common/sys/lvm/md_mirror.h
index f32b99a426..fc6bca9b07 100644
--- a/usr/src/uts/common/sys/lvm/md_mirror.h
+++ b/usr/src/uts/common/sys/lvm/md_mirror.h
@@ -18,6 +18,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
@@ -30,6 +31,9 @@
#include <sys/lvm/mdvar.h>
#include <sys/lvm/md_mirror_shared.h>
#include <sys/lvm/md_rename.h>
+#ifdef _KERNEL
+#include <sys/sunddi.h>
+#endif
#ifdef __cplusplus
extern "C" {
@@ -331,9 +335,24 @@ typedef struct mm_mirror_ic {
kcondvar_t un_dmr_cv; /* condvar for DMR requests */
int un_dmr_last_read; /* last DMR submirror read */
callb_cpr_t un_rs_cprinfo; /* CPR info for resync thread */
- kmutex_t un_rs_cpr_mx; /* Mutex for CPR info */
+ kmutex_t un_rs_cpr_mx; /* mutex for resync CPR info */
+ kmutex_t un_prr_cpr_mx; /* mutex for prr CPR info */
uint_t un_resync_completed; /* type of last resync */
int un_abr_count; /* count of sp's with abr set */
+
+ uchar_t *un_pernode_dirty_bm[MD_MNMAXSIDES];
+ uchar_t *un_pernode_dirty_sum;
+
+ krwlock_t un_pernode_dirty_mx[MD_MNMAXSIDES];
+ ushort_t un_rr_clean_start_bit; /* where to start next clean */
+
+#ifdef _KERNEL
+ ddi_taskq_t *un_drl_task; /* deferred RR_CLEAN taskq */
+#else
+ void *un_drl_task; /* deferred RR_CLEAN taskq */
+#endif /* _KERNEL */
+ uint_t un_waiting_to_clear; /* Blocked waiting to clear */
+
}mm_mirror_ic_t;
#define MM_MN_OWNER_SENT 0x0001 /* RPC in progress */
@@ -416,9 +435,15 @@ typedef struct mm_unit {
#define un_dmr_last_read un_mmic.un_dmr_last_read
#define un_rs_cprinfo un_mmic.un_rs_cprinfo
#define un_rs_cpr_mx un_mmic.un_rs_cpr_mx
+#define un_prr_cpr_mx un_mmic.un_prr_cpr_mx
#define un_resync_completed un_mmic.un_resync_completed
#define un_abr_count un_mmic.un_abr_count
-
+#define un_pernode_dirty_bm un_mmic.un_pernode_dirty_bm
+#define un_pernode_dirty_sum un_mmic.un_pernode_dirty_sum
+#define un_pernode_dirty_mx un_mmic.un_pernode_dirty_mx
+#define un_rr_clean_start_bit un_mmic.un_rr_clean_start_bit
+#define un_drl_task un_mmic.un_drl_task
+#define un_waiting_to_clear un_mmic.un_waiting_to_clear
#define MM_RF_GATECLOSED 0x0001
#define MM_RF_COMMIT_NEEDED 0x0002
@@ -497,6 +522,12 @@ typedef struct optim_resync {
#define IS_KEEPDIRTY(i, un) (isset((un)->un_resync_bm, (i)))
#define CLR_KEEPDIRTY(i, un) (clrbit((un)->un_resync_bm, (i)))
+#define IS_PERNODE_DIRTY(n, i, un) \
+ (isset((un)->un_pernode_dirty_bm[(n)-1], (i)))
+#define CLR_PERNODE_DIRTY(n, i, un) \
+ (clrbit((un)->un_pernode_dirty_bm[(n)-1], (i)))
+#define SET_PERNODE_DIRTY(n, i, un) \
+ (setbit((un)->un_pernode_dirty_bm[(n)-1], (i)))
/*
* Write-On-Write handling.
@@ -579,13 +610,15 @@ extern int mirror_resync_unit(minor_t mnum, md_resync_ioctl_t *ri,
md_error_t *ep, IOLOCK *);
extern int mirror_ioctl_resync(md_resync_ioctl_t *p, IOLOCK *);
extern int mirror_mark_resync_region(mm_unit_t *, diskaddr_t,
- diskaddr_t);
+ diskaddr_t, md_mn_nodeid_t);
extern void resync_start_timeout(set_t setno);
extern int mirror_resize_resync_regions(mm_unit_t *, diskaddr_t);
extern int mirror_add_resync_regions(mm_unit_t *, diskaddr_t);
extern int mirror_probedevs(md_probedev_t *, IOLOCK *);
extern void mirror_copy_rr(int, uchar_t *, uchar_t *);
extern void mirror_process_unit_resync(mm_unit_t *);
+extern int mirror_set_dirty_rr(md_mn_rr_dirty_params_t *);
+extern int mirror_set_clean_rr(md_mn_rr_clean_params_t *);
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/lvm/md_sp.h b/usr/src/uts/common/sys/lvm/md_sp.h
index 4cf2725364..5aa3547b24 100644
--- a/usr/src/uts/common/sys/lvm/md_sp.h
+++ b/usr/src/uts/common/sys/lvm/md_sp.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -19,16 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS__MD_SP_H
#define _SYS__MD_SP_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/lvm/mdvar.h>
#ifdef __cplusplus
@@ -99,6 +97,7 @@ typedef enum sp_ext_type {
#define MD_IOC_SPSTATUS (MDIOC_MISC|0)
#define MD_IOC_SPUPDATEWM (MDIOC_MISC|1)
#define MD_IOC_SPREADWM (MDIOC_MISC|2)
+#define MD_MN_IOC_SPUPDATEWM (MDIOC_MISC|3)
#ifdef _KERNEL
diff --git a/usr/src/uts/common/sys/lvm/mdio.h b/usr/src/uts/common/sys/lvm/mdio.h
index 1cedfe2bc6..e604a98795 100644
--- a/usr/src/uts/common/sys/lvm/mdio.h
+++ b/usr/src/uts/common/sys/lvm/mdio.h
@@ -18,16 +18,15 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS__MDIO_H
#define _SYS__MDIO_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/debug.h>
#include <sys/ioctl.h>
#include <sys/types.h>
@@ -433,6 +432,31 @@ typedef struct md_mkdev_params {
unit_t un;
} md_mkdev_params_t;
+#define MDMN_RR_CLEAN_PARAMS_DATA(x) ((unsigned char *)(x) + \
+ sizeof (md_mn_rr_clean_params_t))
+#define MDMN_RR_CLEAN_PARAMS_SIZE(x) (sizeof (md_mn_rr_clean_params_t) + \
+ MDMN_RR_CLEAN_PARAMS_DATA_BYTES(x))
+#define MDMN_RR_CLEAN_PARAMS_START_BIT(x) ((x)->rr_start_size >> 16)
+#define MDMN_RR_CLEAN_PARAMS_DATA_BYTES(x) ((x)->rr_start_size & 0xffff)
+
+typedef struct md_mn_rr_clean_params {
+ MD_DRIVER
+ md_error_t mde;
+ md_mn_nodeid_t rr_nodeid;
+ minor_t rr_mnum;
+ unsigned int rr_start_size; /* start_bit (16b) | data_bytes (16b) */
+ /* actual data goes here */
+} md_mn_rr_clean_params_t;
+
+typedef struct md_mn_rr_dirty_params {
+ MD_DRIVER
+ md_error_t mde;
+ minor_t rr_mnum;
+ md_mn_nodeid_t rr_nodeid;
+ ushort_t rr_start; /* First RR region to mark */
+ ushort_t rr_end; /* Last RR region to mark */
+} md_mn_rr_dirty_params_t;
+
/*
* Flags to coordinate sending device id between kernel and user space.
* To get devid from kernel:
@@ -756,7 +780,8 @@ typedef struct md_regen_param {
#define MD_IOCGET_HSP_NM (MDIOC|105) /* get hsp entry from namespace */
#define MD_IOCREM_DEV (MDIOC|106) /* remove device node for unit */
#define MD_IOCUPDATE_NM_RR_DID (MDIOC|107) /* update remotely repl did in NM */
-
+#define MD_MN_RR_DIRTY (MDIOC|108) /* Mark RR range as dirty */
+#define MD_MN_RR_CLEAN (MDIOC|109) /* Clean RR bits from bitmap */
#define MDIOC_MISC (MDIOC|128) /* misc module base */
/* Used in DEBUG_TEST code */
diff --git a/usr/src/uts/common/sys/lvm/mdmn_commd.x b/usr/src/uts/common/sys/lvm/mdmn_commd.x
index 3971eb9e00..3ec7b1fff4 100644
--- a/usr/src/uts/common/sys/lvm/mdmn_commd.x
+++ b/usr/src/uts/common/sys/lvm/mdmn_commd.x
@@ -20,11 +20,10 @@
% */
%
%/*
-% * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+% * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
% * Use is subject to license terms.
% */
%
-%#pragma ident "%Z%%M% %I% %E% SMI"
%#include <sys/types.h>
%#include <sys/types32.h>
@@ -103,6 +102,8 @@ enum md_mn_msgtype_t {
MD_MN_MSG_SETSYNC, /* Set resync status */
MD_MN_MSG_POKE_HOTSPARES, /* Call poke_hotspares */
MD_MN_MSG_ADDMDNAME, /* Add metadevice name */
+ MD_MN_MSG_RR_DIRTY, /* Mark RR range as dirty */
+ MD_MN_MSG_RR_CLEAN, /* Mark RR range as clean */
MD_MN_NMESSAGES /* insert elements before */
};
@@ -361,6 +362,39 @@ struct md_mn_msg_pokehsp_t {
minor_t pokehsp_setno;
};
+/* Message format for MD_MN_MSG_RR_DIRTY message */
+struct md_mn_msg_rr_dirty_t {
+ minor_t rr_mnum;
+ int rr_nodeid;
+ u_int rr_range; /* Start(16bits) | End(16bits) */
+};
+
+/* Message format for MD_MN_MSG_RR_CLEAN message */
+%#define MDMN_MSG_RR_CLEAN_DATA_MAX_BYTES \
+% ((MDMN_MAX_KMSG_DATA) - \
+% sizeof (struct md_mn_msg_rr_clean_t))
+%#define MDMN_MSG_RR_CLEAN_SIZE_DATA(x) \
+% (sizeof (struct md_mn_msg_rr_clean_t) + (x))
+%#define MDMN_MSG_RR_CLEAN_MSG_SIZE(x) \
+% (sizeof (struct md_mn_msg_rr_clean_t) \
+% + MDMN_MSG_RR_CLEAN_DATA_BYTES(x))
+%#define MDMN_MSG_RR_CLEAN_DATA(x) \
+% ((unsigned char *)(x) + \
+% sizeof (struct md_mn_msg_rr_clean_t))
+
+/* since we cannot use ushorts, some macros to extract the parts from an int */
+%#define MDMN_MSG_RR_CLEAN_START_BIT(x) ((x)->rr_start_size >> 16)
+%#define MDMN_MSG_RR_CLEAN_DATA_BYTES(x) ((x)->rr_start_size & 0xffff)
+%#define MDMN_MSG_RR_CLEAN_START_SIZE_SET(x, start, size) \
+% ((x)->rr_start_size = (start << 16) | size)
+
+struct md_mn_msg_rr_clean_t {
+ md_mn_nodeid_t rr_nodeid;
+ unsigned int rr_mnum;
+ unsigned int rr_start_size; /* start_bit (16b) | data_bytes (16b) */
+ /* actual data goes here */
+};
+
%#define MD_MSGF_NO_LOG 0x00000001
%#define MD_MSGF_NO_BCAST 0x00000002
%#define MD_MSGF_STOP_ON_ERROR 0x00000004
@@ -373,6 +407,9 @@ struct md_mn_msg_pokehsp_t {
%#define MD_MSGF_FAIL_ON_SUSPEND 0x00000200
%#define MD_MSGF_NO_MCT 0x00000400
%#define MD_MSGF_PANIC_WHEN_INCONSISTENT 0x00000800
+%#define MD_MSGF_BLK_SIGNAL 0x00001000
+%#define MD_MSGF_KSEND_NORETRY 0x00002000
+%#define MD_MSGF_DIRECTED 0x00004000
%#define MD_MSGF_VERBOSE 0x10000000
%#define MD_MSGF_VERBOSE_2 0x20000000
@@ -418,7 +455,8 @@ struct md_mn_msg_t {
u_int msg_flags; /* See MD_MSGF_* above */
set_t msg_setno; /* which set is involved */
md_mn_msgtype_t msg_type; /* what type of message */
- char msg_spare[32]; /* Always good to hav'em */
+ md_mn_nodeid_t msg_recipient; /* who to send DIRECTED message to */
+ char msg_spare[28]; /* Always good to hav'em */
opaque msg_event<>; /* the actual event wrapped up */
};
%#define msg_event_data msg_event.msg_event_val
@@ -435,7 +473,8 @@ struct md_mn_msg_od_t {
uint32_t msg_flags; /* See MD_MSGF_* above */
set_t msg_setno; /* which set is involved */
md_mn_msgtype_t msg_type; /* what type of message */
- char msg_spare[32]; /* Always good to hav'em */
+ md_mn_nodeid_t msg_recipient; /* who to send DIRECTED message to */
+ char msg_spare[28]; /* Always good to hav'em */
uint32_t msg_ev_len;
char msg_ev_val[MD_MN_MSG_MAXDATALEN];
};
@@ -450,6 +489,7 @@ struct md_mn_kmsg_t {
u_int kmsg_flags;
set_t kmsg_setno;
md_mn_msgtype_t kmsg_type;
+ md_mn_nodeid_t kmsg_recipient; /* who to send DIRECTED message to */
int kmsg_size;
char kmsg_data[MDMN_MAX_KMSG_DATA];
};
@@ -549,7 +589,7 @@ struct md_mn_type_and_lock_t {
program MDMN_COMMD {
- version ONE {
+ version TWO {
md_mn_result_t
mdmn_send(md_mn_msg_t) = 1;
@@ -579,5 +619,5 @@ program MDMN_COMMD {
int
mdmn_comm_msglock(md_mn_type_and_lock_t) = 10;
- } = 1;
+ } = 2;
} = 100422;
diff --git a/usr/src/uts/common/sys/lvm/mdvar.h b/usr/src/uts/common/sys/lvm/mdvar.h
index c2745f51b8..8f70a29e8b 100644
--- a/usr/src/uts/common/sys/lvm/mdvar.h
+++ b/usr/src/uts/common/sys/lvm/mdvar.h
@@ -744,8 +744,8 @@ extern void freestr(char *cp);
extern int md_check_ioctl_against_unit(int, mdc_unit_t);
extern mddb_recid_t md_vtoc_to_efi_record(mddb_recid_t, set_t);
-extern int mdmn_ksend_message(set_t, md_mn_msgtype_t, uint_t, char *, int,
- md_mn_kresult_t *);
+extern int mdmn_ksend_message(set_t, md_mn_msgtype_t, uint_t,
+ md_mn_nodeid_t, char *, int, md_mn_kresult_t *);
extern void mdmn_ksend_show_error(int, md_mn_kresult_t *, const char *);
extern int mdmn_send_capability_message(minor_t, volcap_t, IOLOCK *);
extern void mdmn_clear_all_capabilities(minor_t);
@@ -755,9 +755,11 @@ extern boolean_t callb_md_mrs_cpr(void *, int);
extern void md_upd_set_unnext(set_t, unit_t);
extern int md_rem_selfname(minor_t);
extern void md_rem_hspname(set_t, mdkey_t);
+extern void *md_create_taskq(set_t, minor_t);
/* Externals from md_ioctl.c */
extern int md_mn_is_commd_present(void);
+extern int md_mn_is_commd_present_lite(void);
extern void md_mn_clear_commd_present(void);
extern int md_admin_ioctl(md_dev64_t, int, caddr_t, int, IOLOCK *lockp);
extern void md_get_geom(md_unit_t *, struct dk_geom *);