diff options
Diffstat (limited to 'usr/src/uts/common/sys/lvm')
-rw-r--r-- | usr/src/uts/common/sys/lvm/md_mirror.h | 39 | ||||
-rw-r--r-- | usr/src/uts/common/sys/lvm/md_sp.h | 11 | ||||
-rw-r--r-- | usr/src/uts/common/sys/lvm/mdio.h | 33 | ||||
-rw-r--r-- | usr/src/uts/common/sys/lvm/mdmn_commd.x | 52 | ||||
-rw-r--r-- | usr/src/uts/common/sys/lvm/mdvar.h | 6 |
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 *); |