1050
1051 case MDRR_CHILD:
1052 /* it's ok to have multiple children */
1053 break;
1054
1055 case MDRR_SELF:
1056 /* it's never ok to have multiple self transitions */
1057 /* FALLTHROUGH */
1058 default:
1059 goto out;
1060 }
1061 }
1062
1063 valid = TRUE;
1064 out:
1065 if (!valid) {
1066 if (md_rename_debug != 0) {
1067 cmn_err(CE_NOTE, "previous: %d, current: %d, role: %s",
1068 previous, current,
1069 ROLE(delta->old_role));
1070 delay(3*drv_usectohz(1000000));
1071 ASSERT(FALSE);
1072 }
1073 }
1074
1075 return (valid);
1076 }
1077
1078 static role_change_tab_t *
1079 lookup_role(md_renrole_t old_role, md_renrole_t new_role)
1080 {
1081 role_change_tab_t *rp;
1082 role_change_tab_t *found = NULL;
1083
1084 for (rp = role_swap_tab; !found && (rp->old_role != MDRR_UNK); rp++) {
1085
1086 if (rp->old_role == old_role && rp->new_role == new_role) {
1087 found = rp;
1088 }
1089 }
1090 /*
1203 cmn_err(CE_NOTE,
1204 "revision: %d, uflags: %d, rec_idx: %d, n_recids: %d, rec_ids: %p%s",
1205 rtxnp->revision, rtxnp->uflags,
1206 rtxnp->rec_idx, rtxnp->n_recids, (void *) rtxnp->recids,
1207 rtxnp->stat.trans_in_stack? " (trans in stack)": "");
1208 cmn_err(CE_NOTE, " from: beginning: %llx",
1209 rtxnp->from.beginning);
1210 cmn_err(CE_NOTE, " minor: %lX, key: %lX",
1211 (ulong_t)rtxnp->from.mnum, (ulong_t)rtxnp->from.key);
1212 cmn_err(CE_NOTE, " unp: %lX, uip: %lX",
1213 (ulong_t)rtxnp->from.unp, (ulong_t)rtxnp->from.uip);
1214 cmn_err(CE_NOTE, " end: %llx", rtxnp->from.end);
1215 cmn_err(CE_NOTE, " to: beginning: %llx", rtxnp->to.beginning);
1216 cmn_err(CE_NOTE, " minor: %lX, key: %lX",
1217 (ulong_t)rtxnp->to.mnum, (ulong_t)rtxnp->to.key);
1218 cmn_err(CE_NOTE, " unp: %lX, uip: %lX",
1219 (ulong_t)rtxnp->to.unp, (ulong_t)rtxnp->to.uip);
1220 cmn_err(CE_NOTE, " end: %llx", rtxnp->to.end);
1221 cmn_err(CE_NOTE, "end: %llx\n", rtxnp->end);
1222 }
1223 delay(drv_usectohz(1000000));
1224 }
1225
1226 /*
1227 * dump contents of all deltas
1228 */
1229 static void
1230 dump_dtree(md_rendelta_t *family)
1231 {
1232 md_rendelta_t *r;
1233 int i;
1234
1235 if (md_rename_debug == 0) {
1236 return;
1237 }
1238
1239 for (r = family, i = 0; r; r = r->next, i++) {
1240 cmn_err(CE_NOTE, "%d. beginning: %llx", i, r->beginning);
1241 cmn_err(CE_NOTE, " r: %lX, dev: %lX, next: %lx, prev: %lx",
1242 (ulong_t)r, (ulong_t)r->dev,
1243 (ulong_t)r->next, (ulong_t)r->prev);
1244
1245 cmn_err(CE_NOTE, " role: %s -> %s, unp: %lx, uip: %lx",
1246 ROLE(r->old_role), ROLE(r->new_role),
1247 (ulong_t)r->unp, (ulong_t)r->uip);
1248 cmn_err(CE_NOTE,
1249 " lock: %lx, unlock: %lx\n\t check: %lx, role_swap: %lx",
1250 (ulong_t)r->lock, (ulong_t)r->unlock,
1251 (ulong_t)r->check, (ulong_t)r->role_swap);
1252 if (*((uint_t *)(&r->txn_stat)) != 0) {
1253 cmn_err(CE_NOTE, "status: (0x%x) %s%s%s%s%s",
1254 *((uint_t *)(&r->txn_stat)),
1255 r->txn_stat.is_open? "is_open " : "",
1256 r->txn_stat.locked? "locked " : "",
1257 r->txn_stat.checked? "checked " : "",
1258 r->txn_stat.role_swapped? "role_swapped " : "",
1259 r->txn_stat.unlocked? "unlocked" : "");
1260 }
1261 cmn_err(CE_NOTE, "end: %llx\n", r->end);
1262 }
1263 delay(drv_usectohz(1000000));
1264 }
1265
1266 /*
1267 * validate the rename request parameters
1268 */
1269 static int
1270 validate_txn_parms(md_rentxn_t *rtxnp)
1271 {
1272 minor_t to_min, from_min;
1273
1274 ASSERT(rtxnp);
1275
1276 from_min = rtxnp->from.mnum;
1277 to_min = rtxnp->to.mnum;
1278
1279 switch (rtxnp->revision) {
1280 case MD_RENAME_VERSION_OFFLINE:
1281 if (rtxnp->uflags != 0) {
1282 (void) mdmderror(&rtxnp->mde, MDE_RENAME_CONFIG_ERROR,
1283 from_min);
|
1050
1051 case MDRR_CHILD:
1052 /* it's ok to have multiple children */
1053 break;
1054
1055 case MDRR_SELF:
1056 /* it's never ok to have multiple self transitions */
1057 /* FALLTHROUGH */
1058 default:
1059 goto out;
1060 }
1061 }
1062
1063 valid = TRUE;
1064 out:
1065 if (!valid) {
1066 if (md_rename_debug != 0) {
1067 cmn_err(CE_NOTE, "previous: %d, current: %d, role: %s",
1068 previous, current,
1069 ROLE(delta->old_role));
1070 delay(drv_sectohz(3));
1071 ASSERT(FALSE);
1072 }
1073 }
1074
1075 return (valid);
1076 }
1077
1078 static role_change_tab_t *
1079 lookup_role(md_renrole_t old_role, md_renrole_t new_role)
1080 {
1081 role_change_tab_t *rp;
1082 role_change_tab_t *found = NULL;
1083
1084 for (rp = role_swap_tab; !found && (rp->old_role != MDRR_UNK); rp++) {
1085
1086 if (rp->old_role == old_role && rp->new_role == new_role) {
1087 found = rp;
1088 }
1089 }
1090 /*
1203 cmn_err(CE_NOTE,
1204 "revision: %d, uflags: %d, rec_idx: %d, n_recids: %d, rec_ids: %p%s",
1205 rtxnp->revision, rtxnp->uflags,
1206 rtxnp->rec_idx, rtxnp->n_recids, (void *) rtxnp->recids,
1207 rtxnp->stat.trans_in_stack? " (trans in stack)": "");
1208 cmn_err(CE_NOTE, " from: beginning: %llx",
1209 rtxnp->from.beginning);
1210 cmn_err(CE_NOTE, " minor: %lX, key: %lX",
1211 (ulong_t)rtxnp->from.mnum, (ulong_t)rtxnp->from.key);
1212 cmn_err(CE_NOTE, " unp: %lX, uip: %lX",
1213 (ulong_t)rtxnp->from.unp, (ulong_t)rtxnp->from.uip);
1214 cmn_err(CE_NOTE, " end: %llx", rtxnp->from.end);
1215 cmn_err(CE_NOTE, " to: beginning: %llx", rtxnp->to.beginning);
1216 cmn_err(CE_NOTE, " minor: %lX, key: %lX",
1217 (ulong_t)rtxnp->to.mnum, (ulong_t)rtxnp->to.key);
1218 cmn_err(CE_NOTE, " unp: %lX, uip: %lX",
1219 (ulong_t)rtxnp->to.unp, (ulong_t)rtxnp->to.uip);
1220 cmn_err(CE_NOTE, " end: %llx", rtxnp->to.end);
1221 cmn_err(CE_NOTE, "end: %llx\n", rtxnp->end);
1222 }
1223 delay(drv_sectohz(1));
1224 }
1225
1226 /*
1227 * dump contents of all deltas
1228 */
1229 static void
1230 dump_dtree(md_rendelta_t *family)
1231 {
1232 md_rendelta_t *r;
1233 int i;
1234
1235 if (md_rename_debug == 0) {
1236 return;
1237 }
1238
1239 for (r = family, i = 0; r; r = r->next, i++) {
1240 cmn_err(CE_NOTE, "%d. beginning: %llx", i, r->beginning);
1241 cmn_err(CE_NOTE, " r: %lX, dev: %lX, next: %lx, prev: %lx",
1242 (ulong_t)r, (ulong_t)r->dev,
1243 (ulong_t)r->next, (ulong_t)r->prev);
1244
1245 cmn_err(CE_NOTE, " role: %s -> %s, unp: %lx, uip: %lx",
1246 ROLE(r->old_role), ROLE(r->new_role),
1247 (ulong_t)r->unp, (ulong_t)r->uip);
1248 cmn_err(CE_NOTE,
1249 " lock: %lx, unlock: %lx\n\t check: %lx, role_swap: %lx",
1250 (ulong_t)r->lock, (ulong_t)r->unlock,
1251 (ulong_t)r->check, (ulong_t)r->role_swap);
1252 if (*((uint_t *)(&r->txn_stat)) != 0) {
1253 cmn_err(CE_NOTE, "status: (0x%x) %s%s%s%s%s",
1254 *((uint_t *)(&r->txn_stat)),
1255 r->txn_stat.is_open? "is_open " : "",
1256 r->txn_stat.locked? "locked " : "",
1257 r->txn_stat.checked? "checked " : "",
1258 r->txn_stat.role_swapped? "role_swapped " : "",
1259 r->txn_stat.unlocked? "unlocked" : "");
1260 }
1261 cmn_err(CE_NOTE, "end: %llx\n", r->end);
1262 }
1263 delay(drv_sectohz(1));
1264 }
1265
1266 /*
1267 * validate the rename request parameters
1268 */
1269 static int
1270 validate_txn_parms(md_rentxn_t *rtxnp)
1271 {
1272 minor_t to_min, from_min;
1273
1274 ASSERT(rtxnp);
1275
1276 from_min = rtxnp->from.mnum;
1277 to_min = rtxnp->to.mnum;
1278
1279 switch (rtxnp->revision) {
1280 case MD_RENAME_VERSION_OFFLINE:
1281 if (rtxnp->uflags != 0) {
1282 (void) mdmderror(&rtxnp->mde, MDE_RENAME_CONFIG_ERROR,
1283 from_min);
|