DISK: Allow file system sizing if device doesn't have DEV_SECTORS set_cmd

As it turns out, the RD device in the MicroVAX 2000 systems reasonably
doesn't have DEV_SECTORS set in the DEVICE flags.

Follow on to #768.
This commit is contained in:
Mark Pizzolato 2019-11-16 20:57:58 -08:00
parent 39fd8d829b
commit 4e5780e15e

View file

@ -1110,8 +1110,7 @@ static t_offset get_ods2_filesystem_size (UNIT *uptr)
DEVICE *dptr; DEVICE *dptr;
t_addr saved_capac; t_addr saved_capac;
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ t_offset temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */
uint32 capac_factor;
ODS2_HomeBlock Home; ODS2_HomeBlock Home;
ODS2_FileHeader Header; ODS2_FileHeader Header;
ODS2_Retreval *Retr; ODS2_Retreval *Retr;
@ -1123,9 +1122,8 @@ t_seccnt sects_read;
if ((dptr = find_dev_from_unit (uptr)) == NULL) if ((dptr = find_dev_from_unit (uptr)) == NULL)
return ret_val; return ret_val;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac; saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 1 : 512))); uptr->capac = temp_capac;
if ((sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_read, sizeof (Home) / ctx->sector_size)) || if ((sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_read, sizeof (Home) / ctx->sector_size)) ||
(sects_read != (sizeof (Home) / ctx->sector_size))) (sects_read != (sizeof (Home) / ctx->sector_size)))
goto Return_Cleanup; goto Return_Cleanup;
@ -1198,7 +1196,6 @@ DEVICE *dptr;
t_addr saved_capac; t_addr saved_capac;
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */
uint32 capac_factor;
ODS1_HomeBlock Home; ODS1_HomeBlock Home;
ODS1_FileHeader Header; ODS1_FileHeader Header;
ODS1_Retreval *Retr; ODS1_Retreval *Retr;
@ -1211,9 +1208,8 @@ t_seccnt sects_read;
if ((dptr = find_dev_from_unit (uptr)) == NULL) if ((dptr = find_dev_from_unit (uptr)) == NULL)
return ret_val; return ret_val;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac; saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 1 : 512))); uptr->capac = temp_capac;
if ((sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_read, sizeof (Home) / ctx->sector_size)) || if ((sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_read, sizeof (Home) / ctx->sector_size)) ||
(sects_read != (sizeof (Home) / ctx->sector_size))) (sects_read != (sizeof (Home) / ctx->sector_size)))
goto Return_Cleanup; goto Return_Cleanup;
@ -1275,7 +1271,6 @@ DEVICE *dptr;
t_addr saved_capac; t_addr saved_capac;
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */
uint32 capac_factor;
uint8 sector_buf[512]; uint8 sector_buf[512];
ultrix_disklabel *Label = (ultrix_disklabel *)(sector_buf + sizeof (sector_buf) - sizeof (ultrix_disklabel)); ultrix_disklabel *Label = (ultrix_disklabel *)(sector_buf + sizeof (sector_buf) - sizeof (ultrix_disklabel));
t_offset ret_val = (t_offset)-1; t_offset ret_val = (t_offset)-1;
@ -1285,9 +1280,8 @@ t_seccnt sects_read;
if ((dptr = find_dev_from_unit (uptr)) == NULL) if ((dptr = find_dev_from_unit (uptr)) == NULL)
return ret_val; return ret_val;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac; saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 1 : 512))); uptr->capac = temp_capac;
if ((sim_disk_rdsect (uptr, 31 * (512 / ctx->sector_size), sector_buf, &sects_read, 512 / ctx->sector_size)) || if ((sim_disk_rdsect (uptr, 31 * (512 / ctx->sector_size), sector_buf, &sects_read, 512 / ctx->sector_size)) ||
(sects_read != (512 / ctx->sector_size))) (sects_read != (512 / ctx->sector_size)))
goto Return_Cleanup; goto Return_Cleanup;
@ -1394,7 +1388,6 @@ DEVICE *dptr;
t_addr saved_capac; t_addr saved_capac;
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */
uint32 capac_factor;
uint8 sector_buf[1024]; uint8 sector_buf[1024];
RT11_HomeBlock Home; RT11_HomeBlock Home;
t_seccnt sects_read; t_seccnt sects_read;
@ -1409,9 +1402,8 @@ t_offset ret_val = (t_offset)-1;
if ((dptr = find_dev_from_unit (uptr)) == NULL) if ((dptr = find_dev_from_unit (uptr)) == NULL)
return ret_val; return ret_val;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1;
saved_capac = uptr->capac; saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac / (capac_factor * ((dptr->flags & DEV_SECTORS) ? 1 : 512))); uptr->capac = temp_capac;
for (part = 0; part < RT11_MAXPARTITIONS; part++) { for (part = 0; part < RT11_MAXPARTITIONS; part++) {
uint16 seg_highest; uint16 seg_highest;
@ -2018,10 +2010,14 @@ if (container_size && (container_size != (t_offset)-1)) {
if ((container_size < current_unit_size) && if ((container_size < current_unit_size) &&
((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) { ((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) {
if (!sim_quiet) { if (!sim_quiet) {
int32 saved_switches = sim_switches;
sim_switches = SWMASK ('R');
uptr->capac = (t_addr)(container_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1))); uptr->capac = (t_addr)(container_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
sim_printf ("%s%d: non expandable disk container '%s' is smaller than simulated device (%s < ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr)); sim_printf ("%s%d: non expandable disk container '%s' is smaller than simulated device (%s < ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr));
uptr->capac = saved_capac; uptr->capac = saved_capac;
sim_printf ("%s)\n", sprint_capac (dptr, uptr)); sim_printf ("%s)\n", sprint_capac (dptr, uptr));
sim_switches = saved_switches;
} }
sim_disk_detach (uptr); sim_disk_detach (uptr);
return SCPE_OPENERR; return SCPE_OPENERR;