Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.91 KB | None | 0 0
  1. int inode_write(struct inode *in, uint32_t offset, char * buf, int len)
  2. {
  3.     int result=0;
  4.     struct ssu_fs * fs = in->sn_fs;
  5.     uint32_t blkoff = offset / SSU_BLOCK_SIZE;
  6.     uint32_t res_off = offset % SSU_BLOCK_SIZE;
  7.  
  8.     if(offset > in->sn_size)
  9.         return -1;
  10.  
  11.     uint32_t lbn_start = blkoff;
  12.     uint32_t lbn_end = blkoff;
  13.     int tmplen=0; //이태까지 파일에 쓴 데이터의 길이를 저장할 변수
  14.     int pbn=-1; //lbn_to_pbn()의 결과값을 저장하는 변수
  15.  
  16.     while(tmplen < len){
  17.         /*Get Page Block Number*/
  18.         pbn = lbn_to_pbn(in, blkoff);
  19.         blkoff++;
  20.         if(pbn == -1){
  21.             printk("ERROR::Can't access Data Block!\n");
  22.             if(in->sn_size < offset+tmplen)
  23.                 in->sn_size = offset+tmplen;
  24.             sync_inode(fs, in);
  25.             return -1;
  26.         }  
  27.         /*Get Page Block*/
  28.         memset(tmpblock, 0, SSU_BLOCK_SIZE);
  29.         fs_readblock(fs, pbn, tmpblock);
  30.  
  31.         /*Write at Page Block*/
  32.         if((res_off + len - tmplen) <= SSU_BLOCK_SIZE){
  33.             memcpy(tmpblock + res_off, buf + tmplen, len-tmplen);
  34.             tmplen += len-tmplen;
  35.         }
  36.         else{
  37.             memcpy(tmpblock + res_off, buf + tmplen, SSU_BLOCK_SIZE);
  38.             tmplen += SSU_BLOCK_SIZE;
  39.         }
  40.         fs_writeblock(fs, pbn, tmpblock);
  41.         res_off = 0;
  42.     }
  43.  
  44.     if(in->sn_size < offset+len)
  45.         in->sn_size = offset+len;
  46.     sync_inode(fs, in);
  47.  
  48.     /*print info*/
  49.     lbn_end = blkoff-1;
  50.     printk("start blkoff = %d\n", lbn_start);
  51.     printk("end blkoff = %d\n", lbn_end);
  52.     printk("physical start blkoff = %d\n", lbn_to_pbn(in, lbn_start));
  53.     printk("physical end bkoff = %d\n", lbn_to_pbn(in, lbn_end));
  54.     /**/
  55.  
  56.     return result;
  57. }
  58.  
  59. int inode_read(struct inode * in, uint32_t offset, char * buf, int len)
  60. {
  61.     int result=0;
  62.     struct ssu_fs * fs = in->sn_fs;
  63.     uint32_t blkoff = offset / SSU_BLOCK_SIZE;
  64.     uint32_t res_off = offset % SSU_BLOCK_SIZE;
  65.  
  66.     if(offset > in->sn_size)
  67.         return -1;
  68.  
  69.     uint32_t lbn_start = blkoff;
  70.     uint32_t lbn_end = blkoff;
  71.     int tmplen = 0;
  72.     int pbn = -1;
  73.     while(tmplen < len){
  74.         /*Get Page Block Number*/
  75.         pbn = lbn_to_pbn(in, blkoff);
  76.         blkoff++;
  77.         if(pbn < 0){
  78.             printk("ERROR::Can't access Data Block!\n");
  79.             return -1;
  80.         }
  81.  
  82.         memset(tmpblock, 0, SSU_BLOCK_SIZE);
  83.         fs_readblock(fs, pbn, tmpblock);
  84.         /*Read Page Block*/
  85.         if((res_off + len - tmplen) <= SSU_BLOCK_SIZE){
  86.             memcpy(buf+tmplen, tmpblock + res_off, len-tmplen);
  87.             tmplen += len-tmplen;
  88.         }
  89.         else{
  90.             memcpy(buf+tmplen, tmpblock+res_off, SSU_BLOCK_SIZE);
  91.             tmplen += SSU_BLOCK_SIZE;
  92.         }
  93.         res_off = 0;
  94.     }
  95.  
  96.     /*print info*/
  97.     lbn_end = blkoff-1;
  98.     if(lbn_start < lbn_end){
  99.         printk("start blkoff = %d\n", lbn_start);
  100.         printk("end blkoff = %d\n", lbn_end);
  101.         printk("physical start blkoff = %d\n", lbn_to_pbn(in, lbn_start));
  102.         printk("physical end bkoff = %d\n", lbn_to_pbn(in, lbn_end));
  103.     }
  104.     /**/
  105.  
  106.     return result;
  107. }
  108.  
  109. int lbn_to_pbn(struct inode * in, uint32_t lbn)
  110. {
  111.     struct ssu_fs * fs = in->sn_fs;
  112.     int pbn=0;
  113.  
  114.     if(lbn < 2){
  115.         /*Get Page Direct Block*/
  116.         if(lbn < in->sn_nlink){
  117.             pbn = in->sn_directblock[lbn];
  118.         }
  119.         else{
  120.             balloc(fs->fs_blkmap, &pbn);
  121.             in->sn_nlink++;
  122.             sync_bitmapblock(fs);
  123.             in->sn_directblock[lbn] = pbn;
  124.         }
  125.         return pbn;
  126.     }
  127.  
  128.     /*Get Page Indirect Block*/
  129.     int ilbn = (lbn-2)/1024;
  130.     int dlbn = (lbn-2)%1024;   
  131.     memset(tmpblock_indirect, 0, SSU_BLOCK_SIZE);
  132.     if(ilbn < in->cnt_data_block)
  133.     {
  134.         //nothing
  135.     }
  136.     else{
  137.         balloc(fs->fs_blkmap, &(in->sn_indirectblock[ilbn]));
  138.         in->cnt_data_block++;
  139.         in->sn_nlink++;
  140.         sync_bitmapblock(fs);
  141.     }
  142.  
  143.     /*Get Page Block from Indirect Block*/
  144.     fs_readblock(fs, in->sn_indirectblock[ilbn], tmpblock_indirect);
  145.     int nbuf=-1;
  146.     if(lbn < (in->sn_nlink - in->cnt_data_block))
  147.     {
  148.         memcpy(&nbuf, tmpblock_indirect + 4*dlbn, 4);
  149.         pbn = nbuf;
  150.     }
  151.     else{
  152.         balloc(fs->fs_blkmap, &pbn);
  153.         in->sn_nlink++;
  154.         sync_bitmapblock(fs);
  155.  
  156.         memcpy(tmpblock_indirect + 4*dlbn, &pbn, 4);
  157.         fs_writeblock(fs, in->sn_indirectblock[ilbn], tmpblock_indirect);
  158.         sync_inode(fs, in);
  159.  
  160.         memcpy(&nbuf, tmpblock_indirect + 4*dlbn, 4);
  161.     }
  162.     return pbn;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement