有逻辑块号到三级间址的转换

开始前小看了这段代码,导致误读,严重误导了对后续相关代码的理解

呃。。。

还是要小心谨慎勤勤恳恳啊!!!

这段代码就是把一个逻辑块号转换到offset数组中。


ptrs:一个物理块上可以存放多少个物理地址。

ptrs_bits :ptrs有多少位 相等于sizeof(ptrs)

direct_blocks:三级间址的数组中,表示直接地址的数量

indirect和double分别代表二级和三级的数量。

若一个地址需要三级索引来表示。

offset[0]= EXFS_TIND_BLOCK;在i_data[]数组中的偏移量,即为三间址的一级地址

offset[1] 表示的是在第一级中的偏移量

offset[2]表示 第二级中的偏移量

offset[3]表示的是第三级中的偏移量


static int exfs_block_to_path(struct inode *inode,

 322                         exfs_fsblk_t i_block, int offsets[4], int *boundary)
 323 {
 324         /* ptrs: how many block address can be stored in a block*/
 325         int ptrs = EXFS_ADDR_PER_BLOCK(inode->i_sb);
 326         int ptrs_bits = EXFS_ADDR_PER_BLOCK_BITS(inode->i_sb);
 327         const long direct_blocks = EXFS_NDIR_BLOCKS,
 328                 indirect_blocks = ptrs,
 329                 double_blocks = (1 << (ptrs_bits * 2));
 330         int n = 0;
 331         int final = 0;
 332
 333         if (i_block < 0) {
 334                 exfs_warning (inode->i_sb, "exfs_block_to_path", "block < 0");
 335         } else if (i_block < direct_blocks) {
 336                 offsets[n++] = i_block;
 337                 final = direct_blocks;
 338         } else if ( (i_block -= direct_blocks) < indirect_blocks) {
 339                 offsets[n++] = EXFS_IND_BLOCK;
 340                 offsets[n++] = i_block;
 341                 final = ptrs;
 342         } else if ((i_block -= indirect_blocks) < double_blocks) {
 343                 offsets[n++] = EXFS_DIND_BLOCK;
 344                 offsets[n++] = i_block >> ptrs_bits;
 345                 offsets[n++] = i_block & (ptrs - 1);
 346                 final = ptrs;
 347         } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
 348                 offsets[n++] = EXFS_TIND_BLOCK;
 349                 offsets[n++] = i_block >> (ptrs_bits * 2);
 350                 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
 351                 offsets[n++] = i_block & (ptrs - 1);
 352                 final = ptrs;
 353         } else {
 354                 exfs_warning (inode->i_sb, "exfs_block_to_path", "block > big");
 355         }
 356         if (boundary)
 357                 *boundary = final - 1 - (i_block & (ptrs - 1));
 358         return n;
 359 }
 360

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值