Changeset 155f792 in mainline for uspace/srv/fs/minixfs/mfs_read.c
- Timestamp:
- 2011-03-20T11:30:25Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6adba0a8
- Parents:
- 930baca
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/minixfs/mfs_read.c
r930baca r155f792 4 4 #include "mfs_utils.h" 5 5 6 static int read_map_v1(uint16_t *b, const struct mfs_node *mnode, int rblock); 7 static int read_map_v2(uint32_t *b, const struct mfs_node *mnode, int rblock); 6 static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock); 8 7 9 8 /*Given the position in the file expressed in … … 22 21 assert(sbi); 23 22 24 const mfs_version_t fs_version = sbi->fs_version;25 23 const int block_size = sbi->block_size; 26 24 … … 28 26 int rblock = pos / block_size; 29 27 30 if (fs_version == MFS_VERSION_V1) { 31 if (mnode->ino->i_size < (int32_t) pos) 32 return -1; 33 34 uint16_t b16 = 0; 35 r = read_map_v1(&b16, mnode, rblock); 36 *b = b16; 37 } else { 38 if (mnode->ino2->i_size < (int32_t) pos) 39 return -1; 40 41 r = read_map_v2(b, mnode, rblock); 42 } 43 44 return r; 45 } 46 47 static int read_map_v1(uint16_t *b, const struct mfs_node *mnode, int rblock) 48 { 49 const int ptrs_per_block = MFS_BLOCKSIZE / sizeof(uint16_t); 50 block_t *bi1, *bi2; 51 const struct mfs_inode *ino = mnode->ino; 52 int r; 53 54 assert(ino); 55 assert(mnode->instance); 56 57 if (rblock < V1_NR_DIRECT_ZONES) { 58 *b = ino->i_dzone[rblock]; 28 if (mnode->ino_i->i_size < (int32_t) pos) { 59 29 r = EOK; 30 *b = 0; 60 31 goto out; 61 32 } 62 33 63 rblock -= V1_NR_DIRECT_ZONES - 1; 64 65 /*Check if the wanted block is in the single indirect zone*/ 66 if (rblock < ptrs_per_block) { 67 if (ino->i_izone[0] == 0) { 68 r = -1; 69 goto out; 70 } 71 72 r = read_ind_block(bi1, mnode->instance, ino->i_izone[0]); 73 74 if (r != EOK) 75 goto out; 76 77 *b = ((uint16_t *) bi1->data)[rblock]; 78 goto out_block; 79 } 80 81 rblock -= ptrs_per_block - 1; 82 83 /*The wanted block is in the double indirect zone*/ 84 uint16_t di_block = rblock / ptrs_per_block; 85 86 /*read the first indirect zone*/ 87 if (ino->i_izone[1] == 0) { 88 r = -1; 89 goto out; 90 } 91 92 r = read_ind_block(bi1, mnode->instance, ino->i_izone[1]); 93 94 if (r != EOK) 95 goto out; 96 97 /*read the dobule indirect zone*/ 98 r = read_ind_block(bi2, mnode->instance, 99 ((uint16_t *) bi1->data)[di_block]); 100 101 if (r != EOK) 102 goto out_block; 103 104 *b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block]; 105 block_put(bi2); 106 107 out_block: 108 block_put(bi1); 34 r = read_map_ondisk(b, mnode, rblock); 109 35 out: 110 36 return r; 111 37 } 112 38 113 static int read_map_ v2(uint32_t *b, const struct mfs_node *mnode, int rblock)39 static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock) 114 40 { 115 41 block_t *bi1, *bi2; 116 int r; 42 int r, nr_direct, nr_indirect; 43 int ptrs_per_block; 117 44 118 45 assert(mnode); 119 const struct mfs 2_inode *ino2 = mnode->ino2;46 const struct mfs_ino_info *ino_i = mnode->ino_i; 120 47 121 assert(ino 2);48 assert(ino_i); 122 49 assert(mnode->instance); 123 50 … … 125 52 assert(sbi); 126 53 127 const int ptrs_per_block = sbi->block_size / sizeof(uint32_t);54 const int fs_version = sbi->fs_version; 128 55 129 if (rblock < V2_NR_DIRECT_ZONES) { 130 *b = ino2->i_dzone[rblock]; 56 if (fs_version == MFS_VERSION_V1) { 57 nr_direct = V1_NR_DIRECT_ZONES; 58 nr_indirect = V1_NR_INDIRECT_ZONES; 59 ptrs_per_block = MFS_BLOCKSIZE / sizeof(uint16_t); 60 } else { 61 nr_direct = V2_NR_DIRECT_ZONES; 62 nr_indirect = V2_NR_INDIRECT_ZONES; 63 ptrs_per_block = sbi->block_size / sizeof(uint32_t); 64 } 65 66 if (rblock < nr_direct) { 67 *b = ino_i->i_dzone[rblock]; 131 68 r = EOK; 132 69 goto out; 133 70 } 134 rblock -= V2_NR_DIRECT_ZONES- 1;71 rblock -= nr_direct - 1; 135 72 136 73 /*Check if the wanted block is in the single indirect zone*/ 137 74 if (rblock < ptrs_per_block) { 138 if (ino 2->i_izone[0] == 0) {75 if (ino_i->i_izone[0] == 0) { 139 76 r = -1; 140 77 goto out; 141 78 } 142 79 143 r = read_ind_block(bi2, mnode->instance, ino 2->i_izone[0]);80 r = read_ind_block(bi2, mnode->instance, ino_i->i_izone[0]); 144 81 145 82 if (r != EOK) 146 83 goto out; 147 84 148 *b = ((uint32_t *) bi1->data)[rblock]; 85 *b = fs_version == MFS_VERSION_V1 ? 86 ((uint16_t *) bi1->data)[rblock] : 87 ((uint32_t *) bi1->data)[rblock]; 149 88 goto out_block; 150 89 } … … 156 95 157 96 /*read the first indirect zone*/ 158 if (ino 2->i_izone[1] == 0) {97 if (ino_i->i_izone[1] == 0) { 159 98 r = -1; 160 99 goto out; 161 100 } 162 101 163 r = read_ind_block(bi1, mnode->instance, ino 2->i_izone[1]);102 r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1]); 164 103 165 104 if (r != EOK) … … 167 106 168 107 /*read the second indirect zone*/ 169 r = read_ind_block(bi2, mnode->instance, 108 if (fs_version == MFS_VERSION_V1) { 109 r = read_ind_block(bi2, mnode->instance, 110 ((uint16_t *) bi1->data)[di_block]); 111 112 if (r != EOK) 113 goto out_block; 114 115 *b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block]; 116 } else { 117 r = read_ind_block(bi2, mnode->instance, 170 118 ((uint32_t *) bi1->data)[di_block]); 171 119 172 if (r != EOK)173 goto out_block;120 if (r != EOK) 121 goto out_block; 174 122 175 *b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block]; 123 *b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block]; 124 } 176 125 block_put(bi2); 177 126
Note:
See TracChangeset
for help on using the changeset viewer.