Пример #1
0
// 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;
}
Пример #2
0
Файл: sys.c Проект: aosm/boot
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;
}