コード例 #1
0
/*===========================================================================*
 *				check_double_indir		     *
 *===========================================================================*/
int *check_double_indir(zone_t zno)
{
	/* Check a double indirect zone and return a list of used zones */
	struct buf *buf;
	zone_t *indir, *double_indir;
	int *list = calloc(sizeof(int), BLK_SIZE/2*BLK_SIZE/2);
	int used_zones = 0;
	int l = 0;

	if (zno == 0) return NULL; //return NULL if no block referenced
	buf = get_block(fs_dev, zno, 0);
	double_indir = b_v2_ind(buf);

	for (int i = 0; i < BLK_SIZE/2; ++i){
		if (double_indir[i] == 0) break;
		indir = check_indir(double_indir[i]);
		if (indir == NULL) return NULL;
		for (int j = 0; j < BLK_SIZE/2; ++j){
			list[used_zones] = indir[j];
			used_zones++;
		}
	}
	free(indir);
	return list;
}
コード例 #2
0
ファイル: cpu.c プロジェクト: kusma/vasm
int parse_operand(char *p,int len,operand *op,int required)
{
  char *start = p;
  int indir = 0;

  p = skip(p);
  if (len>0 && required!=DATAOP && check_indir(p,start+len)) {
    indir = 1;
    p = skip(p+1);
  }

  switch (required) {
    case IMMED:
      if (*p++ != '#')
        return PO_NOMATCH;
      p = skip(p);
      break;
    case INDIR:
    case INDIRX:
    case INDX:
    case INDY:
    case DPINDIR:
      if (!indir)
        return PO_NOMATCH;
      break;
    default:
      if (indir)
        return PO_NOMATCH;
      break;
  }

  if (required < ACCU)
    op->value = parse_expr(&p);
  else
    op->value = NULL;

  switch (required) {
    case INDX:
    case INDIRX:
      if (*p++ == ',') {
        p = skip(p);
        if (toupper((unsigned char)*p++) != 'X')
          return PO_NOMATCH;
      }
      else
        return PO_NOMATCH;
      break;
    case ACCU:
      if (len != 0) {
        if (len!=1 || toupper((unsigned char)*p++) != 'A')
          return PO_NOMATCH;
      }
      break;
    case DUMX:
      if (toupper((unsigned char)*p++) != 'X')
        return PO_NOMATCH;
      break;
    case DUMY:
      if (toupper((unsigned char)*p++) != 'Y')
        return PO_NOMATCH;
      break;
  }

  if (required==INDIR || required==INDX || required==INDY
      || required==DPINDIR || required==INDIRX) {
    p = skip(p);
    if (*p++ != ')') {
      cpu_error(2);  /* missing closing parenthesis */
      return PO_CORRUPT;
    }
  }

  p = skip(p);
  if (p-start < len)
    cpu_error(1);  /* trailing garbage in operand */
  op->type = required;
  return PO_MATCH;
}
コード例 #3
0
int fs_zinfo(ino_t ino_nr,dev_t dev) {
	printf("\tFrom Zone Information...\n");
	struct inode *ino;
	int* list = malloc(sizeof(int)*NB_INODES*V2_NR_DZONES);
	int used_zones = 0;
	int indirect_zones = 0;
	int double_indirect_zones = 0;
	struct inode *rip;
	int* zones;
	zone_t *indir, *double_indir;
	struct buf *buf;
	int i, j, k = 0;
	int found = 0;

	/* Don't increase the inode refcount: it's already open anyway */
	if ((ino = get_inode(dev,ino_nr)) == NULL)
		return EINVAL;
	printf("\tInode Found:%llu\n",ino_nr);
	printf("\tPrcessing Zones\n");
	zones = ino->i_zone;

	/* Check direct zones (zones[0] --> zones[6]) */
	for (j = 0; j < V2_NR_DZONES; ++j){
		if (zones[j] == 0){ break;}
		found = 1;
		list[used_zones] = zones[j];
		printf("\tZone %d : %d\n", j, list[used_zones]);
		used_zones++;
	}
	if(found == 0) {
		printf("\tZones not allocated...\n");
	}
	/* Check indirect zones (zones[7]) */
	if (zones[j] != 0) {
		printf("\tZone %d : %d\n", j, zones[j]);
		indir = check_indir(zones[j]); //get list from indirect zone
		for (k = 0; k < BLK_SIZE/2; ++k){
			if (indir[k] == 0) break;
			printf("\t\tZone %d : %d\n", k, indir[k]);
			list[used_zones] = indir[k];
			used_zones++;
			indirect_zones++;
		}
		free(indir);

		/* Check double indirect zones (zones[8]) */
		j++;
		if (zones[j] != 0) {
			printf("\tZone %d : %d\n", j, zones[j]);
			double_indir = check_double_indir(zones[j]);
			for (int k = 0; k < BLK_SIZE/2*BLK_SIZE/2; ++k){
				if (double_indir[k] == 0) break;
				printf("\t\tZone %d : %d\n", k, double_indir[k]);
				list[used_zones] = double_indir[k];
				used_zones++;
				double_indirect_zones++;
			}
			free(double_indir);
			/* We should check triple indirect zones here (zones[10]) */
			/* but none of our device has such big files that need    */
			/* triple indirect zones.								  */
		}
	}

	return 0;
}
コード例 #4
0
/*===========================================================================*
 *				get_list_blocks_from_inodes			     *
 *===========================================================================*/
int* get_list_blocks_from_inodes(int* inodes)
{
	/* From a list of inode numbers, fetch each inode and list the
	 * blocks associated with it.
	 */
	int* list = malloc(sizeof(int)*NB_INODES*V2_NR_DZONES);
	int used_zones = 0;
	int indirect_zones = 0;
	int double_indirect_zones = 0;
	struct inode *rip;
	int* zones;
	zone_t *indir, *double_indir;
	struct buf *buf;
	int i, j, k = 0;

	/* Fetch inodes from their number */
	for (i = 0; i != NB_INODES_USED; ++i){
		printf("INODE No. %d\n", i);

		/* If inode not found, return because it is not normal */
		if ((rip = get_inode(fs_dev, inodes[i])) == NULL){
			fatal("Inode not found\n");
			return NULL;
		}
		/* If inode has no link, no bother checking the zones */
		if (rip->i_nlinks == NO_LINK){
			printf("INODE No. %d is actually free !\n", inodes[i]);
			put_inode(rip);
			continue;
		}
		zones = rip->i_zone;

		/* Check direct zones (zones[0] --> zones[6]) */
		for (j = 0; j < V2_NR_DZONES; ++j){
			if (zones[j] == 0) break;
			list[used_zones] = zones[j];
			printf("\tZone %d : %d\n", j, list[used_zones]);
			used_zones++;
		}

		/* Check indirect zones (zones[7]) */
		if (zones[j] == 0) {
			put_inode(rip); //release inode
			continue; 		//skip iteration if no indirect zone
		}
		printf("\tZone %d : %d\n", j, zones[j]);
		indir = check_indir(zones[j]); //get list from indirect zone
		for (k = 0; k < BLK_SIZE/2; ++k){
			if (indir[k] == 0) break;
			printf("\t\tZone %d : %d\n", k, indir[k]);
			list[used_zones] = indir[k];
			used_zones++;
			indirect_zones++;
		}
		free(indir);

		/* Check double indirect zones (zones[8]) */
		j++;
		if (zones[j] == 0) {
			put_inode(rip); //release inode
			continue; 		//skip iteration if no indirect zone
		}
		printf("\tZone %d : %d\n", j, zones[j]);
		double_indir = check_double_indir(zones[j]);
		for (int k = 0; k < BLK_SIZE/2*BLK_SIZE/2; ++k){
			if (double_indir[k] == 0) break;
			printf("\t\tZone %d : %d\n", k, double_indir[k]);
			list[used_zones] = double_indir[k];
			used_zones++;
			double_indirect_zones++;
		}
		free(double_indir);

		/* We should check triple indirect zones here (zones[10]) */
		/* but none of our device has such big files that need    */
		/* triple indirect zones.								  */

		/* Free inode */
		put_inode(rip);
	}
	printf("Used zones\n");
	sleep(2);
	for (int k = 0; k < used_zones; ++k){
		printf("%d, ", list[k]);
		if ((k % 5) == 0) printf("\n");
	}
	printf("\n\n");
	printf("Number of used zones:            %d\n", used_zones);
	printf("Number of indirect zones:        %d\n", indirect_zones);
	printf("Number of double indirect zones: %d\n", double_indirect_zones);
	NB_ZONES_USED_I = used_zones;
	return list;
}