/*===========================================================================* * 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; }
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; }
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; }
/*===========================================================================* * 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; }