// This assumes that li ... li+k => (c,h,0) ... (c,h,k-1) dm_ptol_result_t g4_track_bound(struct dm_disk_if *d, struct dm_pbn *pbn, int *l0, int *ln, int *remapsector) { int lbn; struct remap *r; struct dm_pbn pi; struct dm_layout_g4 *l = (struct dm_layout_g4 *)d->layout; int spt = g4_spt_pbn(d, pbn); /* Dushyanth: must set l0 and ln even if ptol() returns an error */ lbn = ptol(d, pbn, 0); //if(lbn < 0) { // return lbn; //} if(l0) { pi = *pbn; pi.sector = 0; while((*l0 = ptol(d, &pi, 0)) < 0) { pi.sector++; } ddbg_assert(*l0 < d->dm_sectors); } if(ln) { pi = *pbn; pi.sector = spt-1; while((*ln = ptol(d, &pi, 0)) < 0) { pi.sector--; ddbg_assert(pi.sector >= 0); } ddbg_assert(*ln < d->dm_sectors); } if (l0 && ln) { ddbg_assert(*l0 <= *ln); } /* Dushyanth: check error here; see comment above about setting l0, ln */ if(lbn < 0) { return lbn; } return DM_OK; }
static char * xx(char *str, struct iob *file) { register char *cp = str, *xp; char **dp; int old_dev = kernBootStruct->kernDev; int dev = (kernBootStruct->kernDev >> B_TYPESHIFT) & B_TYPEMASK; int unit = (kernBootStruct->kernDev >> B_UNITSHIFT) & B_UNITMASK; int part = (kernBootStruct->kernDev >> B_PARTITIONSHIFT) & B_PARTITIONMASK; int i; int no_dev; int biosOffset; biosOffset = unit; // set the device for (; *cp && *cp != LP; cp++) ; if (no_dev = !*cp) { // no paren found cp = str; xp = devsw[dev]; } else if (cp == str) { // paren but no device cp++; xp = devsw[dev]; } else { xp = str; cp++; } for (dp = devsw; *dp; dp++) { if ((xp[0] == *dp[0]) && (xp[1] == *(dp[0] + 1))) goto gotdev; } error("Unknown device '%c%c'\n",xp[0],xp[1]); return ((char *)-1); gotdev: if (no_dev) goto none; i = 0; while (*cp >= '0' && *cp <= '9') { i = i * 10 + *cp++ - '0'; unit = i; } biosOffset = unit; // set the device if (*cp == RP || no_dev) /* do nothing since ptol(")") returns 0 */ ; else if (*cp == ',' ) part = ptol(++cp); else if (cp[-1] == LP) part = ptol(cp); else { badoff: error("Missing offset specification\n"); return ((char *)-1); } for ( ;!no_dev ;) { if (*cp == RP) break; if (*cp++) continue; goto badoff; } none: file->i_ino.i_dev = dev = dp-devsw; file->partition = part; file->biosdev = (BIOSDEV(dev)) + biosOffset; if (dev == DEV_SD) { file->biosdev += kernBootStruct->numIDEs; } else if (dev == DEV_HD && kernBootStruct->numIDEs == 0) { error("No IDE drives detected\n"); return ((char *)-1); } kernBootStruct->kernDev = (dev << B_TYPESHIFT) | (unit << B_UNITSHIFT) | (part << B_PARTITIONSHIFT); if (kernBootStruct->kernDev != old_dev) flushdev(); devopen(str, file); if (file->i_error) return (char *)-1; if (!no_dev && *cp) cp++; gFilename = cp; return cp; }