开始前小看了这段代码,导致误读,严重误导了对后续相关代码的理解
呃。。。
还是要小心谨慎勤勤恳恳啊!!!
这段代码就是把一个逻辑块号转换到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