Print this page
XXXX introduce drv_sectohz


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);