コード例 #1
0
ファイル: dfs.c プロジェクト: sransara/rocket-science
//-----------------------------------------------------------------
// DfsReadBlock reads an allocated DFS block from the disk
// (which could span multiple physical disk blocks).  The block
// must be allocated in order to read from it.  Returns DFS_FAIL
// on failure, and the number of bytes read on success.
//-----------------------------------------------------------------
int DfsReadBlock(uint32 blocknum, dfs_block *b) {
    disk_block diskb;
    int diskblocksize;
    int factor;
    int i;
    int count = 0;
    if(!sb.valid) {
        printf("DfsReadBlock: file system is not valid\n");
        return DFS_FAIL;
    }
    // if(!(fbv[blocknum / 32] & (1 << (blocknum % 32)))) {
    //   printf("DfsReadBlock: the block %d is not allocated\n", blocknum);
    //   return DFS_FAIL;
    // }

    diskblocksize = DiskBytesPerBlock();
    factor = sb.blocksize / diskblocksize;
    for(i = 0; i < factor; i++) {
        if(DiskReadBlock((blocknum * factor) + i, &diskb) == DISK_FAIL) {
            printf("DfsReadBlock: Disk read failed copied %d of %d\n", count, sb.blocksize);
            break;
        }
        bcopy(diskb.data, &(b->data[i * diskblocksize]), diskblocksize);
        count += diskblocksize;
    }
    return count;
}
コード例 #2
0
ファイル: dfs.c プロジェクト: Nelson0409/DLX-OS
int DfsReadBlock(int blocknum, dfs_block *b) {
    int i;
    int ratio;
    disk_block disk_b;
    int disk_blocknum;

  //  printf("InDfsReadBlock\n");
    if (sb.valid == 0){
       printf("File system not open!\n");
       return DFS_FAIL;
    }
    if((blocknum<0)||(blocknum>sb.filesys_blocknum)){
       printf("Invalid blocknum = %d\n",blocknum);
       return DFS_FAIL;
    }
    if(Dfscheck(blocknum)== DFS_FAIL){
       printf("Error,DFS block %d not allocated!\n",blocknum);
       return DFS_FAIL;
     }
    
    ratio = sb.filesys_blocksize/(DISK_BLOCKSIZE);
    disk_blocknum=(blocknum*ratio);
    for(i=0;i<ratio;i++){
       if (DiskReadBlock((uint32)(disk_blocknum + i),&disk_b) == DISK_FAIL){
           printf("Cannot read block %d from disk!\n",disk_blocknum);
           return DISK_FAIL;
          }
       bcopy((char *)(&disk_b),(char *)((int)b+i*(DISK_BLOCKSIZE)),DISK_BLOCKSIZE);
    }
    return (sb.filesys_blocksize);
   
}
コード例 #3
0
ファイル: dfs.c プロジェクト: sransara/rocket-science
int DfsOpenFileSystem() {
    disk_block diskb;
    dfs_block dfsb;
    char* inbytes;
    unsigned int i;
//Basic steps:
// Check that filesystem is not already open
    if(sb.valid) {
        printf("DfsOpenFilesystem: File system is already open\n");
        return DFS_FAIL;
    }
// Read superblock from disk.  Note this is using the disk read rather
// than the DFS read function because the DFS read requires a valid
// filesystem in memory already, and the filesystem cannot be valid
// until we read the superblock. Also, we don't know the block size
// until we read the superblock, either.
    DiskReadBlock(1, &diskb);

// Copy the data from the block we just read into the superblock in memory
    bcopy(diskb.data, (char*) &sb, sizeof(sb));
    // sb should be valid at this point since sb was supposed to be valid on disk
    if(!sb.valid) {
        printf("DfsOpenFileSystem: Filesystem on disk is not valid\n");
        return DFS_FAIL;
    }

// All other blocks are sized by virtual block size:
// Read inodes
    inbytes = (char*) inodes;
    for(i = sb.inode_start_block; i < sb.fbv_start_block; i++) {
        DfsReadBlock(i, &dfsb);
        bcopy(dfsb.data, &(inbytes[(i - sb.inode_start_block) * sb.blocksize]), sb.blocksize);
    }
// Read free block vector
    inbytes = (char*) fbv;
    for(i = sb.fbv_start_block; i < sb.data_start_block; i++) {
        DfsReadBlock(i, &dfsb);
        bcopy(dfsb.data, &(inbytes[(i - sb.fbv_start_block) * sb.blocksize]), sb.blocksize);
    }
// Change superblock to be invalid, write back to disk, then change
// it back to be valid in memory
    sb.valid = 0;
    bzero(diskb.data, DISK_BLOCKSIZE);
    bcopy((char*)&sb, diskb.data, sizeof(sb));
    DiskWriteBlock(1, &diskb);
    sb.valid = 1;
    return DFS_SUCCESS;
}
コード例 #4
0
ファイル: dfs.c プロジェクト: Nelson0409/DLX-OS
int DfsOpenFileSystem() {
    int i;
    int num;
    dfs_block dfs_b;
    disk_block disk_b;
   
//Basic steps:
// Check that filesystem is not already open

// Read superblock from disk.  Note this is using the disk read rather 
// than the DFS read function because the DFS read requires a valid 
// filesystem in memory already, and the filesystem cannot be valid 
// until we read the superblock. Also, we don't know the block size 
// until we read the superblock, either.
 //  printf("In DfsOpenFileSystem\n");
// Copy the data from the block we just read into the superblock in memory

// All other blocks are sized by virtual block size:
// Read inodes
// Read free block vector
// Change superblock to be invalid, write back to disk, then change 
// it back to be valid in memory
  if (sb.valid == 1){
       printf("The filesystem is already open!\n");
       return DFS_FAIL;
     }

  if ((num = DiskReadBlock(1,&disk_b)) == DISK_FAIL){
       printf("Cannot read superblock from disk!\n");
       return DFS_FAIL;
     }

  bcopy((char *)(&disk_b),(char *)(&sb),sizeof(dfs_superblock));

//print superblock info from disk
/*  printf("superblock.valid %d\n",sb.valid);
  printf("superblock.filesys_blocksize %d\n",sb.filesys_blocksize);
  printf("superblock.filesys_blocknum %d\n",sb.filesys_blocknum);
  printf("superblock.filesys_inodestart %d\n",sb.filesys_inodestart);
  printf("superblock.inodenum %d\n",sb.inodenum);
  printf("superblock.filesys_fbvstart %d\n",sb.filesys_fbvstart);
  printf("superblock.filesys_datastart %d\n",sb.filesys_datastart);
*/
  for(i=sb.filesys_inodestart;i<sb.filesys_fbvstart;i++){
     if (( num = DfsReadBlock (i,&dfs_b)) == DFS_FAIL){
       printf("Cannot read inode from disk!\n");
       return DFS_FAIL;
        }
      bcopy((char *)(&dfs_b),(char *)(&inodes[(i-sb.filesys_inodestart)*(sb.filesys_blocksize)/sizeof(dfs_inode)]),sb.filesys_blocksize);
     }
   SetupRootDir();
//print inode info from disk
//  for(i=0;i<192;i++){
//     printf("inodes[%d].inuse=%d,inodes[%d].filesize=%d\n",i,inodes[i].inuse,i,inodes[i].filesize);
//     }
//

  for(i=sb.filesys_fbvstart;i<sb.filesys_datastart;i++){
     if (( num = DfsReadBlock(i, &dfs_b)) == DFS_FAIL){
           printf("Cannot read free block vector from disk!\n");
           return DFS_FAIL;
         }
     bcopy((char *)(&dfs_b),(char *)(&fbv[(i-sb.filesys_fbvstart)*(sb.filesys_blocksize)/sizeof(uint32)]),sb.filesys_blocksize);
    }

//print fbv info from disk
//  for(i=0;i<DFS_FBV_MAX_NUM;i++){
//     printf("fbv[%d]=0x%x\n",i,fbv[i]);
//     }
//

   DfsInvalidate();
   bzero((char *)(&disk_b),sizeof(disk_block));
   bcopy((char *)(&sb),(char *)(&disk_b),sizeof(dfs_superblock));
   if (DiskWriteBlock(1,&disk_b) == DISK_FAIL){
           printf("Cannot write superblock back to disk!\n");
           return DFS_FAIL;
   }
   sb.valid = 1;
 //  printf("Exit DfsOpenFileSystem\n");
   return DFS_SUCCESS;
}