HPFS: Fix endianity. Make hpfs work on big-endian machines

Fix endianity. Make hpfs work on big-endian machines.

Signed-off-by: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Mikulas Patocka and committed by Linus Torvalds 0b69760b bc8728ee

+498 -418
+32 -36
fs/hpfs/alloc.c
··· 16 static int chk_if_allocated(struct super_block *s, secno sec, char *msg) 17 { 18 struct quad_buffer_head qbh; 19 - unsigned *bmp; 20 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "chk"))) goto fail; 21 - if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f)) & 1) { 22 hpfs_error(s, "sector '%s' - %08x not allocated in bitmap", msg, sec); 23 goto fail1; 24 } ··· 26 if (sec >= hpfs_sb(s)->sb_dirband_start && sec < hpfs_sb(s)->sb_dirband_start + hpfs_sb(s)->sb_dirband_size) { 27 unsigned ssec = (sec - hpfs_sb(s)->sb_dirband_start) / 4; 28 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto fail; 29 - if ((bmp[ssec >> 5] >> (ssec & 0x1f)) & 1) { 30 hpfs_error(s, "sector '%s' - %08x not allocated in directory bitmap", msg, sec); 31 goto fail1; 32 } ··· 82 ret = bs + nr; 83 goto rt; 84 } 85 - /*if (!tstbits(bmp, nr + n, n + forward)) { 86 - ret = bs + nr + n; 87 - goto rt; 88 - }*/ 89 q = nr + n; b = 0; 90 while ((a = tstbits(bmp, q, n + forward)) != 0) { 91 q += a; ··· 98 goto rt; 99 } 100 nr >>= 5; 101 - /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) {*/ 102 i = nr; 103 do { 104 - if (!bmp[i]) goto cont; 105 - if (n + forward >= 0x3f && bmp[i] != -1) goto cont; 106 q = i<<5; 107 if (i > 0) { 108 - unsigned k = bmp[i-1]; 109 while (k & 0x80000000) { 110 q--; k <<= 1; 111 } ··· 125 } while (i != nr); 126 rt: 127 if (ret) { 128 - if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (bmp[(ret & 0x3fff) >> 5] | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { 129 hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret); 130 ret = 0; 131 goto b; 132 } 133 - bmp[(ret & 0x3fff) >> 5] &= ~(((1 << n) - 1) << (ret & 0x1f)); 134 hpfs_mark_4buffers_dirty(&qbh); 135 } 136 b: ··· 236 int hpfs_alloc_if_possible(struct super_block *s, secno sec) 237 { 238 struct quad_buffer_head qbh; 239 - unsigned *bmp; 240 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "aip"))) goto end; 241 - if (bmp[(sec & 0x3fff) >> 5] & (1 << (sec & 0x1f))) { 242 - bmp[(sec & 0x3fff) >> 5] &= ~(1 << (sec & 0x1f)); 243 hpfs_mark_4buffers_dirty(&qbh); 244 hpfs_brelse4(&qbh); 245 return 1; ··· 254 void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) 255 { 256 struct quad_buffer_head qbh; 257 - unsigned *bmp; 258 struct hpfs_sb_info *sbi = hpfs_sb(s); 259 /*printk("2 - ");*/ 260 if (!n) return; ··· 269 return; 270 } 271 new_tst: 272 - if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f) & 1)) { 273 hpfs_error(s, "sector %08x not allocated", sec); 274 hpfs_brelse4(&qbh); 275 return; 276 } 277 - bmp[(sec & 0x3fff) >> 5] |= 1 << (sec & 0x1f); 278 if (!--n) { 279 hpfs_mark_4buffers_dirty(&qbh); 280 hpfs_brelse4(&qbh); ··· 299 int n_bmps = (hpfs_sb(s)->sb_fs_size + 0x4000 - 1) >> 14; 300 int b = hpfs_sb(s)->sb_c_bitmap & 0x0fffffff; 301 int i, j; 302 - unsigned *bmp; 303 struct quad_buffer_head qbh; 304 if ((bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 305 for (j = 0; j < 512; j++) { 306 unsigned k; 307 - if (!bmp[j]) continue; 308 - for (k = bmp[j]; k; k >>= 1) if (k & 1) if (!--n) { 309 hpfs_brelse4(&qbh); 310 return 0; 311 } ··· 324 chk_bmp: 325 if (bmp) { 326 for (j = 0; j < 512; j++) { 327 - unsigned k; 328 - if (!bmp[j]) continue; 329 for (k = 0xf; k; k <<= 4) 330 - if ((bmp[j] & k) == k) { 331 if (!--n) { 332 hpfs_brelse4(&qbh); 333 return 0; ··· 351 hpfs_free_sectors(s, dno, 4); 352 } else { 353 struct quad_buffer_head qbh; 354 - unsigned *bmp; 355 unsigned ssec = (dno - hpfs_sb(s)->sb_dirband_start) / 4; 356 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 357 return; 358 } 359 - bmp[ssec >> 5] |= 1 << (ssec & 0x1f); 360 hpfs_mark_4buffers_dirty(&qbh); 361 hpfs_brelse4(&qbh); 362 } ··· 378 return NULL; 379 } 380 memset(d, 0, 2048); 381 - d->magic = DNODE_MAGIC; 382 - d->first_free = 52; 383 d->dirent[0] = 32; 384 d->dirent[2] = 8; 385 d->dirent[30] = 1; 386 d->dirent[31] = 255; 387 - d->self = *dno; 388 return d; 389 } 390 ··· 398 return NULL; 399 } 400 memset(f, 0, 512); 401 - f->magic = FNODE_MAGIC; 402 - f->ea_offs = 0xc4; 403 f->btree.n_free_nodes = 8; 404 - f->btree.first_free = 8; 405 return f; 406 } 407 ··· 415 return NULL; 416 } 417 memset(a, 0, 512); 418 - a->magic = ANODE_MAGIC; 419 - a->self = *ano; 420 a->btree.n_free_nodes = 40; 421 a->btree.n_used_nodes = 0; 422 - a->btree.first_free = 8; 423 return a; 424 }
··· 16 static int chk_if_allocated(struct super_block *s, secno sec, char *msg) 17 { 18 struct quad_buffer_head qbh; 19 + u32 *bmp; 20 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "chk"))) goto fail; 21 + if ((cpu_to_le32(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f)) & 1) { 22 hpfs_error(s, "sector '%s' - %08x not allocated in bitmap", msg, sec); 23 goto fail1; 24 } ··· 26 if (sec >= hpfs_sb(s)->sb_dirband_start && sec < hpfs_sb(s)->sb_dirband_start + hpfs_sb(s)->sb_dirband_size) { 27 unsigned ssec = (sec - hpfs_sb(s)->sb_dirband_start) / 4; 28 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto fail; 29 + if ((le32_to_cpu(bmp[ssec >> 5]) >> (ssec & 0x1f)) & 1) { 30 hpfs_error(s, "sector '%s' - %08x not allocated in directory bitmap", msg, sec); 31 goto fail1; 32 } ··· 82 ret = bs + nr; 83 goto rt; 84 } 85 q = nr + n; b = 0; 86 while ((a = tstbits(bmp, q, n + forward)) != 0) { 87 q += a; ··· 102 goto rt; 103 } 104 nr >>= 5; 105 + /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) */ 106 i = nr; 107 do { 108 + if (!le32_to_cpu(bmp[i])) goto cont; 109 + if (n + forward >= 0x3f && le32_to_cpu(bmp[i]) != 0xffffffff) goto cont; 110 q = i<<5; 111 if (i > 0) { 112 + unsigned k = le32_to_cpu(bmp[i-1]); 113 while (k & 0x80000000) { 114 q--; k <<= 1; 115 } ··· 129 } while (i != nr); 130 rt: 131 if (ret) { 132 + if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (le32_to_cpu(bmp[(ret & 0x3fff) >> 5]) | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { 133 hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret); 134 ret = 0; 135 goto b; 136 } 137 + bmp[(ret & 0x3fff) >> 5] &= cpu_to_le32(~(((1 << n) - 1) << (ret & 0x1f))); 138 hpfs_mark_4buffers_dirty(&qbh); 139 } 140 b: ··· 240 int hpfs_alloc_if_possible(struct super_block *s, secno sec) 241 { 242 struct quad_buffer_head qbh; 243 + u32 *bmp; 244 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "aip"))) goto end; 245 + if (le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) & (1 << (sec & 0x1f))) { 246 + bmp[(sec & 0x3fff) >> 5] &= cpu_to_le32(~(1 << (sec & 0x1f))); 247 hpfs_mark_4buffers_dirty(&qbh); 248 hpfs_brelse4(&qbh); 249 return 1; ··· 258 void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) 259 { 260 struct quad_buffer_head qbh; 261 + u32 *bmp; 262 struct hpfs_sb_info *sbi = hpfs_sb(s); 263 /*printk("2 - ");*/ 264 if (!n) return; ··· 273 return; 274 } 275 new_tst: 276 + if ((le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f) & 1)) { 277 hpfs_error(s, "sector %08x not allocated", sec); 278 hpfs_brelse4(&qbh); 279 return; 280 } 281 + bmp[(sec & 0x3fff) >> 5] |= cpu_to_le32(1 << (sec & 0x1f)); 282 if (!--n) { 283 hpfs_mark_4buffers_dirty(&qbh); 284 hpfs_brelse4(&qbh); ··· 303 int n_bmps = (hpfs_sb(s)->sb_fs_size + 0x4000 - 1) >> 14; 304 int b = hpfs_sb(s)->sb_c_bitmap & 0x0fffffff; 305 int i, j; 306 + u32 *bmp; 307 struct quad_buffer_head qbh; 308 if ((bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 309 for (j = 0; j < 512; j++) { 310 unsigned k; 311 + if (!le32_to_cpu(bmp[j])) continue; 312 + for (k = le32_to_cpu(bmp[j]); k; k >>= 1) if (k & 1) if (!--n) { 313 hpfs_brelse4(&qbh); 314 return 0; 315 } ··· 328 chk_bmp: 329 if (bmp) { 330 for (j = 0; j < 512; j++) { 331 + u32 k; 332 + if (!le32_to_cpu(bmp[j])) continue; 333 for (k = 0xf; k; k <<= 4) 334 + if ((le32_to_cpu(bmp[j]) & k) == k) { 335 if (!--n) { 336 hpfs_brelse4(&qbh); 337 return 0; ··· 355 hpfs_free_sectors(s, dno, 4); 356 } else { 357 struct quad_buffer_head qbh; 358 + u32 *bmp; 359 unsigned ssec = (dno - hpfs_sb(s)->sb_dirband_start) / 4; 360 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 361 return; 362 } 363 + bmp[ssec >> 5] |= cpu_to_le32(1 << (ssec & 0x1f)); 364 hpfs_mark_4buffers_dirty(&qbh); 365 hpfs_brelse4(&qbh); 366 } ··· 382 return NULL; 383 } 384 memset(d, 0, 2048); 385 + d->magic = cpu_to_le32(DNODE_MAGIC); 386 + d->first_free = cpu_to_le32(52); 387 d->dirent[0] = 32; 388 d->dirent[2] = 8; 389 d->dirent[30] = 1; 390 d->dirent[31] = 255; 391 + d->self = cpu_to_le32(*dno); 392 return d; 393 } 394 ··· 402 return NULL; 403 } 404 memset(f, 0, 512); 405 + f->magic = cpu_to_le32(FNODE_MAGIC); 406 + f->ea_offs = cpu_to_le16(0xc4); 407 f->btree.n_free_nodes = 8; 408 + f->btree.first_free = cpu_to_le16(8); 409 return f; 410 } 411 ··· 419 return NULL; 420 } 421 memset(a, 0, 512); 422 + a->magic = cpu_to_le32(ANODE_MAGIC); 423 + a->self = cpu_to_le32(*ano); 424 a->btree.n_free_nodes = 40; 425 a->btree.n_used_nodes = 0; 426 + a->btree.first_free = cpu_to_le16(8); 427 return a; 428 }
+68 -68
fs/hpfs/anode.c
··· 22 if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1; 23 if (btree->internal) { 24 for (i = 0; i < btree->n_used_nodes; i++) 25 - if (btree->u.internal[i].file_secno > sec) { 26 - a = btree->u.internal[i].down; 27 brelse(bh); 28 if (!(anode = hpfs_map_anode(s, a, &bh))) return -1; 29 btree = &anode->btree; ··· 34 return -1; 35 } 36 for (i = 0; i < btree->n_used_nodes; i++) 37 - if (btree->u.external[i].file_secno <= sec && 38 - btree->u.external[i].file_secno + btree->u.external[i].length > sec) { 39 - a = btree->u.external[i].disk_secno + sec - btree->u.external[i].file_secno; 40 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) { 41 brelse(bh); 42 return -1; 43 } 44 if (inode) { 45 struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); 46 - hpfs_inode->i_file_sec = btree->u.external[i].file_secno; 47 - hpfs_inode->i_disk_sec = btree->u.external[i].disk_secno; 48 - hpfs_inode->i_n_secs = btree->u.external[i].length; 49 } 50 brelse(bh); 51 return a; ··· 83 return -1; 84 } 85 if (btree->internal) { 86 - a = btree->u.internal[n].down; 87 - btree->u.internal[n].file_secno = -1; 88 mark_buffer_dirty(bh); 89 brelse(bh); 90 if (hpfs_sb(s)->sb_chk) ··· 94 goto go_down; 95 } 96 if (n >= 0) { 97 - if (btree->u.external[n].file_secno + btree->u.external[n].length != fsecno) { 98 hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x", 99 - btree->u.external[n].file_secno + btree->u.external[n].length, fsecno, 100 fnod?'f':'a', node); 101 brelse(bh); 102 return -1; 103 } 104 - if (hpfs_alloc_if_possible(s, se = btree->u.external[n].disk_secno + btree->u.external[n].length)) { 105 - btree->u.external[n].length++; 106 mark_buffer_dirty(bh); 107 brelse(bh); 108 return se; ··· 119 brelse(bh); 120 return -1; 121 } 122 - fs = n < 0 ? 0 : btree->u.external[n].file_secno + btree->u.external[n].length; 123 if (!btree->n_free_nodes) { 124 - up = a != node ? anode->up : -1; 125 if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) { 126 brelse(bh); 127 hpfs_free_sectors(s, se, 1); 128 return -1; 129 } 130 if (a == node && fnod) { 131 - anode->up = node; 132 anode->btree.fnode_parent = 1; 133 anode->btree.n_used_nodes = btree->n_used_nodes; 134 anode->btree.first_free = btree->first_free; ··· 137 btree->internal = 1; 138 btree->n_free_nodes = 11; 139 btree->n_used_nodes = 1; 140 - btree->first_free = (char *)&(btree->u.internal[1]) - (char *)btree; 141 - btree->u.internal[0].file_secno = -1; 142 - btree->u.internal[0].down = na; 143 mark_buffer_dirty(bh); 144 } else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) { 145 brelse(bh); ··· 153 btree = &anode->btree; 154 } 155 btree->n_free_nodes--; n = btree->n_used_nodes++; 156 - btree->first_free += 12; 157 - btree->u.external[n].disk_secno = se; 158 - btree->u.external[n].file_secno = fs; 159 - btree->u.external[n].length = 1; 160 mark_buffer_dirty(bh); 161 brelse(bh); 162 if ((a == node && fnod) || na == -1) return se; 163 c2 = 0; 164 - while (up != -1) { 165 struct anode *new_anode; 166 if (hpfs_sb(s)->sb_chk) 167 if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; ··· 174 } 175 if (btree->n_free_nodes) { 176 btree->n_free_nodes--; n = btree->n_used_nodes++; 177 - btree->first_free += 8; 178 - btree->u.internal[n].file_secno = -1; 179 - btree->u.internal[n].down = na; 180 - btree->u.internal[n-1].file_secno = fs; 181 mark_buffer_dirty(bh); 182 brelse(bh); 183 brelse(bh2); 184 hpfs_free_sectors(s, ra, 1); 185 if ((anode = hpfs_map_anode(s, na, &bh))) { 186 - anode->up = up; 187 anode->btree.fnode_parent = up == node && fnod; 188 mark_buffer_dirty(bh); 189 brelse(bh); 190 } 191 return se; 192 } 193 - up = up != node ? anode->up : -1; 194 - btree->u.internal[btree->n_used_nodes - 1].file_secno = /*fs*/-1; 195 mark_buffer_dirty(bh); 196 brelse(bh); 197 a = na; 198 if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { 199 anode = new_anode; 200 - /*anode->up = up != -1 ? up : ra;*/ 201 anode->btree.internal = 1; 202 anode->btree.n_used_nodes = 1; 203 anode->btree.n_free_nodes = 59; 204 - anode->btree.first_free = 16; 205 - anode->btree.u.internal[0].down = a; 206 - anode->btree.u.internal[0].file_secno = -1; 207 mark_buffer_dirty(bh); 208 brelse(bh); 209 if ((anode = hpfs_map_anode(s, a, &bh))) { 210 - anode->up = na; 211 mark_buffer_dirty(bh); 212 brelse(bh); 213 } 214 } else na = a; 215 } 216 if ((anode = hpfs_map_anode(s, na, &bh))) { 217 - anode->up = node; 218 if (fnod) anode->btree.fnode_parent = 1; 219 mark_buffer_dirty(bh); 220 brelse(bh); ··· 232 } 233 btree = &fnode->btree; 234 } 235 - ranode->up = node; 236 - memcpy(&ranode->btree, btree, btree->first_free); 237 if (fnod) ranode->btree.fnode_parent = 1; 238 ranode->btree.n_free_nodes = (ranode->btree.internal ? 60 : 40) - ranode->btree.n_used_nodes; 239 if (ranode->btree.internal) for (n = 0; n < ranode->btree.n_used_nodes; n++) { 240 struct anode *unode; 241 - if ((unode = hpfs_map_anode(s, ranode->u.internal[n].down, &bh1))) { 242 - unode->up = ra; 243 unode->btree.fnode_parent = 0; 244 mark_buffer_dirty(bh1); 245 brelse(bh1); ··· 248 btree->internal = 1; 249 btree->n_free_nodes = fnod ? 10 : 58; 250 btree->n_used_nodes = 2; 251 - btree->first_free = (char *)&btree->u.internal[2] - (char *)btree; 252 - btree->u.internal[0].file_secno = fs; 253 - btree->u.internal[0].down = ra; 254 - btree->u.internal[1].file_secno = -1; 255 - btree->u.internal[1].down = na; 256 mark_buffer_dirty(bh); 257 brelse(bh); 258 mark_buffer_dirty(bh2); ··· 279 go_down: 280 d2 = 0; 281 while (btree1->internal) { 282 - ano = btree1->u.internal[pos].down; 283 if (level) brelse(bh); 284 if (hpfs_sb(s)->sb_chk) 285 if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) ··· 290 pos = 0; 291 } 292 for (i = 0; i < btree1->n_used_nodes; i++) 293 - hpfs_free_sectors(s, btree1->u.external[i].disk_secno, btree1->u.external[i].length); 294 go_up: 295 if (!level) return; 296 brelse(bh); ··· 298 if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; 299 hpfs_free_sectors(s, ano, 1); 300 oano = ano; 301 - ano = anode->up; 302 if (--level) { 303 if (!(anode = hpfs_map_anode(s, ano, &bh))) return; 304 btree1 = &anode->btree; 305 } else btree1 = btree; 306 for (i = 0; i < btree1->n_used_nodes; i++) { 307 - if (btree1->u.internal[i].down == oano) { 308 if ((pos = i + 1) < btree1->n_used_nodes) 309 goto go_down; 310 else ··· 411 if (fno) { 412 btree->n_free_nodes = 8; 413 btree->n_used_nodes = 0; 414 - btree->first_free = 8; 415 btree->internal = 0; 416 mark_buffer_dirty(bh); 417 } else hpfs_free_sectors(s, f, 1); ··· 421 while (btree->internal) { 422 nodes = btree->n_used_nodes + btree->n_free_nodes; 423 for (i = 0; i < btree->n_used_nodes; i++) 424 - if (btree->u.internal[i].file_secno >= secs) goto f; 425 brelse(bh); 426 hpfs_error(s, "internal btree %08x doesn't end with -1", node); 427 return; 428 f: 429 for (j = i + 1; j < btree->n_used_nodes; j++) 430 - hpfs_ea_remove(s, btree->u.internal[j].down, 1, 0); 431 btree->n_used_nodes = i + 1; 432 btree->n_free_nodes = nodes - btree->n_used_nodes; 433 - btree->first_free = 8 + 8 * btree->n_used_nodes; 434 mark_buffer_dirty(bh); 435 - if (btree->u.internal[i].file_secno == secs) { 436 brelse(bh); 437 return; 438 } 439 - node = btree->u.internal[i].down; 440 brelse(bh); 441 if (hpfs_sb(s)->sb_chk) 442 if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree")) ··· 446 } 447 nodes = btree->n_used_nodes + btree->n_free_nodes; 448 for (i = 0; i < btree->n_used_nodes; i++) 449 - if (btree->u.external[i].file_secno + btree->u.external[i].length >= secs) goto ff; 450 brelse(bh); 451 return; 452 ff: 453 - if (secs <= btree->u.external[i].file_secno) { 454 hpfs_error(s, "there is an allocation error in file %08x, sector %08x", f, secs); 455 if (i) i--; 456 } 457 - else if (btree->u.external[i].file_secno + btree->u.external[i].length > secs) { 458 - hpfs_free_sectors(s, btree->u.external[i].disk_secno + secs - 459 - btree->u.external[i].file_secno, btree->u.external[i].length 460 - - secs + btree->u.external[i].file_secno); /* I hope gcc optimizes this :-) */ 461 - btree->u.external[i].length = secs - btree->u.external[i].file_secno; 462 } 463 for (j = i + 1; j < btree->n_used_nodes; j++) 464 - hpfs_free_sectors(s, btree->u.external[j].disk_secno, btree->u.external[j].length); 465 btree->n_used_nodes = i + 1; 466 btree->n_free_nodes = nodes - btree->n_used_nodes; 467 - btree->first_free = 8 + 12 * btree->n_used_nodes; 468 mark_buffer_dirty(bh); 469 brelse(bh); 470 } ··· 480 struct extended_attribute *ea_end; 481 if (!(fnode = hpfs_map_fnode(s, fno, &bh))) return; 482 if (!fnode->dirflag) hpfs_remove_btree(s, &fnode->btree); 483 - else hpfs_remove_dtree(s, fnode->u.external[0].disk_secno); 484 ea_end = fnode_end_ea(fnode); 485 for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) 486 if (ea->indirect) 487 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 488 - hpfs_ea_ext_remove(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l); 489 brelse(bh); 490 hpfs_free_sectors(s, fno, 1); 491 }
··· 22 if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1; 23 if (btree->internal) { 24 for (i = 0; i < btree->n_used_nodes; i++) 25 + if (le32_to_cpu(btree->u.internal[i].file_secno) > sec) { 26 + a = le32_to_cpu(btree->u.internal[i].down); 27 brelse(bh); 28 if (!(anode = hpfs_map_anode(s, a, &bh))) return -1; 29 btree = &anode->btree; ··· 34 return -1; 35 } 36 for (i = 0; i < btree->n_used_nodes; i++) 37 + if (le32_to_cpu(btree->u.external[i].file_secno) <= sec && 38 + le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > sec) { 39 + a = le32_to_cpu(btree->u.external[i].disk_secno) + sec - le32_to_cpu(btree->u.external[i].file_secno); 40 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) { 41 brelse(bh); 42 return -1; 43 } 44 if (inode) { 45 struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); 46 + hpfs_inode->i_file_sec = le32_to_cpu(btree->u.external[i].file_secno); 47 + hpfs_inode->i_disk_sec = le32_to_cpu(btree->u.external[i].disk_secno); 48 + hpfs_inode->i_n_secs = le32_to_cpu(btree->u.external[i].length); 49 } 50 brelse(bh); 51 return a; ··· 83 return -1; 84 } 85 if (btree->internal) { 86 + a = le32_to_cpu(btree->u.internal[n].down); 87 + btree->u.internal[n].file_secno = cpu_to_le32(-1); 88 mark_buffer_dirty(bh); 89 brelse(bh); 90 if (hpfs_sb(s)->sb_chk) ··· 94 goto go_down; 95 } 96 if (n >= 0) { 97 + if (le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length) != fsecno) { 98 hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x", 99 + le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length), fsecno, 100 fnod?'f':'a', node); 101 brelse(bh); 102 return -1; 103 } 104 + if (hpfs_alloc_if_possible(s, se = le32_to_cpu(btree->u.external[n].disk_secno) + le32_to_cpu(btree->u.external[n].length))) { 105 + btree->u.external[n].length = cpu_to_le32(le32_to_cpu(btree->u.external[n].length) + 1); 106 mark_buffer_dirty(bh); 107 brelse(bh); 108 return se; ··· 119 brelse(bh); 120 return -1; 121 } 122 + fs = n < 0 ? 0 : le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length); 123 if (!btree->n_free_nodes) { 124 + up = a != node ? le32_to_cpu(anode->up) : -1; 125 if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) { 126 brelse(bh); 127 hpfs_free_sectors(s, se, 1); 128 return -1; 129 } 130 if (a == node && fnod) { 131 + anode->up = cpu_to_le32(node); 132 anode->btree.fnode_parent = 1; 133 anode->btree.n_used_nodes = btree->n_used_nodes; 134 anode->btree.first_free = btree->first_free; ··· 137 btree->internal = 1; 138 btree->n_free_nodes = 11; 139 btree->n_used_nodes = 1; 140 + btree->first_free = cpu_to_le16((char *)&(btree->u.internal[1]) - (char *)btree); 141 + btree->u.internal[0].file_secno = cpu_to_le32(-1); 142 + btree->u.internal[0].down = cpu_to_le32(na); 143 mark_buffer_dirty(bh); 144 } else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) { 145 brelse(bh); ··· 153 btree = &anode->btree; 154 } 155 btree->n_free_nodes--; n = btree->n_used_nodes++; 156 + btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 12); 157 + btree->u.external[n].disk_secno = cpu_to_le32(se); 158 + btree->u.external[n].file_secno = cpu_to_le32(fs); 159 + btree->u.external[n].length = cpu_to_le32(1); 160 mark_buffer_dirty(bh); 161 brelse(bh); 162 if ((a == node && fnod) || na == -1) return se; 163 c2 = 0; 164 + while (up != (anode_secno)-1) { 165 struct anode *new_anode; 166 if (hpfs_sb(s)->sb_chk) 167 if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; ··· 174 } 175 if (btree->n_free_nodes) { 176 btree->n_free_nodes--; n = btree->n_used_nodes++; 177 + btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 8); 178 + btree->u.internal[n].file_secno = cpu_to_le32(-1); 179 + btree->u.internal[n].down = cpu_to_le32(na); 180 + btree->u.internal[n-1].file_secno = cpu_to_le32(fs); 181 mark_buffer_dirty(bh); 182 brelse(bh); 183 brelse(bh2); 184 hpfs_free_sectors(s, ra, 1); 185 if ((anode = hpfs_map_anode(s, na, &bh))) { 186 + anode->up = cpu_to_le32(up); 187 anode->btree.fnode_parent = up == node && fnod; 188 mark_buffer_dirty(bh); 189 brelse(bh); 190 } 191 return se; 192 } 193 + up = up != node ? le32_to_cpu(anode->up) : -1; 194 + btree->u.internal[btree->n_used_nodes - 1].file_secno = cpu_to_le32(/*fs*/-1); 195 mark_buffer_dirty(bh); 196 brelse(bh); 197 a = na; 198 if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { 199 anode = new_anode; 200 + /*anode->up = cpu_to_le32(up != -1 ? up : ra);*/ 201 anode->btree.internal = 1; 202 anode->btree.n_used_nodes = 1; 203 anode->btree.n_free_nodes = 59; 204 + anode->btree.first_free = cpu_to_le16(16); 205 + anode->btree.u.internal[0].down = cpu_to_le32(a); 206 + anode->btree.u.internal[0].file_secno = cpu_to_le32(-1); 207 mark_buffer_dirty(bh); 208 brelse(bh); 209 if ((anode = hpfs_map_anode(s, a, &bh))) { 210 + anode->up = cpu_to_le32(na); 211 mark_buffer_dirty(bh); 212 brelse(bh); 213 } 214 } else na = a; 215 } 216 if ((anode = hpfs_map_anode(s, na, &bh))) { 217 + anode->up = cpu_to_le32(node); 218 if (fnod) anode->btree.fnode_parent = 1; 219 mark_buffer_dirty(bh); 220 brelse(bh); ··· 232 } 233 btree = &fnode->btree; 234 } 235 + ranode->up = cpu_to_le32(node); 236 + memcpy(&ranode->btree, btree, le16_to_cpu(btree->first_free)); 237 if (fnod) ranode->btree.fnode_parent = 1; 238 ranode->btree.n_free_nodes = (ranode->btree.internal ? 60 : 40) - ranode->btree.n_used_nodes; 239 if (ranode->btree.internal) for (n = 0; n < ranode->btree.n_used_nodes; n++) { 240 struct anode *unode; 241 + if ((unode = hpfs_map_anode(s, le32_to_cpu(ranode->u.internal[n].down), &bh1))) { 242 + unode->up = cpu_to_le32(ra); 243 unode->btree.fnode_parent = 0; 244 mark_buffer_dirty(bh1); 245 brelse(bh1); ··· 248 btree->internal = 1; 249 btree->n_free_nodes = fnod ? 10 : 58; 250 btree->n_used_nodes = 2; 251 + btree->first_free = cpu_to_le16((char *)&btree->u.internal[2] - (char *)btree); 252 + btree->u.internal[0].file_secno = cpu_to_le32(fs); 253 + btree->u.internal[0].down = cpu_to_le32(ra); 254 + btree->u.internal[1].file_secno = cpu_to_le32(-1); 255 + btree->u.internal[1].down = cpu_to_le32(na); 256 mark_buffer_dirty(bh); 257 brelse(bh); 258 mark_buffer_dirty(bh2); ··· 279 go_down: 280 d2 = 0; 281 while (btree1->internal) { 282 + ano = le32_to_cpu(btree1->u.internal[pos].down); 283 if (level) brelse(bh); 284 if (hpfs_sb(s)->sb_chk) 285 if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) ··· 290 pos = 0; 291 } 292 for (i = 0; i < btree1->n_used_nodes; i++) 293 + hpfs_free_sectors(s, le32_to_cpu(btree1->u.external[i].disk_secno), le32_to_cpu(btree1->u.external[i].length)); 294 go_up: 295 if (!level) return; 296 brelse(bh); ··· 298 if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; 299 hpfs_free_sectors(s, ano, 1); 300 oano = ano; 301 + ano = le32_to_cpu(anode->up); 302 if (--level) { 303 if (!(anode = hpfs_map_anode(s, ano, &bh))) return; 304 btree1 = &anode->btree; 305 } else btree1 = btree; 306 for (i = 0; i < btree1->n_used_nodes; i++) { 307 + if (le32_to_cpu(btree1->u.internal[i].down) == oano) { 308 if ((pos = i + 1) < btree1->n_used_nodes) 309 goto go_down; 310 else ··· 411 if (fno) { 412 btree->n_free_nodes = 8; 413 btree->n_used_nodes = 0; 414 + btree->first_free = cpu_to_le16(8); 415 btree->internal = 0; 416 mark_buffer_dirty(bh); 417 } else hpfs_free_sectors(s, f, 1); ··· 421 while (btree->internal) { 422 nodes = btree->n_used_nodes + btree->n_free_nodes; 423 for (i = 0; i < btree->n_used_nodes; i++) 424 + if (le32_to_cpu(btree->u.internal[i].file_secno) >= secs) goto f; 425 brelse(bh); 426 hpfs_error(s, "internal btree %08x doesn't end with -1", node); 427 return; 428 f: 429 for (j = i + 1; j < btree->n_used_nodes; j++) 430 + hpfs_ea_remove(s, le32_to_cpu(btree->u.internal[j].down), 1, 0); 431 btree->n_used_nodes = i + 1; 432 btree->n_free_nodes = nodes - btree->n_used_nodes; 433 + btree->first_free = cpu_to_le16(8 + 8 * btree->n_used_nodes); 434 mark_buffer_dirty(bh); 435 + if (btree->u.internal[i].file_secno == cpu_to_le32(secs)) { 436 brelse(bh); 437 return; 438 } 439 + node = le32_to_cpu(btree->u.internal[i].down); 440 brelse(bh); 441 if (hpfs_sb(s)->sb_chk) 442 if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree")) ··· 446 } 447 nodes = btree->n_used_nodes + btree->n_free_nodes; 448 for (i = 0; i < btree->n_used_nodes; i++) 449 + if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) >= secs) goto ff; 450 brelse(bh); 451 return; 452 ff: 453 + if (secs <= le32_to_cpu(btree->u.external[i].file_secno)) { 454 hpfs_error(s, "there is an allocation error in file %08x, sector %08x", f, secs); 455 if (i) i--; 456 } 457 + else if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > secs) { 458 + hpfs_free_sectors(s, le32_to_cpu(btree->u.external[i].disk_secno) + secs - 459 + le32_to_cpu(btree->u.external[i].file_secno), le32_to_cpu(btree->u.external[i].length) 460 + - secs + le32_to_cpu(btree->u.external[i].file_secno)); /* I hope gcc optimizes this :-) */ 461 + btree->u.external[i].length = cpu_to_le32(secs - le32_to_cpu(btree->u.external[i].file_secno)); 462 } 463 for (j = i + 1; j < btree->n_used_nodes; j++) 464 + hpfs_free_sectors(s, le32_to_cpu(btree->u.external[j].disk_secno), le32_to_cpu(btree->u.external[j].length)); 465 btree->n_used_nodes = i + 1; 466 btree->n_free_nodes = nodes - btree->n_used_nodes; 467 + btree->first_free = cpu_to_le16(8 + 12 * btree->n_used_nodes); 468 mark_buffer_dirty(bh); 469 brelse(bh); 470 } ··· 480 struct extended_attribute *ea_end; 481 if (!(fnode = hpfs_map_fnode(s, fno, &bh))) return; 482 if (!fnode->dirflag) hpfs_remove_btree(s, &fnode->btree); 483 + else hpfs_remove_dtree(s, le32_to_cpu(fnode->u.external[0].disk_secno)); 484 ea_end = fnode_end_ea(fnode); 485 for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) 486 if (ea->indirect) 487 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 488 + hpfs_ea_ext_remove(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l)); 489 brelse(bh); 490 hpfs_free_sectors(s, fno, 1); 491 }
+10 -10
fs/hpfs/dir.c
··· 88 hpfs_error(inode->i_sb, "not a directory, fnode %08lx", 89 (unsigned long)inode->i_ino); 90 } 91 - if (hpfs_inode->i_dno != fno->u.external[0].disk_secno) { 92 e = 1; 93 - hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, fno->u.external[0].disk_secno); 94 } 95 brelse(bh); 96 if (e) { ··· 156 goto again; 157 } 158 tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); 159 - if (filldir(dirent, tempname, de->namelen, old_pos, de->fnode, DT_UNKNOWN) < 0) { 160 filp->f_pos = old_pos; 161 if (tempname != de->name) kfree(tempname); 162 hpfs_brelse4(&qbh); ··· 221 * Get inode number, what we're after. 222 */ 223 224 - ino = de->fnode; 225 226 /* 227 * Go find or make an inode. ··· 236 hpfs_init_inode(result); 237 if (de->directory) 238 hpfs_read_inode(result); 239 - else if (de->ea_size && hpfs_sb(dir->i_sb)->sb_eas) 240 hpfs_read_inode(result); 241 else { 242 result->i_mode |= S_IFREG; ··· 261 */ 262 263 if (!result->i_ctime.tv_sec) { 264 - if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, de->creation_date))) 265 result->i_ctime.tv_sec = 1; 266 result->i_ctime.tv_nsec = 0; 267 - result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, de->write_date); 268 result->i_mtime.tv_nsec = 0; 269 - result->i_atime.tv_sec = local_to_gmt(dir->i_sb, de->read_date); 270 result->i_atime.tv_nsec = 0; 271 - hpfs_result->i_ea_size = de->ea_size; 272 if (!hpfs_result->i_ea_mode && de->read_only) 273 result->i_mode &= ~0222; 274 if (!de->directory) { 275 if (result->i_size == -1) { 276 - result->i_size = de->file_size; 277 result->i_data.a_ops = &hpfs_aops; 278 hpfs_i(result)->mmu_private = result->i_size; 279 /*
··· 88 hpfs_error(inode->i_sb, "not a directory, fnode %08lx", 89 (unsigned long)inode->i_ino); 90 } 91 + if (hpfs_inode->i_dno != le32_to_cpu(fno->u.external[0].disk_secno)) { 92 e = 1; 93 + hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, le32_to_cpu(fno->u.external[0].disk_secno)); 94 } 95 brelse(bh); 96 if (e) { ··· 156 goto again; 157 } 158 tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); 159 + if (filldir(dirent, tempname, de->namelen, old_pos, le32_to_cpu(de->fnode), DT_UNKNOWN) < 0) { 160 filp->f_pos = old_pos; 161 if (tempname != de->name) kfree(tempname); 162 hpfs_brelse4(&qbh); ··· 221 * Get inode number, what we're after. 222 */ 223 224 + ino = le32_to_cpu(de->fnode); 225 226 /* 227 * Go find or make an inode. ··· 236 hpfs_init_inode(result); 237 if (de->directory) 238 hpfs_read_inode(result); 239 + else if (le32_to_cpu(de->ea_size) && hpfs_sb(dir->i_sb)->sb_eas) 240 hpfs_read_inode(result); 241 else { 242 result->i_mode |= S_IFREG; ··· 261 */ 262 263 if (!result->i_ctime.tv_sec) { 264 + if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->creation_date)))) 265 result->i_ctime.tv_sec = 1; 266 result->i_ctime.tv_nsec = 0; 267 + result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->write_date)); 268 result->i_mtime.tv_nsec = 0; 269 + result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->read_date)); 270 result->i_atime.tv_nsec = 0; 271 + hpfs_result->i_ea_size = le32_to_cpu(de->ea_size); 272 if (!hpfs_result->i_ea_mode && de->read_only) 273 result->i_mode &= ~0222; 274 if (!de->directory) { 275 if (result->i_size == -1) { 276 + result->i_size = le32_to_cpu(de->file_size); 277 result->i_data.a_ops = &hpfs_aops; 278 hpfs_i(result)->mmu_private = result->i_size; 279 /*
+64 -63
fs/hpfs/dnode.c
··· 14 struct hpfs_dirent *de_end = dnode_end_de(d); 15 int i = 1; 16 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 17 - if (de == fde) return ((loff_t) d->self << 4) | (loff_t)i; 18 i++; 19 } 20 printk("HPFS: get_pos: not_found\n"); 21 - return ((loff_t)d->self << 4) | (loff_t)1; 22 } 23 24 void hpfs_add_pos(struct inode *inode, loff_t *pos) ··· 130 { 131 struct hpfs_dirent *de; 132 if (!(de = dnode_last_de(d))) { 133 - hpfs_error(s, "set_last_pointer: empty dnode %08x", d->self); 134 return; 135 } 136 if (hpfs_sb(s)->sb_chk) { 137 if (de->down) { 138 hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x", 139 - d->self, de_down_pointer(de)); 140 return; 141 } 142 - if (de->length != 32) { 143 - hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", d->self); 144 return; 145 } 146 } 147 if (ptr) { 148 d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + 4); 149 if (le32_to_cpu(d->first_free) > 2048) { 150 - hpfs_error(s, "set_last_pointer: too long dnode %08x", d->self); 151 d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - 4); 152 return; 153 } 154 - de->length = 36; 155 de->down = 1; 156 - *(dnode_secno *)((char *)de + 32) = ptr; 157 } 158 } 159 ··· 169 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 170 int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last); 171 if (!c) { 172 - hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, d->self); 173 return NULL; 174 } 175 if (c < 0) break; ··· 177 memmove((char *)de + d_size, de, (char *)de_end - (char *)de); 178 memset(de, 0, d_size); 179 if (down_ptr) { 180 - *(int *)((char *)de + d_size - 4) = down_ptr; 181 de->down = 1; 182 } 183 - de->length = d_size; 184 - if (down_ptr) de->down = 1; 185 de->not_8x3 = hpfs_is_name_long(name, namelen); 186 de->namelen = namelen; 187 memcpy(de->name, name, namelen); ··· 194 struct hpfs_dirent *de) 195 { 196 if (de->last) { 197 - hpfs_error(s, "attempt to delete last dirent in dnode %08x", d->self); 198 return; 199 } 200 - d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - de->length); 201 memmove(de, de_next_de(de), le32_to_cpu(d->first_free) + (char *)d - (char *)de); 202 } 203 ··· 205 { 206 struct hpfs_dirent *de; 207 struct hpfs_dirent *de_end = dnode_end_de(d); 208 - dnode_secno dno = d->self; 209 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) 210 if (de->down) { 211 struct quad_buffer_head qbh; 212 struct dnode *dd; 213 if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) { 214 - if (dd->up != dno || dd->root_dnode) { 215 - dd->up = dno; 216 dd->root_dnode = 0; 217 hpfs_mark_4buffers_dirty(&qbh); 218 } ··· 290 copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de); 291 for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1); 292 h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10; 293 - if (!(ad = hpfs_alloc_dnode(i->i_sb, d->up, &adno, &qbh1))) { 294 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 295 hpfs_brelse4(&qbh); 296 kfree(nd); ··· 314 set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); 315 de = de_next_de(de); 316 memmove((char *)nd + 20, de, le32_to_cpu(nd->first_free) + (char *)nd - (char *)de); 317 - nd->first_free = cpu_to_le32(le32_to_cpu(nd->first_free) - (char *)de - (char *)nd - 20); 318 memcpy(d, nd, le32_to_cpu(nd->first_free)); 319 for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos); 320 fix_up_ptrs(i->i_sb, ad); 321 if (!d->root_dnode) { 322 - dno = ad->up = d->up; 323 hpfs_mark_4buffers_dirty(&qbh); 324 hpfs_brelse4(&qbh); 325 hpfs_mark_4buffers_dirty(&qbh1); 326 hpfs_brelse4(&qbh1); 327 goto go_up; 328 } 329 - if (!(rd = hpfs_alloc_dnode(i->i_sb, d->up, &rdno, &qbh2))) { 330 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 331 hpfs_brelse4(&qbh); 332 hpfs_brelse4(&qbh1); ··· 339 i->i_blocks += 4; 340 rd->root_dnode = 1; 341 rd->up = d->up; 342 - if (!(fnode = hpfs_map_fnode(i->i_sb, d->up, &bh))) { 343 hpfs_free_dnode(i->i_sb, rdno); 344 hpfs_brelse4(&qbh); 345 hpfs_brelse4(&qbh1); ··· 348 kfree(nname); 349 return 1; 350 } 351 - fnode->u.external[0].disk_secno = rdno; 352 mark_buffer_dirty(bh); 353 brelse(bh); 354 - d->up = ad->up = hpfs_i(i)->i_dno = rdno; 355 d->root_dnode = ad->root_dnode = 0; 356 hpfs_mark_4buffers_dirty(&qbh); 357 hpfs_brelse4(&qbh); ··· 437 return 0; 438 if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0; 439 if (hpfs_sb(i->i_sb)->sb_chk) { 440 - if (dnode->up != chk_up) { 441 hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x", 442 - dno, chk_up, dnode->up); 443 hpfs_brelse4(&qbh); 444 return 0; 445 } ··· 455 hpfs_brelse4(&qbh); 456 } 457 while (!(de = dnode_pre_last_de(dnode))) { 458 - dnode_secno up = dnode->up; 459 hpfs_brelse4(&qbh); 460 hpfs_free_dnode(i->i_sb, dno); 461 i->i_size -= 2048; ··· 475 return 0; 476 } 477 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 478 - de->length -= 4; 479 de->down = 0; 480 hpfs_mark_4buffers_dirty(&qbh); 481 dno = up; ··· 483 t = get_pos(dnode, de); 484 for_all_poss(i, hpfs_pos_subst, t, 4); 485 for_all_poss(i, hpfs_pos_subst, t + 1, 5); 486 - if (!(nde = kmalloc(de->length, GFP_NOFS))) { 487 hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted"); 488 hpfs_brelse4(&qbh); 489 return 0; 490 } 491 - memcpy(nde, de, de->length); 492 ddno = de->down ? de_down_pointer(de) : 0; 493 hpfs_delete_de(i->i_sb, dnode, de); 494 set_last_pointer(i->i_sb, dnode, ddno); ··· 521 if (le32_to_cpu(dnode->first_free) == 52 || le32_to_cpu(dnode->first_free) == 56) { 522 struct hpfs_dirent *de_end; 523 int root = dnode->root_dnode; 524 - up = dnode->up; 525 de = dnode_first_de(dnode); 526 down = de->down ? de_down_pointer(de) : 0; 527 if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) { ··· 545 return; 546 } 547 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 548 - d1->up = up; 549 d1->root_dnode = 1; 550 hpfs_mark_4buffers_dirty(&qbh1); 551 hpfs_brelse4(&qbh1); 552 } 553 if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) { 554 - fnode->u.external[0].disk_secno = down; 555 mark_buffer_dirty(bh); 556 brelse(bh); 557 } ··· 570 for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p); 571 if (!down) { 572 de->down = 0; 573 - de->length -= 4; 574 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 575 memmove(de_next_de(de), (char *)de_next_de(de) + 4, 576 (char *)dnode + le32_to_cpu(dnode->first_free) - (char *)de_next_de(de)); 577 } else { 578 struct dnode *d1; 579 struct quad_buffer_head qbh1; 580 - *(dnode_secno *) ((void *) de + de->length - 4) = down; 581 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 582 - d1->up = up; 583 hpfs_mark_4buffers_dirty(&qbh1); 584 hpfs_brelse4(&qbh1); 585 } ··· 596 struct quad_buffer_head qbh1; 597 if (!de_next->down) goto endm; 598 ndown = de_down_pointer(de_next); 599 - if (!(de_cp = kmalloc(de->length, GFP_NOFS))) { 600 printk("HPFS: out of memory for dtree balancing\n"); 601 goto endm; 602 } 603 - memcpy(de_cp, de, de->length); 604 hpfs_delete_de(i->i_sb, dnode, de); 605 hpfs_mark_4buffers_dirty(&qbh); 606 hpfs_brelse4(&qbh); 607 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4); 608 for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1); 609 if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) { 610 - d1->up = ndown; 611 hpfs_mark_4buffers_dirty(&qbh1); 612 hpfs_brelse4(&qbh1); 613 } ··· 647 printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); 648 printk("HPFS: warning: goin'on\n"); 649 } 650 - del->length += 4; 651 del->down = 1; 652 d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) + 4); 653 } 654 if (dlp && !down) { 655 - del->length -= 4; 656 del->down = 0; 657 d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) - 4); 658 } else if (down) 659 - *(dnode_secno *) ((void *) del + del->length - 4) = down; 660 } else goto endm; 661 - if (!(de_cp = kmalloc(de_prev->length, GFP_NOFS))) { 662 printk("HPFS: out of memory for dtree balancing\n"); 663 hpfs_brelse4(&qbh1); 664 goto endm; 665 } 666 hpfs_mark_4buffers_dirty(&qbh1); 667 hpfs_brelse4(&qbh1); 668 - memcpy(de_cp, de_prev, de_prev->length); 669 hpfs_delete_de(i->i_sb, dnode, de_prev); 670 if (!de_prev->down) { 671 - de_prev->length += 4; 672 de_prev->down = 1; 673 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) + 4); 674 } 675 - *(dnode_secno *) ((void *) de_prev + de_prev->length - 4) = ndown; 676 hpfs_mark_4buffers_dirty(&qbh); 677 hpfs_brelse4(&qbh); 678 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4); 679 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1)); 680 if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) { 681 - d1->up = ndown; 682 hpfs_mark_4buffers_dirty(&qbh1); 683 hpfs_brelse4(&qbh1); 684 } ··· 745 ptr = 0; 746 go_up: 747 if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return; 748 - if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && dnode->up != odno) 749 - hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, dnode->up); 750 de = dnode_first_de(dnode); 751 if (ptr) while(1) { 752 if (de->down) if (de_down_pointer(de) == ptr) goto process_de; ··· 770 if (!de->first && !de->last && n_items) (*n_items)++; 771 if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de; 772 ptr = dno; 773 - dno = dnode->up; 774 if (dnode->root_dnode) { 775 hpfs_brelse4(&qbh); 776 return; ··· 818 return d; 819 if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno; 820 if (hpfs_sb(s)->sb_chk) 821 - if (up && ((struct dnode *)qbh.data)->up != up) 822 - hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, ((struct dnode *)qbh.data)->up); 823 if (!de->down) { 824 hpfs_brelse4(&qbh); 825 return d; ··· 868 /* Going up */ 869 if (dnode->root_dnode) goto bail; 870 871 - if (!(up_dnode = hpfs_map_dnode(inode->i_sb, dnode->up, &qbh0))) 872 goto bail; 873 874 end_up_de = dnode_end_de(up_dnode); ··· 876 for (up_de = dnode_first_de(up_dnode); up_de < end_up_de; 877 up_de = de_next_de(up_de)) { 878 if (!(++c & 077)) hpfs_error(inode->i_sb, 879 - "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", dnode->up); 880 if (up_de->down && de_down_pointer(up_de) == dno) { 881 - *posp = ((loff_t) dnode->up << 4) + c; 882 hpfs_brelse4(&qbh0); 883 return de; 884 } 885 } 886 887 hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x", 888 - dno, dnode->up); 889 hpfs_brelse4(&qbh0); 890 891 bail: ··· 1011 /*name2[15] = 0xff;*/ 1012 name1len = 15; name2len = 256; 1013 } 1014 - if (!(upf = hpfs_map_fnode(s, f->up, &bh))) { 1015 kfree(name2); 1016 return NULL; 1017 } 1018 if (!upf->dirflag) { 1019 brelse(bh); 1020 - hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, f->up); 1021 kfree(name2); 1022 return NULL; 1023 } 1024 - dno = upf->u.external[0].disk_secno; 1025 brelse(bh); 1026 go_down: 1027 downd = 0; ··· 1043 return NULL; 1044 } 1045 next_de: 1046 - if (de->fnode == fno) { 1047 kfree(name2); 1048 return de; 1049 } ··· 1059 goto go_down; 1060 } 1061 f: 1062 - if (de->fnode == fno) { 1063 kfree(name2); 1064 return de; 1065 } ··· 1068 if ((de = de_next_de(de)) < de_end) goto next_de; 1069 if (d->root_dnode) goto not_found; 1070 downd = dno; 1071 - dno = d->up; 1072 hpfs_brelse4(qbh); 1073 if (hpfs_sb(s)->sb_chk) 1074 if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
··· 14 struct hpfs_dirent *de_end = dnode_end_de(d); 15 int i = 1; 16 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 17 + if (de == fde) return ((loff_t) le32_to_cpu(d->self) << 4) | (loff_t)i; 18 i++; 19 } 20 printk("HPFS: get_pos: not_found\n"); 21 + return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1; 22 } 23 24 void hpfs_add_pos(struct inode *inode, loff_t *pos) ··· 130 { 131 struct hpfs_dirent *de; 132 if (!(de = dnode_last_de(d))) { 133 + hpfs_error(s, "set_last_pointer: empty dnode %08x", le32_to_cpu(d->self)); 134 return; 135 } 136 if (hpfs_sb(s)->sb_chk) { 137 if (de->down) { 138 hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x", 139 + le32_to_cpu(d->self), de_down_pointer(de)); 140 return; 141 } 142 + if (le16_to_cpu(de->length) != 32) { 143 + hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", le32_to_cpu(d->self)); 144 return; 145 } 146 } 147 if (ptr) { 148 d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + 4); 149 if (le32_to_cpu(d->first_free) > 2048) { 150 + hpfs_error(s, "set_last_pointer: too long dnode %08x", le32_to_cpu(d->self)); 151 d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - 4); 152 return; 153 } 154 + de->length = cpu_to_le16(36); 155 de->down = 1; 156 + *(dnode_secno *)((char *)de + 32) = cpu_to_le32(ptr); 157 } 158 } 159 ··· 169 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 170 int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last); 171 if (!c) { 172 + hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, le32_to_cpu(d->self)); 173 return NULL; 174 } 175 if (c < 0) break; ··· 177 memmove((char *)de + d_size, de, (char *)de_end - (char *)de); 178 memset(de, 0, d_size); 179 if (down_ptr) { 180 + *(dnode_secno *)((char *)de + d_size - 4) = cpu_to_le32(down_ptr); 181 de->down = 1; 182 } 183 + de->length = cpu_to_le16(d_size); 184 de->not_8x3 = hpfs_is_name_long(name, namelen); 185 de->namelen = namelen; 186 memcpy(de->name, name, namelen); ··· 195 struct hpfs_dirent *de) 196 { 197 if (de->last) { 198 + hpfs_error(s, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d->self)); 199 return; 200 } 201 + d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - le16_to_cpu(de->length)); 202 memmove(de, de_next_de(de), le32_to_cpu(d->first_free) + (char *)d - (char *)de); 203 } 204 ··· 206 { 207 struct hpfs_dirent *de; 208 struct hpfs_dirent *de_end = dnode_end_de(d); 209 + dnode_secno dno = le32_to_cpu(d->self); 210 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) 211 if (de->down) { 212 struct quad_buffer_head qbh; 213 struct dnode *dd; 214 if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) { 215 + if (le32_to_cpu(dd->up) != dno || dd->root_dnode) { 216 + dd->up = cpu_to_le32(dno); 217 dd->root_dnode = 0; 218 hpfs_mark_4buffers_dirty(&qbh); 219 } ··· 291 copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de); 292 for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1); 293 h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10; 294 + if (!(ad = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &adno, &qbh1))) { 295 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 296 hpfs_brelse4(&qbh); 297 kfree(nd); ··· 315 set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); 316 de = de_next_de(de); 317 memmove((char *)nd + 20, de, le32_to_cpu(nd->first_free) + (char *)nd - (char *)de); 318 + nd->first_free = cpu_to_le32(le32_to_cpu(nd->first_free) - ((char *)de - (char *)nd - 20)); 319 memcpy(d, nd, le32_to_cpu(nd->first_free)); 320 for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos); 321 fix_up_ptrs(i->i_sb, ad); 322 if (!d->root_dnode) { 323 + ad->up = d->up; 324 + dno = le32_to_cpu(ad->up); 325 hpfs_mark_4buffers_dirty(&qbh); 326 hpfs_brelse4(&qbh); 327 hpfs_mark_4buffers_dirty(&qbh1); 328 hpfs_brelse4(&qbh1); 329 goto go_up; 330 } 331 + if (!(rd = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &rdno, &qbh2))) { 332 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 333 hpfs_brelse4(&qbh); 334 hpfs_brelse4(&qbh1); ··· 339 i->i_blocks += 4; 340 rd->root_dnode = 1; 341 rd->up = d->up; 342 + if (!(fnode = hpfs_map_fnode(i->i_sb, le32_to_cpu(d->up), &bh))) { 343 hpfs_free_dnode(i->i_sb, rdno); 344 hpfs_brelse4(&qbh); 345 hpfs_brelse4(&qbh1); ··· 348 kfree(nname); 349 return 1; 350 } 351 + fnode->u.external[0].disk_secno = cpu_to_le32(rdno); 352 mark_buffer_dirty(bh); 353 brelse(bh); 354 + hpfs_i(i)->i_dno = rdno; 355 + d->up = ad->up = cpu_to_le32(rdno); 356 d->root_dnode = ad->root_dnode = 0; 357 hpfs_mark_4buffers_dirty(&qbh); 358 hpfs_brelse4(&qbh); ··· 436 return 0; 437 if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0; 438 if (hpfs_sb(i->i_sb)->sb_chk) { 439 + if (le32_to_cpu(dnode->up) != chk_up) { 440 hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x", 441 + dno, chk_up, le32_to_cpu(dnode->up)); 442 hpfs_brelse4(&qbh); 443 return 0; 444 } ··· 454 hpfs_brelse4(&qbh); 455 } 456 while (!(de = dnode_pre_last_de(dnode))) { 457 + dnode_secno up = le32_to_cpu(dnode->up); 458 hpfs_brelse4(&qbh); 459 hpfs_free_dnode(i->i_sb, dno); 460 i->i_size -= 2048; ··· 474 return 0; 475 } 476 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 477 + de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); 478 de->down = 0; 479 hpfs_mark_4buffers_dirty(&qbh); 480 dno = up; ··· 482 t = get_pos(dnode, de); 483 for_all_poss(i, hpfs_pos_subst, t, 4); 484 for_all_poss(i, hpfs_pos_subst, t + 1, 5); 485 + if (!(nde = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { 486 hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted"); 487 hpfs_brelse4(&qbh); 488 return 0; 489 } 490 + memcpy(nde, de, le16_to_cpu(de->length)); 491 ddno = de->down ? de_down_pointer(de) : 0; 492 hpfs_delete_de(i->i_sb, dnode, de); 493 set_last_pointer(i->i_sb, dnode, ddno); ··· 520 if (le32_to_cpu(dnode->first_free) == 52 || le32_to_cpu(dnode->first_free) == 56) { 521 struct hpfs_dirent *de_end; 522 int root = dnode->root_dnode; 523 + up = le32_to_cpu(dnode->up); 524 de = dnode_first_de(dnode); 525 down = de->down ? de_down_pointer(de) : 0; 526 if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) { ··· 544 return; 545 } 546 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 547 + d1->up = cpu_to_le32(up); 548 d1->root_dnode = 1; 549 hpfs_mark_4buffers_dirty(&qbh1); 550 hpfs_brelse4(&qbh1); 551 } 552 if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) { 553 + fnode->u.external[0].disk_secno = cpu_to_le32(down); 554 mark_buffer_dirty(bh); 555 brelse(bh); 556 } ··· 569 for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p); 570 if (!down) { 571 de->down = 0; 572 + de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); 573 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 574 memmove(de_next_de(de), (char *)de_next_de(de) + 4, 575 (char *)dnode + le32_to_cpu(dnode->first_free) - (char *)de_next_de(de)); 576 } else { 577 struct dnode *d1; 578 struct quad_buffer_head qbh1; 579 + *(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4) = down; 580 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 581 + d1->up = cpu_to_le32(up); 582 hpfs_mark_4buffers_dirty(&qbh1); 583 hpfs_brelse4(&qbh1); 584 } ··· 595 struct quad_buffer_head qbh1; 596 if (!de_next->down) goto endm; 597 ndown = de_down_pointer(de_next); 598 + if (!(de_cp = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { 599 printk("HPFS: out of memory for dtree balancing\n"); 600 goto endm; 601 } 602 + memcpy(de_cp, de, le16_to_cpu(de->length)); 603 hpfs_delete_de(i->i_sb, dnode, de); 604 hpfs_mark_4buffers_dirty(&qbh); 605 hpfs_brelse4(&qbh); 606 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4); 607 for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1); 608 if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) { 609 + d1->up = cpu_to_le32(ndown); 610 hpfs_mark_4buffers_dirty(&qbh1); 611 hpfs_brelse4(&qbh1); 612 } ··· 646 printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); 647 printk("HPFS: warning: goin'on\n"); 648 } 649 + del->length = cpu_to_le16(le16_to_cpu(del->length) + 4); 650 del->down = 1; 651 d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) + 4); 652 } 653 if (dlp && !down) { 654 + del->length = cpu_to_le16(le16_to_cpu(del->length) - 4); 655 del->down = 0; 656 d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) - 4); 657 } else if (down) 658 + *(dnode_secno *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down); 659 } else goto endm; 660 + if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) { 661 printk("HPFS: out of memory for dtree balancing\n"); 662 hpfs_brelse4(&qbh1); 663 goto endm; 664 } 665 hpfs_mark_4buffers_dirty(&qbh1); 666 hpfs_brelse4(&qbh1); 667 + memcpy(de_cp, de_prev, le16_to_cpu(de_prev->length)); 668 hpfs_delete_de(i->i_sb, dnode, de_prev); 669 if (!de_prev->down) { 670 + de_prev->length = cpu_to_le16(le16_to_cpu(de_prev->length) + 4); 671 de_prev->down = 1; 672 dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) + 4); 673 } 674 + *(dnode_secno *) ((void *) de_prev + le16_to_cpu(de_prev->length) - 4) = cpu_to_le32(ndown); 675 hpfs_mark_4buffers_dirty(&qbh); 676 hpfs_brelse4(&qbh); 677 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4); 678 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1)); 679 if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) { 680 + d1->up = cpu_to_le32(ndown); 681 hpfs_mark_4buffers_dirty(&qbh1); 682 hpfs_brelse4(&qbh1); 683 } ··· 744 ptr = 0; 745 go_up: 746 if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return; 747 + if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno) 748 + hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, le32_to_cpu(dnode->up)); 749 de = dnode_first_de(dnode); 750 if (ptr) while(1) { 751 if (de->down) if (de_down_pointer(de) == ptr) goto process_de; ··· 769 if (!de->first && !de->last && n_items) (*n_items)++; 770 if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de; 771 ptr = dno; 772 + dno = le32_to_cpu(dnode->up); 773 if (dnode->root_dnode) { 774 hpfs_brelse4(&qbh); 775 return; ··· 817 return d; 818 if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno; 819 if (hpfs_sb(s)->sb_chk) 820 + if (up && le32_to_cpu(((struct dnode *)qbh.data)->up) != up) 821 + hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, le32_to_cpu(((struct dnode *)qbh.data)->up)); 822 if (!de->down) { 823 hpfs_brelse4(&qbh); 824 return d; ··· 867 /* Going up */ 868 if (dnode->root_dnode) goto bail; 869 870 + if (!(up_dnode = hpfs_map_dnode(inode->i_sb, le32_to_cpu(dnode->up), &qbh0))) 871 goto bail; 872 873 end_up_de = dnode_end_de(up_dnode); ··· 875 for (up_de = dnode_first_de(up_dnode); up_de < end_up_de; 876 up_de = de_next_de(up_de)) { 877 if (!(++c & 077)) hpfs_error(inode->i_sb, 878 + "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", le32_to_cpu(dnode->up)); 879 if (up_de->down && de_down_pointer(up_de) == dno) { 880 + *posp = ((loff_t) le32_to_cpu(dnode->up) << 4) + c; 881 hpfs_brelse4(&qbh0); 882 return de; 883 } 884 } 885 886 hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x", 887 + dno, le32_to_cpu(dnode->up)); 888 hpfs_brelse4(&qbh0); 889 890 bail: ··· 1010 /*name2[15] = 0xff;*/ 1011 name1len = 15; name2len = 256; 1012 } 1013 + if (!(upf = hpfs_map_fnode(s, le32_to_cpu(f->up), &bh))) { 1014 kfree(name2); 1015 return NULL; 1016 } 1017 if (!upf->dirflag) { 1018 brelse(bh); 1019 + hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, le32_to_cpu(f->up)); 1020 kfree(name2); 1021 return NULL; 1022 } 1023 + dno = le32_to_cpu(upf->u.external[0].disk_secno); 1024 brelse(bh); 1025 go_down: 1026 downd = 0; ··· 1042 return NULL; 1043 } 1044 next_de: 1045 + if (le32_to_cpu(de->fnode) == fno) { 1046 kfree(name2); 1047 return de; 1048 } ··· 1058 goto go_down; 1059 } 1060 f: 1061 + if (le32_to_cpu(de->fnode) == fno) { 1062 kfree(name2); 1063 return de; 1064 } ··· 1067 if ((de = de_next_de(de)) < de_end) goto next_de; 1068 if (d->root_dnode) goto not_found; 1069 downd = dno; 1070 + dno = le32_to_cpu(d->up); 1071 hpfs_brelse4(qbh); 1072 if (hpfs_sb(s)->sb_chk) 1073 if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
+65 -64
fs/hpfs/ea.c
··· 24 } 25 if (hpfs_ea_read(s, a, ano, pos, 4, ex)) return; 26 if (ea->indirect) { 27 - if (ea->valuelen != 8) { 28 hpfs_error(s, "ea->indirect set while ea->valuelen!=8, %s %08x, pos %08x", 29 ano ? "anode" : "sectors", a, pos); 30 return; ··· 33 return; 34 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 35 } 36 - pos += ea->namelen + ea->valuelen + 5; 37 } 38 if (!ano) hpfs_free_sectors(s, a, (len+511) >> 9); 39 else { ··· 82 if (!strcmp(ea->name, key)) { 83 if (ea->indirect) 84 goto indirect; 85 - if (ea->valuelen >= size) 86 return -EINVAL; 87 - memcpy(buf, ea_data(ea), ea->valuelen); 88 - buf[ea->valuelen] = 0; 89 return 0; 90 } 91 - a = fnode->ea_secno; 92 - len = fnode->ea_size_l; 93 ano = fnode->ea_anode; 94 pos = 0; 95 while (pos < len) { ··· 106 if (!strcmp(ea->name, key)) { 107 if (ea->indirect) 108 goto indirect; 109 - if (ea->valuelen >= size) 110 return -EINVAL; 111 - if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, buf)) 112 return -EIO; 113 - buf[ea->valuelen] = 0; 114 return 0; 115 } 116 - pos += ea->namelen + ea->valuelen + 5; 117 } 118 return -ENOENT; 119 indirect: ··· 138 if (!strcmp(ea->name, key)) { 139 if (ea->indirect) 140 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 141 - if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { 142 printk("HPFS: out of memory for EA\n"); 143 return NULL; 144 } 145 - memcpy(ret, ea_data(ea), ea->valuelen); 146 - ret[ea->valuelen] = 0; 147 return ret; 148 } 149 - a = fnode->ea_secno; 150 - len = fnode->ea_size_l; 151 ano = fnode->ea_anode; 152 pos = 0; 153 while (pos < len) { ··· 164 if (!strcmp(ea->name, key)) { 165 if (ea->indirect) 166 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 167 - if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { 168 printk("HPFS: out of memory for EA\n"); 169 return NULL; 170 } 171 - if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, ret)) { 172 kfree(ret); 173 return NULL; 174 } 175 - ret[ea->valuelen] = 0; 176 return ret; 177 } 178 - pos += ea->namelen + ea->valuelen + 5; 179 } 180 return NULL; 181 } ··· 202 if (ea->indirect) { 203 if (ea_len(ea) == size) 204 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 205 - } else if (ea->valuelen == size) { 206 memcpy(ea_data(ea), data, size); 207 } 208 return; 209 } 210 - a = fnode->ea_secno; 211 - len = fnode->ea_size_l; 212 ano = fnode->ea_anode; 213 pos = 0; 214 while (pos < len) { ··· 228 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 229 } 230 else { 231 - if (ea->valuelen == size) 232 hpfs_ea_write(s, a, ano, pos + 4 + ea->namelen + 1, size, data); 233 } 234 return; 235 } 236 - pos += ea->namelen + ea->valuelen + 5; 237 } 238 - if (!fnode->ea_offs) { 239 - /*if (fnode->ea_size_s) { 240 hpfs_error(s, "fnode %08x: ea_size_s == %03x, ea_offs == 0", 241 - inode->i_ino, fnode->ea_size_s); 242 return; 243 }*/ 244 - fnode->ea_offs = 0xc4; 245 } 246 - if (fnode->ea_offs < 0xc4 || fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200) { 247 hpfs_error(s, "fnode %08lx: ea_offs == %03x, ea_size_s == %03x", 248 (unsigned long)inode->i_ino, 249 - fnode->ea_offs, fnode->ea_size_s); 250 return; 251 } 252 - if ((fnode->ea_size_s || !fnode->ea_size_l) && 253 - fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s + strlen(key) + size + 5 <= 0x200) { 254 ea = fnode_end_ea(fnode); 255 *(char *)ea = 0; 256 ea->namelen = strlen(key); 257 - ea->valuelen = size; 258 strcpy(ea->name, key); 259 memcpy(ea_data(ea), data, size); 260 - fnode->ea_size_s += strlen(key) + size + 5; 261 goto ret; 262 } 263 /* Most the code here is 99.9993422% unused. I hope there are no bugs. 264 But what .. HPFS.IFS has also bugs in ea management. */ 265 - if (fnode->ea_size_s && !fnode->ea_size_l) { 266 secno n; 267 struct buffer_head *bh; 268 char *data; ··· 271 hpfs_free_sectors(s, n, 1); 272 return; 273 } 274 - memcpy(data, fnode_ea(fnode), fnode->ea_size_s); 275 - fnode->ea_size_l = fnode->ea_size_s; 276 - fnode->ea_size_s = 0; 277 - fnode->ea_secno = n; 278 - fnode->ea_anode = 0; 279 mark_buffer_dirty(bh); 280 brelse(bh); 281 } 282 - pos = fnode->ea_size_l + 5 + strlen(key) + size; 283 - len = (fnode->ea_size_l + 511) >> 9; 284 if (pos >= 30000) goto bail; 285 while (((pos + 511) >> 9) > len) { 286 if (!len) { 287 - if (!(fnode->ea_secno = hpfs_alloc_sector(s, fno, 1, 0))) 288 - goto bail; 289 fnode->ea_anode = 0; 290 len++; 291 } else if (!fnode->ea_anode) { 292 - if (hpfs_alloc_if_possible(s, fnode->ea_secno + len)) { 293 len++; 294 } else { 295 /* Aargh... don't know how to create ea anodes :-( */ ··· 299 anode_secno a_s; 300 if (!(anode = hpfs_alloc_anode(s, fno, &a_s, &bh))) 301 goto bail; 302 - anode->up = fno; 303 anode->btree.fnode_parent = 1; 304 anode->btree.n_free_nodes--; 305 anode->btree.n_used_nodes++; 306 - anode->btree.first_free += 12; 307 - anode->u.external[0].disk_secno = fnode->ea_secno; 308 - anode->u.external[0].file_secno = 0; 309 - anode->u.external[0].length = len; 310 mark_buffer_dirty(bh); 311 brelse(bh); 312 fnode->ea_anode = 1; 313 - fnode->ea_secno = a_s;*/ 314 secno new_sec; 315 int i; 316 if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9)))) ··· 318 for (i = 0; i < len; i++) { 319 struct buffer_head *bh1, *bh2; 320 void *b1, *b2; 321 - if (!(b1 = hpfs_map_sector(s, fnode->ea_secno + i, &bh1, len - i - 1))) { 322 hpfs_free_sectors(s, new_sec, (pos + 511) >> 9); 323 goto bail; 324 } ··· 332 mark_buffer_dirty(bh2); 333 brelse(bh2); 334 } 335 - hpfs_free_sectors(s, fnode->ea_secno, len); 336 - fnode->ea_secno = new_sec; 337 len = (pos + 511) >> 9; 338 } 339 } 340 if (fnode->ea_anode) { 341 - if (hpfs_add_sector_to_btree(s, fnode->ea_secno, 342 0, len) != -1) { 343 len++; 344 } else { ··· 350 h[1] = strlen(key); 351 h[2] = size & 0xff; 352 h[3] = size >> 8; 353 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l, 4, h)) goto bail; 354 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 4, h[1] + 1, key)) goto bail; 355 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 5 + h[1], size, data)) goto bail; 356 - fnode->ea_size_l = pos; 357 ret: 358 hpfs_i(inode)->i_ea_size += 5 + strlen(key) + size; 359 return; 360 bail: 361 - if (fnode->ea_secno) 362 - if (fnode->ea_anode) hpfs_truncate_btree(s, fnode->ea_secno, 1, (fnode->ea_size_l + 511) >> 9); 363 - else hpfs_free_sectors(s, fnode->ea_secno + ((fnode->ea_size_l + 511) >> 9), len - ((fnode->ea_size_l + 511) >> 9)); 364 - else fnode->ea_secno = fnode->ea_size_l = 0; 365 } 366
··· 24 } 25 if (hpfs_ea_read(s, a, ano, pos, 4, ex)) return; 26 if (ea->indirect) { 27 + if (le16_to_cpu(ea->valuelen) != 8) { 28 hpfs_error(s, "ea->indirect set while ea->valuelen!=8, %s %08x, pos %08x", 29 ano ? "anode" : "sectors", a, pos); 30 return; ··· 33 return; 34 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 35 } 36 + pos += ea->namelen + le16_to_cpu(ea->valuelen) + 5; 37 } 38 if (!ano) hpfs_free_sectors(s, a, (len+511) >> 9); 39 else { ··· 82 if (!strcmp(ea->name, key)) { 83 if (ea->indirect) 84 goto indirect; 85 + if (le16_to_cpu(ea->valuelen) >= size) 86 return -EINVAL; 87 + memcpy(buf, ea_data(ea), le16_to_cpu(ea->valuelen)); 88 + buf[le16_to_cpu(ea->valuelen)] = 0; 89 return 0; 90 } 91 + a = le32_to_cpu(fnode->ea_secno); 92 + len = le32_to_cpu(fnode->ea_size_l); 93 ano = fnode->ea_anode; 94 pos = 0; 95 while (pos < len) { ··· 106 if (!strcmp(ea->name, key)) { 107 if (ea->indirect) 108 goto indirect; 109 + if (le16_to_cpu(ea->valuelen) >= size) 110 return -EINVAL; 111 + if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, le16_to_cpu(ea->valuelen), buf)) 112 return -EIO; 113 + buf[le16_to_cpu(ea->valuelen)] = 0; 114 return 0; 115 } 116 + pos += ea->namelen + le16_to_cpu(ea->valuelen) + 5; 117 } 118 return -ENOENT; 119 indirect: ··· 138 if (!strcmp(ea->name, key)) { 139 if (ea->indirect) 140 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 141 + if (!(ret = kmalloc((*size = le16_to_cpu(ea->valuelen)) + 1, GFP_NOFS))) { 142 printk("HPFS: out of memory for EA\n"); 143 return NULL; 144 } 145 + memcpy(ret, ea_data(ea), le16_to_cpu(ea->valuelen)); 146 + ret[le16_to_cpu(ea->valuelen)] = 0; 147 return ret; 148 } 149 + a = le32_to_cpu(fnode->ea_secno); 150 + len = le32_to_cpu(fnode->ea_size_l); 151 ano = fnode->ea_anode; 152 pos = 0; 153 while (pos < len) { ··· 164 if (!strcmp(ea->name, key)) { 165 if (ea->indirect) 166 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 167 + if (!(ret = kmalloc((*size = le16_to_cpu(ea->valuelen)) + 1, GFP_NOFS))) { 168 printk("HPFS: out of memory for EA\n"); 169 return NULL; 170 } 171 + if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, le16_to_cpu(ea->valuelen), ret)) { 172 kfree(ret); 173 return NULL; 174 } 175 + ret[le16_to_cpu(ea->valuelen)] = 0; 176 return ret; 177 } 178 + pos += ea->namelen + le16_to_cpu(ea->valuelen) + 5; 179 } 180 return NULL; 181 } ··· 202 if (ea->indirect) { 203 if (ea_len(ea) == size) 204 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 205 + } else if (le16_to_cpu(ea->valuelen) == size) { 206 memcpy(ea_data(ea), data, size); 207 } 208 return; 209 } 210 + a = le32_to_cpu(fnode->ea_secno); 211 + len = le32_to_cpu(fnode->ea_size_l); 212 ano = fnode->ea_anode; 213 pos = 0; 214 while (pos < len) { ··· 228 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 229 } 230 else { 231 + if (le16_to_cpu(ea->valuelen) == size) 232 hpfs_ea_write(s, a, ano, pos + 4 + ea->namelen + 1, size, data); 233 } 234 return; 235 } 236 + pos += ea->namelen + le16_to_cpu(ea->valuelen) + 5; 237 } 238 + if (!le16_to_cpu(fnode->ea_offs)) { 239 + /*if (le16_to_cpu(fnode->ea_size_s)) { 240 hpfs_error(s, "fnode %08x: ea_size_s == %03x, ea_offs == 0", 241 + inode->i_ino, le16_to_cpu(fnode->ea_size_s)); 242 return; 243 }*/ 244 + fnode->ea_offs = cpu_to_le16(0xc4); 245 } 246 + if (le16_to_cpu(fnode->ea_offs) < 0xc4 || le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200) { 247 hpfs_error(s, "fnode %08lx: ea_offs == %03x, ea_size_s == %03x", 248 (unsigned long)inode->i_ino, 249 + le32_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); 250 return; 251 } 252 + if ((le16_to_cpu(fnode->ea_size_s) || !le32_to_cpu(fnode->ea_size_l)) && 253 + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5 <= 0x200) { 254 ea = fnode_end_ea(fnode); 255 *(char *)ea = 0; 256 ea->namelen = strlen(key); 257 + ea->valuelen = cpu_to_le16(size); 258 strcpy(ea->name, key); 259 memcpy(ea_data(ea), data, size); 260 + fnode->ea_size_s = cpu_to_le16(le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5); 261 goto ret; 262 } 263 /* Most the code here is 99.9993422% unused. I hope there are no bugs. 264 But what .. HPFS.IFS has also bugs in ea management. */ 265 + if (le16_to_cpu(fnode->ea_size_s) && !le32_to_cpu(fnode->ea_size_l)) { 266 secno n; 267 struct buffer_head *bh; 268 char *data; ··· 271 hpfs_free_sectors(s, n, 1); 272 return; 273 } 274 + memcpy(data, fnode_ea(fnode), le16_to_cpu(fnode->ea_size_s)); 275 + fnode->ea_size_l = cpu_to_le32(le16_to_cpu(fnode->ea_size_s)); 276 + fnode->ea_size_s = cpu_to_le16(0); 277 + fnode->ea_secno = cpu_to_le32(n); 278 + fnode->ea_anode = cpu_to_le32(0); 279 mark_buffer_dirty(bh); 280 brelse(bh); 281 } 282 + pos = le32_to_cpu(fnode->ea_size_l) + 5 + strlen(key) + size; 283 + len = (le32_to_cpu(fnode->ea_size_l) + 511) >> 9; 284 if (pos >= 30000) goto bail; 285 while (((pos + 511) >> 9) > len) { 286 if (!len) { 287 + secno q = hpfs_alloc_sector(s, fno, 1, 0); 288 + if (!q) goto bail; 289 + fnode->ea_secno = cpu_to_le32(q); 290 fnode->ea_anode = 0; 291 len++; 292 } else if (!fnode->ea_anode) { 293 + if (hpfs_alloc_if_possible(s, le32_to_cpu(fnode->ea_secno) + len)) { 294 len++; 295 } else { 296 /* Aargh... don't know how to create ea anodes :-( */ ··· 298 anode_secno a_s; 299 if (!(anode = hpfs_alloc_anode(s, fno, &a_s, &bh))) 300 goto bail; 301 + anode->up = cpu_to_le32(fno); 302 anode->btree.fnode_parent = 1; 303 anode->btree.n_free_nodes--; 304 anode->btree.n_used_nodes++; 305 + anode->btree.first_free = cpu_to_le16(le16_to_cpu(anode->btree.first_free) + 12); 306 + anode->u.external[0].disk_secno = cpu_to_le32(le32_to_cpu(fnode->ea_secno)); 307 + anode->u.external[0].file_secno = cpu_to_le32(0); 308 + anode->u.external[0].length = cpu_to_le32(len); 309 mark_buffer_dirty(bh); 310 brelse(bh); 311 fnode->ea_anode = 1; 312 + fnode->ea_secno = cpu_to_le32(a_s);*/ 313 secno new_sec; 314 int i; 315 if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9)))) ··· 317 for (i = 0; i < len; i++) { 318 struct buffer_head *bh1, *bh2; 319 void *b1, *b2; 320 + if (!(b1 = hpfs_map_sector(s, le32_to_cpu(fnode->ea_secno) + i, &bh1, len - i - 1))) { 321 hpfs_free_sectors(s, new_sec, (pos + 511) >> 9); 322 goto bail; 323 } ··· 331 mark_buffer_dirty(bh2); 332 brelse(bh2); 333 } 334 + hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno), len); 335 + fnode->ea_secno = cpu_to_le32(new_sec); 336 len = (pos + 511) >> 9; 337 } 338 } 339 if (fnode->ea_anode) { 340 + if (hpfs_add_sector_to_btree(s, le32_to_cpu(fnode->ea_secno), 341 0, len) != -1) { 342 len++; 343 } else { ··· 349 h[1] = strlen(key); 350 h[2] = size & 0xff; 351 h[3] = size >> 8; 352 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l), 4, h)) goto bail; 353 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 4, h[1] + 1, key)) goto bail; 354 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 5 + h[1], size, data)) goto bail; 355 + fnode->ea_size_l = cpu_to_le32(pos); 356 ret: 357 hpfs_i(inode)->i_ea_size += 5 + strlen(key) + size; 358 return; 359 bail: 360 + if (le32_to_cpu(fnode->ea_secno)) 361 + if (fnode->ea_anode) hpfs_truncate_btree(s, le32_to_cpu(fnode->ea_secno), 1, (le32_to_cpu(fnode->ea_size_l) + 511) >> 9); 362 + else hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno) + ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9), len - ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9)); 363 + else fnode->ea_secno = fnode->ea_size_l = cpu_to_le32(0); 364 } 365
+149 -70
fs/hpfs/hpfs.h
··· 19 For definitive information on HPFS, ask somebody else -- this is guesswork. 20 There are certain to be many mistakes. */ 21 22 /* Notation */ 23 24 typedef u32 secno; /* sector number, partition relative */ ··· 90 secno badblocks; /* bad block list */ 91 u32 zero3; /* 0 */ 92 time32_t last_chkdsk; /* date last checked, 0 if never */ 93 - /*u32 zero4;*/ /* 0 */ 94 time32_t last_optimize; /* date last optimized, 0 if never */ 95 secno n_dir_band; /* number of sectors in dir band */ 96 secno dir_band_start; /* first sector in dir band */ ··· 112 u32 magic; /* f991 1849 */ 113 u32 magic1; /* fa52 29c5, more magic? */ 114 115 - unsigned dirty: 1; /* 0 clean, 1 "improperly stopped" */ 116 - unsigned sparedir_used: 1; /* spare dirblks used */ 117 - unsigned hotfixes_used: 1; /* hotfixes used */ 118 - unsigned bad_sector: 1; /* bad sector, corrupted disk (???) */ 119 - unsigned bad_bitmap: 1; /* bad bitmap */ 120 - unsigned fast: 1; /* partition was fast formatted */ 121 - unsigned old_wrote: 1; /* old version wrote to partion */ 122 - unsigned old_wrote_1: 1; /* old version wrote to partion (?) */ 123 - unsigned install_dasd_limits: 1; /* HPFS386 flags */ 124 - unsigned resynch_dasd_limits: 1; 125 - unsigned dasd_limits_operational: 1; 126 - unsigned multimedia_active: 1; 127 - unsigned dce_acls_active: 1; 128 - unsigned dasd_limits_dirty: 1; 129 - unsigned flag67: 2; 130 u8 mm_contlgulty; 131 u8 unused; 132 ··· 281 u32 magic; /* 77e4 0aae */ 282 u32 first_free; /* offset from start of dnode to 283 first free dir entry */ 284 - unsigned root_dnode:1; /* Is it root dnode? */ 285 - unsigned increment_me:31; /* some kind of activity counter? 286 - Neither HPFS.IFS nor CHKDSK cares 287 if you change this word */ 288 secno up; /* (root dnode) directory's fnode 289 (nonroot) parent dnode */ 290 dnode_secno self; /* pointer to this dnode */ ··· 300 }; 301 302 struct hpfs_dirent { 303 - u16 length; /* offset to next dirent */ 304 - unsigned first: 1; /* set on phony ^A^A (".") entry */ 305 - unsigned has_acl: 1; 306 - unsigned down: 1; /* down pointer present (after name) */ 307 - unsigned last: 1; /* set on phony \377 entry */ 308 - unsigned has_ea: 1; /* entry has EA */ 309 - unsigned has_xtd_perm: 1; /* has extended perm list (???) */ 310 - unsigned has_explicit_acl: 1; 311 - unsigned has_needea: 1; /* ?? some EA has NEEDEA set 312 I have no idea why this is 313 interesting in a dir entry */ 314 - unsigned read_only: 1; /* dos attrib */ 315 - unsigned hidden: 1; /* dos attrib */ 316 - unsigned system: 1; /* dos attrib */ 317 - unsigned flag11: 1; /* would be volume label dos attrib */ 318 - unsigned directory: 1; /* dos attrib */ 319 - unsigned archive: 1; /* dos attrib */ 320 - unsigned not_8x3: 1; /* name is not 8.3 */ 321 - unsigned flag15: 1; 322 fnode_secno fnode; /* fnode giving allocation info */ 323 time32_t write_date; /* mtime */ 324 u32 file_size; /* file length, bytes */ 325 time32_t read_date; /* atime */ 326 time32_t creation_date; /* ctime */ 327 u32 ea_size; /* total EA length, bytes */ 328 - unsigned char no_of_acls : 3; /* number of ACL's */ 329 - unsigned char reserver : 5; 330 u8 ix; /* code page index (of filename), see 331 struct code_page_data */ 332 u8 namelen, name[1]; /* file name */ ··· 388 389 struct bplus_header 390 { 391 - unsigned hbff: 1; /* high bit of first free entry offset */ 392 - unsigned flag1: 1; 393 - unsigned flag2: 1; 394 - unsigned flag3: 1; 395 - unsigned flag4: 1; 396 - unsigned fnode_parent: 1; /* ? we're pointed to by an fnode, 397 the data btree or some ea or the 398 main ea bootage pointer ea_secno */ 399 /* also can get set in fnodes, which 400 may be a chkdsk glitch or may mean 401 this bit is irrelevant in fnodes, 402 or this interpretation is all wet */ 403 - unsigned binary_search: 1; /* suggest binary search (unused) */ 404 - unsigned internal: 1; /* 1 -> (internal) tree of anodes 405 0 -> (leaf) list of extents */ 406 u8 fill[3]; 407 u8 n_free_nodes; /* free nodes in following array */ 408 u8 n_used_nodes; /* used nodes in following array */ ··· 451 secno ea_secno; /* first sector of disk-resident ea's*/ 452 u16 ea_size_s; /* length of fnode-resident ea's */ 453 454 - unsigned flag0: 1; 455 - unsigned ea_anode: 1; /* 1 -> ea_secno is an anode */ 456 - unsigned flag2: 1; 457 - unsigned flag3: 1; 458 - unsigned flag4: 1; 459 - unsigned flag5: 1; 460 - unsigned flag6: 1; 461 - unsigned flag7: 1; 462 - unsigned dirflag: 1; /* 1 -> directory. first & only extent 463 points to dnode. */ 464 - unsigned flag9: 1; 465 - unsigned flag10: 1; 466 - unsigned flag11: 1; 467 - unsigned flag12: 1; 468 - unsigned flag13: 1; 469 - unsigned flag14: 1; 470 - unsigned flag15: 1; 471 472 struct bplus_header btree; /* b+ tree, 8 extents or 12 subtrees */ 473 union { ··· 530 531 struct extended_attribute 532 { 533 - unsigned indirect: 1; /* 1 -> value gives sector number 534 where real value starts */ 535 - unsigned anode: 1; /* 1 -> sector is an anode 536 that points to fragmented value */ 537 - unsigned flag2: 1; 538 - unsigned flag3: 1; 539 - unsigned flag4: 1; 540 - unsigned flag5: 1; 541 - unsigned flag6: 1; 542 - unsigned needea: 1; /* required ea */ 543 u8 namelen; /* length of name, bytes */ 544 u16 valuelen; /* length of value, bytes */ 545 u8 name[0];
··· 19 For definitive information on HPFS, ask somebody else -- this is guesswork. 20 There are certain to be many mistakes. */ 21 22 + #if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) 23 + #error unknown endian 24 + #endif 25 + 26 /* Notation */ 27 28 typedef u32 secno; /* sector number, partition relative */ ··· 86 secno badblocks; /* bad block list */ 87 u32 zero3; /* 0 */ 88 time32_t last_chkdsk; /* date last checked, 0 if never */ 89 time32_t last_optimize; /* date last optimized, 0 if never */ 90 secno n_dir_band; /* number of sectors in dir band */ 91 secno dir_band_start; /* first sector in dir band */ ··· 109 u32 magic; /* f991 1849 */ 110 u32 magic1; /* fa52 29c5, more magic? */ 111 112 + #ifdef __LITTLE_ENDIAN 113 + u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ 114 + u8 sparedir_used: 1; /* spare dirblks used */ 115 + u8 hotfixes_used: 1; /* hotfixes used */ 116 + u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ 117 + u8 bad_bitmap: 1; /* bad bitmap */ 118 + u8 fast: 1; /* partition was fast formatted */ 119 + u8 old_wrote: 1; /* old version wrote to partion */ 120 + u8 old_wrote_1: 1; /* old version wrote to partion (?) */ 121 + #else 122 + u8 old_wrote_1: 1; /* old version wrote to partion (?) */ 123 + u8 old_wrote: 1; /* old version wrote to partion */ 124 + u8 fast: 1; /* partition was fast formatted */ 125 + u8 bad_bitmap: 1; /* bad bitmap */ 126 + u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ 127 + u8 hotfixes_used: 1; /* hotfixes used */ 128 + u8 sparedir_used: 1; /* spare dirblks used */ 129 + u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ 130 + #endif 131 + 132 + #ifdef __LITTLE_ENDIAN 133 + u8 install_dasd_limits: 1; /* HPFS386 flags */ 134 + u8 resynch_dasd_limits: 1; 135 + u8 dasd_limits_operational: 1; 136 + u8 multimedia_active: 1; 137 + u8 dce_acls_active: 1; 138 + u8 dasd_limits_dirty: 1; 139 + u8 flag67: 2; 140 + #else 141 + u8 flag67: 2; 142 + u8 dasd_limits_dirty: 1; 143 + u8 dce_acls_active: 1; 144 + u8 multimedia_active: 1; 145 + u8 dasd_limits_operational: 1; 146 + u8 resynch_dasd_limits: 1; 147 + u8 install_dasd_limits: 1; /* HPFS386 flags */ 148 + #endif 149 + 150 u8 mm_contlgulty; 151 u8 unused; 152 ··· 255 u32 magic; /* 77e4 0aae */ 256 u32 first_free; /* offset from start of dnode to 257 first free dir entry */ 258 + #ifdef __LITTLE_ENDIAN 259 + u8 root_dnode: 1; /* Is it root dnode? */ 260 + u8 increment_me: 7; /* some kind of activity counter? */ 261 + /* Neither HPFS.IFS nor CHKDSK cares 262 if you change this word */ 263 + #else 264 + u8 increment_me: 7; /* some kind of activity counter? */ 265 + /* Neither HPFS.IFS nor CHKDSK cares 266 + if you change this word */ 267 + u8 root_dnode: 1; /* Is it root dnode? */ 268 + #endif 269 + u8 increment_me2[3]; 270 secno up; /* (root dnode) directory's fnode 271 (nonroot) parent dnode */ 272 dnode_secno self; /* pointer to this dnode */ ··· 266 }; 267 268 struct hpfs_dirent { 269 + u16 length; /* offset to next dirent */ 270 + 271 + #ifdef __LITTLE_ENDIAN 272 + u8 first: 1; /* set on phony ^A^A (".") entry */ 273 + u8 has_acl: 1; 274 + u8 down: 1; /* down pointer present (after name) */ 275 + u8 last: 1; /* set on phony \377 entry */ 276 + u8 has_ea: 1; /* entry has EA */ 277 + u8 has_xtd_perm: 1; /* has extended perm list (???) */ 278 + u8 has_explicit_acl: 1; 279 + u8 has_needea: 1; /* ?? some EA has NEEDEA set 280 I have no idea why this is 281 interesting in a dir entry */ 282 + #else 283 + u8 has_needea: 1; /* ?? some EA has NEEDEA set 284 + I have no idea why this is 285 + interesting in a dir entry */ 286 + u8 has_explicit_acl: 1; 287 + u8 has_xtd_perm: 1; /* has extended perm list (???) */ 288 + u8 has_ea: 1; /* entry has EA */ 289 + u8 last: 1; /* set on phony \377 entry */ 290 + u8 down: 1; /* down pointer present (after name) */ 291 + u8 has_acl: 1; 292 + u8 first: 1; /* set on phony ^A^A (".") entry */ 293 + #endif 294 + 295 + #ifdef __LITTLE_ENDIAN 296 + u8 read_only: 1; /* dos attrib */ 297 + u8 hidden: 1; /* dos attrib */ 298 + u8 system: 1; /* dos attrib */ 299 + u8 flag11: 1; /* would be volume label dos attrib */ 300 + u8 directory: 1; /* dos attrib */ 301 + u8 archive: 1; /* dos attrib */ 302 + u8 not_8x3: 1; /* name is not 8.3 */ 303 + u8 flag15: 1; 304 + #else 305 + u8 flag15: 1; 306 + u8 not_8x3: 1; /* name is not 8.3 */ 307 + u8 archive: 1; /* dos attrib */ 308 + u8 directory: 1; /* dos attrib */ 309 + u8 flag11: 1; /* would be volume label dos attrib */ 310 + u8 system: 1; /* dos attrib */ 311 + u8 hidden: 1; /* dos attrib */ 312 + u8 read_only: 1; /* dos attrib */ 313 + #endif 314 + 315 fnode_secno fnode; /* fnode giving allocation info */ 316 time32_t write_date; /* mtime */ 317 u32 file_size; /* file length, bytes */ 318 time32_t read_date; /* atime */ 319 time32_t creation_date; /* ctime */ 320 u32 ea_size; /* total EA length, bytes */ 321 + u8 no_of_acls; /* number of ACL's (low 3 bits) */ 322 u8 ix; /* code page index (of filename), see 323 struct code_page_data */ 324 u8 namelen, name[1]; /* file name */ ··· 328 329 struct bplus_header 330 { 331 + #ifdef __LITTLE_ENDIAN 332 + u8 hbff: 1; /* high bit of first free entry offset */ 333 + u8 flag1234: 4; 334 + u8 fnode_parent: 1; /* ? we're pointed to by an fnode, 335 the data btree or some ea or the 336 main ea bootage pointer ea_secno */ 337 /* also can get set in fnodes, which 338 may be a chkdsk glitch or may mean 339 this bit is irrelevant in fnodes, 340 or this interpretation is all wet */ 341 + u8 binary_search: 1; /* suggest binary search (unused) */ 342 + u8 internal: 1; /* 1 -> (internal) tree of anodes 343 0 -> (leaf) list of extents */ 344 + #else 345 + u8 internal: 1; /* 1 -> (internal) tree of anodes 346 + 0 -> (leaf) list of extents */ 347 + u8 binary_search: 1; /* suggest binary search (unused) */ 348 + u8 fnode_parent: 1; /* ? we're pointed to by an fnode, 349 + the data btree or some ea or the 350 + main ea bootage pointer ea_secno */ 351 + /* also can get set in fnodes, which 352 + may be a chkdsk glitch or may mean 353 + this bit is irrelevant in fnodes, 354 + or this interpretation is all wet */ 355 + u8 flag1234: 4; 356 + u8 hbff: 1; /* high bit of first free entry offset */ 357 + #endif 358 u8 fill[3]; 359 u8 n_free_nodes; /* free nodes in following array */ 360 u8 n_used_nodes; /* used nodes in following array */ ··· 379 secno ea_secno; /* first sector of disk-resident ea's*/ 380 u16 ea_size_s; /* length of fnode-resident ea's */ 381 382 + #ifdef __LITTLE_ENDIAN 383 + u8 flag0: 1; 384 + u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ 385 + u8 flag234567: 6; 386 + #else 387 + u8 flag234567: 6; 388 + u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ 389 + u8 flag0: 1; 390 + #endif 391 + 392 + #ifdef __LITTLE_ENDIAN 393 + u8 dirflag: 1; /* 1 -> directory. first & only extent 394 points to dnode. */ 395 + u8 flag9012345: 7; 396 + #else 397 + u8 flag9012345: 7; 398 + u8 dirflag: 1; /* 1 -> directory. first & only extent 399 + points to dnode. */ 400 + #endif 401 402 struct bplus_header btree; /* b+ tree, 8 extents or 12 subtrees */ 403 union { ··· 456 457 struct extended_attribute 458 { 459 + #ifdef __LITTLE_ENDIAN 460 + u8 indirect: 1; /* 1 -> value gives sector number 461 where real value starts */ 462 + u8 anode: 1; /* 1 -> sector is an anode 463 that points to fragmented value */ 464 + u8 flag23456: 5; 465 + u8 needea: 1; /* required ea */ 466 + #else 467 + u8 needea: 1; /* required ea */ 468 + u8 flag23456: 5; 469 + u8 anode: 1; /* 1 -> sector is an anode 470 + that points to fragmented value */ 471 + u8 indirect: 1; /* 1 -> value gives sector number 472 + where real value starts */ 473 + #endif 474 u8 namelen; /* length of name, bytes */ 475 u16 valuelen; /* length of value, bytes */ 476 u8 name[0];
+13 -14
fs/hpfs/hpfs_fn.h
··· 84 unsigned *sb_bmp_dir; /* main bitmap directory */ 85 unsigned sb_c_bitmap; /* current bitmap */ 86 unsigned sb_max_fwd_alloc; /* max forwad allocation */ 87 - /*unsigned sb_mounting : 1;*/ 88 int sb_timeshift; 89 }; 90 ··· 99 static inline dnode_secno de_down_pointer (struct hpfs_dirent *de) 100 { 101 CHKCOND(de->down,("HPFS: de_down_pointer: !de->down\n")); 102 - return *(dnode_secno *) ((void *) de + de->length - 4); 103 } 104 105 /* The first dir entry in a dnode */ ··· 113 114 static inline struct hpfs_dirent *dnode_end_de (struct dnode *dnode) 115 { 116 - CHKCOND(dnode->first_free>=0x14 && dnode->first_free<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %d\n",(int)dnode->first_free)); 117 - return (void *) dnode + dnode->first_free; 118 } 119 120 /* The dir entry after dir entry de */ 121 122 static inline struct hpfs_dirent *de_next_de (struct hpfs_dirent *de) 123 { 124 - CHKCOND(de->length>=0x20 && de->length<0x800,("HPFS: de_next_de: de->length = %d\n",(int)de->length)); 125 - return (void *) de + de->length; 126 } 127 128 static inline struct extended_attribute *fnode_ea(struct fnode *fnode) 129 { 130 - return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s); 131 } 132 133 static inline struct extended_attribute *fnode_end_ea(struct fnode *fnode) 134 { 135 - return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s); 136 } 137 138 static inline struct extended_attribute *next_ea(struct extended_attribute *ea) 139 { 140 - return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + ea->valuelen); 141 } 142 143 static inline secno ea_sec(struct extended_attribute *ea) 144 { 145 - return *(secno *)((char *)ea + 9 + ea->namelen); 146 } 147 148 static inline secno ea_len(struct extended_attribute *ea) 149 { 150 - return *(secno *)((char *)ea + 5 + ea->namelen); 151 } 152 153 static inline char *ea_data(struct extended_attribute *ea) ··· 172 dst->not_8x3 = n; 173 } 174 175 - static inline unsigned tstbits(unsigned *bmp, unsigned b, unsigned n) 176 { 177 int i; 178 if ((b >= 0x4000) || (b + n - 1 >= 0x4000)) return n; 179 - if (!((bmp[(b & 0x3fff) >> 5] >> (b & 0x1f)) & 1)) return 1; 180 for (i = 1; i < n; i++) 181 - if (/*b+i < 0x4000 &&*/ !((bmp[((b+i) & 0x3fff) >> 5] >> ((b+i) & 0x1f)) & 1)) 182 return i + 1; 183 return 0; 184 }
··· 84 unsigned *sb_bmp_dir; /* main bitmap directory */ 85 unsigned sb_c_bitmap; /* current bitmap */ 86 unsigned sb_max_fwd_alloc; /* max forwad allocation */ 87 int sb_timeshift; 88 }; 89 ··· 100 static inline dnode_secno de_down_pointer (struct hpfs_dirent *de) 101 { 102 CHKCOND(de->down,("HPFS: de_down_pointer: !de->down\n")); 103 + return le32_to_cpu(*(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4)); 104 } 105 106 /* The first dir entry in a dnode */ ··· 114 115 static inline struct hpfs_dirent *dnode_end_de (struct dnode *dnode) 116 { 117 + CHKCOND(le32_to_cpu(dnode->first_free)>=0x14 && le32_to_cpu(dnode->first_free)<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %x\n",(unsigned)le32_to_cpu(dnode->first_free))); 118 + return (void *) dnode + le32_to_cpu(dnode->first_free); 119 } 120 121 /* The dir entry after dir entry de */ 122 123 static inline struct hpfs_dirent *de_next_de (struct hpfs_dirent *de) 124 { 125 + CHKCOND(le16_to_cpu(de->length)>=0x20 && le16_to_cpu(de->length)<0x800,("HPFS: de_next_de: de->length = %x\n",(unsigned)le16_to_cpu(de->length))); 126 + return (void *) de + le16_to_cpu(de->length); 127 } 128 129 static inline struct extended_attribute *fnode_ea(struct fnode *fnode) 130 { 131 + return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s)); 132 } 133 134 static inline struct extended_attribute *fnode_end_ea(struct fnode *fnode) 135 { 136 + return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s)); 137 } 138 139 static inline struct extended_attribute *next_ea(struct extended_attribute *ea) 140 { 141 + return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + le16_to_cpu(ea->valuelen)); 142 } 143 144 static inline secno ea_sec(struct extended_attribute *ea) 145 { 146 + return le32_to_cpu(*((secno *)((char *)ea + 9 + ea->namelen))); 147 } 148 149 static inline secno ea_len(struct extended_attribute *ea) 150 { 151 + return le32_to_cpu(*((secno *)((char *)ea + 5 + ea->namelen))); 152 } 153 154 static inline char *ea_data(struct extended_attribute *ea) ··· 173 dst->not_8x3 = n; 174 } 175 176 + static inline unsigned tstbits(u32 *bmp, unsigned b, unsigned n) 177 { 178 int i; 179 if ((b >= 0x4000) || (b + n - 1 >= 0x4000)) return n; 180 + if (!((le32_to_cpu(bmp[(b & 0x3fff) >> 5]) >> (b & 0x1f)) & 1)) return 1; 181 for (i = 1; i < n; i++) 182 + if (!((le32_to_cpu(bmp[((b+i) & 0x3fff) >> 5]) >> ((b+i) & 0x1f)) & 1)) 183 return i + 1; 184 return 0; 185 }
+17 -17
fs/hpfs/inode.c
··· 115 i->i_mode |= S_IFDIR; 116 i->i_op = &hpfs_dir_iops; 117 i->i_fop = &hpfs_dir_ops; 118 - hpfs_inode->i_parent_dir = fnode->up; 119 - hpfs_inode->i_dno = fnode->u.external[0].disk_secno; 120 if (hpfs_sb(sb)->sb_chk >= 2) { 121 struct buffer_head *bh0; 122 if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); ··· 132 i->i_op = &hpfs_file_iops; 133 i->i_fop = &hpfs_file_ops; 134 i->i_nlink = 1; 135 - i->i_size = fnode->file_size; 136 i->i_blocks = ((i->i_size + 511) >> 9) + 1; 137 i->i_data.a_ops = &hpfs_aops; 138 hpfs_i(i)->mmu_private = i->i_size; ··· 143 static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) 144 { 145 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 146 - /*if (fnode->acl_size_l || fnode->acl_size_s) { 147 Some unknown structures like ACL may be in fnode, 148 we'd better not overwrite them 149 hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); ··· 218 } 219 } else de = NULL; 220 if (S_ISREG(i->i_mode)) { 221 - fnode->file_size = i->i_size; 222 - if (de) de->file_size = i->i_size; 223 } else if (S_ISDIR(i->i_mode)) { 224 - fnode->file_size = 0; 225 - if (de) de->file_size = 0; 226 } 227 hpfs_write_inode_ea(i, fnode); 228 if (de) { 229 - de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); 230 - de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); 231 - de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); 232 de->read_only = !(i->i_mode & 0222); 233 - de->ea_size = hpfs_inode->i_ea_size; 234 hpfs_mark_4buffers_dirty(&qbh); 235 hpfs_brelse4(&qbh); 236 } 237 if (S_ISDIR(i->i_mode)) { 238 if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { 239 - de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); 240 - de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); 241 - de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); 242 de->read_only = !(i->i_mode & 0222); 243 - de->ea_size = /*hpfs_inode->i_ea_size*/0; 244 - de->file_size = 0; 245 hpfs_mark_4buffers_dirty(&qbh); 246 hpfs_brelse4(&qbh); 247 } else
··· 115 i->i_mode |= S_IFDIR; 116 i->i_op = &hpfs_dir_iops; 117 i->i_fop = &hpfs_dir_ops; 118 + hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up); 119 + hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno); 120 if (hpfs_sb(sb)->sb_chk >= 2) { 121 struct buffer_head *bh0; 122 if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); ··· 132 i->i_op = &hpfs_file_iops; 133 i->i_fop = &hpfs_file_ops; 134 i->i_nlink = 1; 135 + i->i_size = le32_to_cpu(fnode->file_size); 136 i->i_blocks = ((i->i_size + 511) >> 9) + 1; 137 i->i_data.a_ops = &hpfs_aops; 138 hpfs_i(i)->mmu_private = i->i_size; ··· 143 static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) 144 { 145 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 146 + /*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) { 147 Some unknown structures like ACL may be in fnode, 148 we'd better not overwrite them 149 hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); ··· 218 } 219 } else de = NULL; 220 if (S_ISREG(i->i_mode)) { 221 + fnode->file_size = cpu_to_le32(i->i_size); 222 + if (de) de->file_size = cpu_to_le32(i->i_size); 223 } else if (S_ISDIR(i->i_mode)) { 224 + fnode->file_size = cpu_to_le32(0); 225 + if (de) de->file_size = cpu_to_le32(0); 226 } 227 hpfs_write_inode_ea(i, fnode); 228 if (de) { 229 + de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 230 + de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 231 + de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 232 de->read_only = !(i->i_mode & 0222); 233 + de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size); 234 hpfs_mark_4buffers_dirty(&qbh); 235 hpfs_brelse4(&qbh); 236 } 237 if (S_ISDIR(i->i_mode)) { 238 if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { 239 + de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 240 + de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 241 + de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 242 de->read_only = !(i->i_mode & 0222); 243 + de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0); 244 + de->file_size = cpu_to_le32(0); 245 hpfs_mark_4buffers_dirty(&qbh); 246 hpfs_brelse4(&qbh); 247 } else
+30 -26
fs/hpfs/map.c
··· 21 hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); 22 return NULL; 23 } 24 - sec = hpfs_sb(s)->sb_bmp_dir[bmp_block]; 25 if (!sec || sec > hpfs_sb(s)->sb_fs_size-4) { 26 hpfs_error(s, "invalid bitmap block pointer %08x -> %08x at %s", bmp_block, sec, id); 27 return NULL; ··· 46 struct code_page_data *cpd; 47 struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0); 48 if (!cp) return NULL; 49 - if (cp->magic != CP_DIR_MAGIC) { 50 - printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", cp->magic); 51 brelse(bh); 52 return NULL; 53 } 54 - if (!cp->n_code_pages) { 55 printk("HPFS: n_code_pages == 0\n"); 56 brelse(bh); 57 return NULL; 58 } 59 - cpds = cp->array[0].code_page_data; 60 - cpi = cp->array[0].index; 61 brelse(bh); 62 63 if (cpi >= 3) { ··· 66 } 67 68 if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL; 69 - if ((unsigned)cpd->offs[cpi] > 0x178) { 70 printk("HPFS: Code page index out of sector\n"); 71 brelse(bh); 72 return NULL; 73 } 74 - ptr = (unsigned char *)cpd + cpd->offs[cpi] + 6; 75 if (!(cp_table = kmalloc(256, GFP_KERNEL))) { 76 printk("HPFS: out of memory for code page table\n"); 77 brelse(bh); ··· 125 if (hpfs_sb(s)->sb_chk) { 126 struct extended_attribute *ea; 127 struct extended_attribute *ea_end; 128 - if (fnode->magic != FNODE_MAGIC) { 129 hpfs_error(s, "bad magic on fnode %08lx", 130 (unsigned long)ino); 131 goto bail; ··· 138 (unsigned long)ino); 139 goto bail; 140 } 141 - if (fnode->btree.first_free != 142 8 + fnode->btree.n_used_nodes * (fnode->btree.internal ? 8 : 12)) { 143 hpfs_error(s, 144 "bad first_free pointer in fnode %08lx", ··· 146 goto bail; 147 } 148 } 149 - if (fnode->ea_size_s && ((signed int)fnode->ea_offs < 0xc4 || 150 - (signed int)fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200)) { 151 hpfs_error(s, 152 "bad EA info in fnode %08lx: ea_offs == %04x ea_size_s == %04x", 153 (unsigned long)ino, 154 - fnode->ea_offs, fnode->ea_size_s); 155 goto bail; 156 } 157 ea = fnode_ea(fnode); ··· 178 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL; 179 if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD))) 180 if (hpfs_sb(s)->sb_chk) { 181 - if (anode->magic != ANODE_MAGIC || anode->self != ano) { 182 hpfs_error(s, "bad magic on anode %08x", ano); 183 goto bail; 184 } 185 if ((unsigned)anode->btree.n_used_nodes + (unsigned)anode->btree.n_free_nodes != ··· 191 hpfs_error(s, "bad number of nodes in anode %08x", ano); 192 goto bail; 193 } 194 - if (anode->btree.first_free != 195 8 + anode->btree.n_used_nodes * (anode->btree.internal ? 8 : 12)) { 196 hpfs_error(s, "bad first_free pointer in anode %08x", ano); 197 goto bail; ··· 223 unsigned p, pp = 0; 224 unsigned char *d = (unsigned char *)dnode; 225 int b = 0; 226 - if (dnode->magic != DNODE_MAGIC) { 227 hpfs_error(s, "bad magic on dnode %08x", secno); 228 goto bail; 229 } 230 - if (dnode->self != secno) 231 - hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, dnode->self); 232 /* Check dirents - bad dirents would cause infinite 233 loops or shooting to memory */ 234 - if (dnode->first_free > 2048/* || dnode->first_free < 84*/) { 235 - hpfs_error(s, "dnode %08x has first_free == %08x", secno, dnode->first_free); 236 goto bail; 237 } 238 - for (p = 20; p < dnode->first_free; p += d[p] + (d[p+1] << 8)) { 239 struct hpfs_dirent *de = (struct hpfs_dirent *)((char *)dnode + p); 240 - if (de->length > 292 || (de->length < 32) || (de->length & 3) || p + de->length > 2048) { 241 hpfs_error(s, "bad dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 242 goto bail; 243 } 244 - if (((31 + de->namelen + de->down*4 + 3) & ~3) != de->length) { 245 - if (((31 + de->namelen + de->down*4 + 3) & ~3) < de->length && s->s_flags & MS_RDONLY) goto ok; 246 hpfs_error(s, "namelen does not match dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 247 goto bail; 248 } ··· 255 pp = p; 256 257 } 258 - if (p != dnode->first_free) { 259 hpfs_error(s, "size on last dirent does not match first_free; dnode %08x", secno); 260 goto bail; 261 } ··· 281 if (!fnode) 282 return 0; 283 284 - dno = fnode->u.external[0].disk_secno; 285 brelse(bh); 286 return dno; 287 }
··· 21 hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); 22 return NULL; 23 } 24 + sec = le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[bmp_block]); 25 if (!sec || sec > hpfs_sb(s)->sb_fs_size-4) { 26 hpfs_error(s, "invalid bitmap block pointer %08x -> %08x at %s", bmp_block, sec, id); 27 return NULL; ··· 46 struct code_page_data *cpd; 47 struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0); 48 if (!cp) return NULL; 49 + if (le32_to_cpu(cp->magic) != CP_DIR_MAGIC) { 50 + printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", le32_to_cpu(cp->magic)); 51 brelse(bh); 52 return NULL; 53 } 54 + if (!le32_to_cpu(cp->n_code_pages)) { 55 printk("HPFS: n_code_pages == 0\n"); 56 brelse(bh); 57 return NULL; 58 } 59 + cpds = le32_to_cpu(cp->array[0].code_page_data); 60 + cpi = le16_to_cpu(cp->array[0].index); 61 brelse(bh); 62 63 if (cpi >= 3) { ··· 66 } 67 68 if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL; 69 + if (le16_to_cpu(cpd->offs[cpi]) > 0x178) { 70 printk("HPFS: Code page index out of sector\n"); 71 brelse(bh); 72 return NULL; 73 } 74 + ptr = (unsigned char *)cpd + le16_to_cpu(cpd->offs[cpi]) + 6; 75 if (!(cp_table = kmalloc(256, GFP_KERNEL))) { 76 printk("HPFS: out of memory for code page table\n"); 77 brelse(bh); ··· 125 if (hpfs_sb(s)->sb_chk) { 126 struct extended_attribute *ea; 127 struct extended_attribute *ea_end; 128 + if (le32_to_cpu(fnode->magic) != FNODE_MAGIC) { 129 hpfs_error(s, "bad magic on fnode %08lx", 130 (unsigned long)ino); 131 goto bail; ··· 138 (unsigned long)ino); 139 goto bail; 140 } 141 + if (le16_to_cpu(fnode->btree.first_free) != 142 8 + fnode->btree.n_used_nodes * (fnode->btree.internal ? 8 : 12)) { 143 hpfs_error(s, 144 "bad first_free pointer in fnode %08lx", ··· 146 goto bail; 147 } 148 } 149 + if (le16_to_cpu(fnode->ea_size_s) && (le16_to_cpu(fnode->ea_offs) < 0xc4 || 150 + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200)) { 151 hpfs_error(s, 152 "bad EA info in fnode %08lx: ea_offs == %04x ea_size_s == %04x", 153 (unsigned long)ino, 154 + le16_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); 155 goto bail; 156 } 157 ea = fnode_ea(fnode); ··· 178 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL; 179 if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD))) 180 if (hpfs_sb(s)->sb_chk) { 181 + if (le32_to_cpu(anode->magic) != ANODE_MAGIC) { 182 hpfs_error(s, "bad magic on anode %08x", ano); 183 + goto bail; 184 + } 185 + if (le32_to_cpu(anode->self) != ano) { 186 + hpfs_error(s, "self pointer invalid on anode %08x", ano); 187 goto bail; 188 } 189 if ((unsigned)anode->btree.n_used_nodes + (unsigned)anode->btree.n_free_nodes != ··· 187 hpfs_error(s, "bad number of nodes in anode %08x", ano); 188 goto bail; 189 } 190 + if (le16_to_cpu(anode->btree.first_free) != 191 8 + anode->btree.n_used_nodes * (anode->btree.internal ? 8 : 12)) { 192 hpfs_error(s, "bad first_free pointer in anode %08x", ano); 193 goto bail; ··· 219 unsigned p, pp = 0; 220 unsigned char *d = (unsigned char *)dnode; 221 int b = 0; 222 + if (le32_to_cpu(dnode->magic) != DNODE_MAGIC) { 223 hpfs_error(s, "bad magic on dnode %08x", secno); 224 goto bail; 225 } 226 + if (le32_to_cpu(dnode->self) != secno) 227 + hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, le32_to_cpu(dnode->self)); 228 /* Check dirents - bad dirents would cause infinite 229 loops or shooting to memory */ 230 + if (le32_to_cpu(dnode->first_free) > 2048) { 231 + hpfs_error(s, "dnode %08x has first_free == %08x", secno, le32_to_cpu(dnode->first_free)); 232 goto bail; 233 } 234 + for (p = 20; p < le32_to_cpu(dnode->first_free); p += d[p] + (d[p+1] << 8)) { 235 struct hpfs_dirent *de = (struct hpfs_dirent *)((char *)dnode + p); 236 + if (le16_to_cpu(de->length) > 292 || (le16_to_cpu(de->length) < 32) || (le16_to_cpu(de->length) & 3) || p + le16_to_cpu(de->length) > 2048) { 237 hpfs_error(s, "bad dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 238 goto bail; 239 } 240 + if (((31 + de->namelen + de->down*4 + 3) & ~3) != le16_to_cpu(de->length)) { 241 + if (((31 + de->namelen + de->down*4 + 3) & ~3) < le16_to_cpu(de->length) && s->s_flags & MS_RDONLY) goto ok; 242 hpfs_error(s, "namelen does not match dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 243 goto bail; 244 } ··· 251 pp = p; 252 253 } 254 + if (p != le32_to_cpu(dnode->first_free)) { 255 hpfs_error(s, "size on last dirent does not match first_free; dnode %08x", secno); 256 goto bail; 257 } ··· 277 if (!fnode) 278 return 0; 279 280 + dno = le32_to_cpu(fnode->u.external[0].disk_secno); 281 brelse(bh); 282 return dno; 283 }
+25 -25
fs/hpfs/namei.c
··· 37 if (!(mode & 0222)) dee.read_only = 1; 38 /*dee.archive = 0;*/ 39 dee.hidden = name[0] == '.'; 40 - dee.fnode = fno; 41 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 42 result = new_inode(dir->i_sb); 43 if (!result) 44 goto bail2; ··· 46 result->i_ino = fno; 47 hpfs_i(result)->i_parent_dir = dir->i_ino; 48 hpfs_i(result)->i_dno = dno; 49 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 50 result->i_ctime.tv_nsec = 0; 51 result->i_mtime.tv_nsec = 0; 52 result->i_atime.tv_nsec = 0; ··· 69 } 70 fnode->len = len; 71 memcpy(fnode->name, name, len > 15 ? 15 : len); 72 - fnode->up = dir->i_ino; 73 fnode->dirflag = 1; 74 fnode->btree.n_free_nodes = 7; 75 fnode->btree.n_used_nodes = 1; 76 - fnode->btree.first_free = 0x14; 77 - fnode->u.external[0].disk_secno = dno; 78 - fnode->u.external[0].file_secno = -1; 79 dnode->root_dnode = 1; 80 - dnode->up = fno; 81 de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); 82 - de->creation_date = de->write_date = de->read_date = gmt_to_local(dir->i_sb, get_seconds()); 83 if (!(mode & 0222)) de->read_only = 1; 84 de->first = de->directory = 1; 85 /*de->hidden = de->system = 0;*/ 86 - de->fnode = fno; 87 mark_buffer_dirty(bh); 88 brelse(bh); 89 hpfs_mark_4buffers_dirty(&qbh0); ··· 137 if (!(mode & 0222)) dee.read_only = 1; 138 dee.archive = 1; 139 dee.hidden = name[0] == '.'; 140 - dee.fnode = fno; 141 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 142 143 result = new_inode(dir->i_sb); 144 if (!result) ··· 152 result->i_fop = &hpfs_file_ops; 153 result->i_nlink = 1; 154 hpfs_i(result)->i_parent_dir = dir->i_ino; 155 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 156 result->i_ctime.tv_nsec = 0; 157 result->i_mtime.tv_nsec = 0; 158 result->i_atime.tv_nsec = 0; ··· 173 } 174 fnode->len = len; 175 memcpy(fnode->name, name, len > 15 ? 15 : len); 176 - fnode->up = dir->i_ino; 177 mark_buffer_dirty(bh); 178 brelse(bh); 179 ··· 225 if (!(mode & 0222)) dee.read_only = 1; 226 dee.archive = 1; 227 dee.hidden = name[0] == '.'; 228 - dee.fnode = fno; 229 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 230 231 result = new_inode(dir->i_sb); 232 if (!result) ··· 235 hpfs_init_inode(result); 236 result->i_ino = fno; 237 hpfs_i(result)->i_parent_dir = dir->i_ino; 238 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 239 result->i_ctime.tv_nsec = 0; 240 result->i_mtime.tv_nsec = 0; 241 result->i_atime.tv_nsec = 0; ··· 256 } 257 fnode->len = len; 258 memcpy(fnode->name, name, len > 15 ? 15 : len); 259 - fnode->up = dir->i_ino; 260 mark_buffer_dirty(bh); 261 262 insert_inode_hash(result); ··· 300 memset(&dee, 0, sizeof dee); 301 dee.archive = 1; 302 dee.hidden = name[0] == '.'; 303 - dee.fnode = fno; 304 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 305 306 result = new_inode(dir->i_sb); 307 if (!result) ··· 309 result->i_ino = fno; 310 hpfs_init_inode(result); 311 hpfs_i(result)->i_parent_dir = dir->i_ino; 312 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 313 result->i_ctime.tv_nsec = 0; 314 result->i_mtime.tv_nsec = 0; 315 result->i_atime.tv_nsec = 0; ··· 332 } 333 fnode->len = len; 334 memcpy(fnode->name, name, len > 15 ? 15 : len); 335 - fnode->up = dir->i_ino; 336 hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); 337 mark_buffer_dirty(bh); 338 brelse(bh); ··· 382 if (de->directory) 383 goto out1; 384 385 - fno = de->fnode; 386 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 387 switch (r) { 388 case 1: ··· 465 if (n_items) 466 goto out1; 467 468 - fno = de->fnode; 469 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 470 switch (r) { 471 case 1: ··· 608 drop_nlink(old_dir); 609 } 610 if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) { 611 - fnode->up = new_dir->i_ino; 612 fnode->len = new_len; 613 memcpy(fnode->name, new_name, new_len>15?15:new_len); 614 if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len);
··· 37 if (!(mode & 0222)) dee.read_only = 1; 38 /*dee.archive = 0;*/ 39 dee.hidden = name[0] == '.'; 40 + dee.fnode = cpu_to_le32(fno); 41 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 42 result = new_inode(dir->i_sb); 43 if (!result) 44 goto bail2; ··· 46 result->i_ino = fno; 47 hpfs_i(result)->i_parent_dir = dir->i_ino; 48 hpfs_i(result)->i_dno = dno; 49 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 50 result->i_ctime.tv_nsec = 0; 51 result->i_mtime.tv_nsec = 0; 52 result->i_atime.tv_nsec = 0; ··· 69 } 70 fnode->len = len; 71 memcpy(fnode->name, name, len > 15 ? 15 : len); 72 + fnode->up = cpu_to_le32(dir->i_ino); 73 fnode->dirflag = 1; 74 fnode->btree.n_free_nodes = 7; 75 fnode->btree.n_used_nodes = 1; 76 + fnode->btree.first_free = cpu_to_le16(0x14); 77 + fnode->u.external[0].disk_secno = cpu_to_le32(dno); 78 + fnode->u.external[0].file_secno = cpu_to_le32(-1); 79 dnode->root_dnode = 1; 80 + dnode->up = cpu_to_le32(fno); 81 de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); 82 + de->creation_date = de->write_date = de->read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 83 if (!(mode & 0222)) de->read_only = 1; 84 de->first = de->directory = 1; 85 /*de->hidden = de->system = 0;*/ 86 + de->fnode = cpu_to_le32(fno); 87 mark_buffer_dirty(bh); 88 brelse(bh); 89 hpfs_mark_4buffers_dirty(&qbh0); ··· 137 if (!(mode & 0222)) dee.read_only = 1; 138 dee.archive = 1; 139 dee.hidden = name[0] == '.'; 140 + dee.fnode = cpu_to_le32(fno); 141 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 142 143 result = new_inode(dir->i_sb); 144 if (!result) ··· 152 result->i_fop = &hpfs_file_ops; 153 result->i_nlink = 1; 154 hpfs_i(result)->i_parent_dir = dir->i_ino; 155 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 156 result->i_ctime.tv_nsec = 0; 157 result->i_mtime.tv_nsec = 0; 158 result->i_atime.tv_nsec = 0; ··· 173 } 174 fnode->len = len; 175 memcpy(fnode->name, name, len > 15 ? 15 : len); 176 + fnode->up = cpu_to_le32(dir->i_ino); 177 mark_buffer_dirty(bh); 178 brelse(bh); 179 ··· 225 if (!(mode & 0222)) dee.read_only = 1; 226 dee.archive = 1; 227 dee.hidden = name[0] == '.'; 228 + dee.fnode = cpu_to_le32(fno); 229 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 230 231 result = new_inode(dir->i_sb); 232 if (!result) ··· 235 hpfs_init_inode(result); 236 result->i_ino = fno; 237 hpfs_i(result)->i_parent_dir = dir->i_ino; 238 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 239 result->i_ctime.tv_nsec = 0; 240 result->i_mtime.tv_nsec = 0; 241 result->i_atime.tv_nsec = 0; ··· 256 } 257 fnode->len = len; 258 memcpy(fnode->name, name, len > 15 ? 15 : len); 259 + fnode->up = cpu_to_le32(dir->i_ino); 260 mark_buffer_dirty(bh); 261 262 insert_inode_hash(result); ··· 300 memset(&dee, 0, sizeof dee); 301 dee.archive = 1; 302 dee.hidden = name[0] == '.'; 303 + dee.fnode = cpu_to_le32(fno); 304 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 305 306 result = new_inode(dir->i_sb); 307 if (!result) ··· 309 result->i_ino = fno; 310 hpfs_init_inode(result); 311 hpfs_i(result)->i_parent_dir = dir->i_ino; 312 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 313 result->i_ctime.tv_nsec = 0; 314 result->i_mtime.tv_nsec = 0; 315 result->i_atime.tv_nsec = 0; ··· 332 } 333 fnode->len = len; 334 memcpy(fnode->name, name, len > 15 ? 15 : len); 335 + fnode->up = cpu_to_le32(dir->i_ino); 336 hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); 337 mark_buffer_dirty(bh); 338 brelse(bh); ··· 382 if (de->directory) 383 goto out1; 384 385 + fno = le32_to_cpu(de->fnode); 386 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 387 switch (r) { 388 case 1: ··· 465 if (n_items) 466 goto out1; 467 468 + fno = le32_to_cpu(de->fnode); 469 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 470 switch (r) { 471 case 1: ··· 608 drop_nlink(old_dir); 609 } 610 if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) { 611 + fnode->up = cpu_to_le32(new_dir->i_ino); 612 fnode->len = new_len; 613 memcpy(fnode->name, new_name, new_len>15?15:new_len); 614 if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len);
+25 -25
fs/hpfs/super.c
··· 135 n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; 136 count = 0; 137 for (n = 0; n < n_bands; n++) 138 - count += hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_bmp_dir[n]); 139 return count; 140 } 141 ··· 509 if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; 510 511 /* Check magics */ 512 - if (/*bootblock->magic != BB_MAGIC 513 - ||*/ superblock->magic != SB_MAGIC 514 - || spareblock->magic != SP_MAGIC) { 515 if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); 516 goto bail4; 517 } ··· 532 s->s_op = &hpfs_sops; 533 s->s_d_op = &hpfs_dentry_operations; 534 535 - sbi->sb_root = superblock->root; 536 - sbi->sb_fs_size = superblock->n_sectors; 537 - sbi->sb_bitmaps = superblock->bitmaps; 538 - sbi->sb_dirband_start = superblock->dir_band_start; 539 - sbi->sb_dirband_size = superblock->n_dir_band; 540 - sbi->sb_dmap = superblock->dir_band_bitmap; 541 sbi->sb_uid = uid; 542 sbi->sb_gid = gid; 543 sbi->sb_mode = 0777 & ~umask; ··· 555 sbi->sb_max_fwd_alloc = 0xffffff; 556 557 /* Load bitmap directory */ 558 - if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, superblock->bitmaps))) 559 goto bail4; 560 561 /* Check for general fs errors*/ ··· 573 mark_buffer_dirty(bh2); 574 } 575 576 - if (spareblock->hotfixes_used || spareblock->n_spares_used) { 577 if (errs >= 2) { 578 printk("HPFS: Hotfixes not supported here, try chkdsk\n"); 579 mark_dirty(s, 0); ··· 583 if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); 584 else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); 585 } 586 - if (spareblock->n_dnode_spares != spareblock->n_dnode_spares_free) { 587 if (errs >= 2) { 588 printk("HPFS: Spare dnodes used, try chkdsk\n"); 589 mark_dirty(s, 0); ··· 594 } 595 if (chk) { 596 unsigned a; 597 - if (superblock->dir_band_end - superblock->dir_band_start + 1 != superblock->n_dir_band || 598 - superblock->dir_band_end < superblock->dir_band_start || superblock->n_dir_band > 0x4000) { 599 hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", 600 - superblock->dir_band_start, superblock->dir_band_end, superblock->n_dir_band); 601 goto bail4; 602 } 603 a = sbi->sb_dirband_size; 604 sbi->sb_dirband_size = 0; 605 - if (hpfs_chk_sectors(s, superblock->dir_band_start, superblock->n_dir_band, "dir_band") || 606 - hpfs_chk_sectors(s, superblock->dir_band_bitmap, 4, "dir_band_bitmap") || 607 - hpfs_chk_sectors(s, superblock->bitmaps, 4, "bitmaps")) { 608 mark_dirty(s, 0); 609 goto bail4; 610 } ··· 612 } else printk("HPFS: You really don't want any checks? You are crazy...\n"); 613 614 /* Load code page table */ 615 - if (spareblock->n_code_pages) 616 - if (!(sbi->sb_cp_table = hpfs_load_code_page(s, spareblock->code_page_dir))) 617 printk("HPFS: Warning: code page support is disabled\n"); 618 619 brelse(bh2); ··· 642 if (!de) 643 hpfs_error(s, "unable to find root dir"); 644 else { 645 - root->i_atime.tv_sec = local_to_gmt(s, de->read_date); 646 root->i_atime.tv_nsec = 0; 647 - root->i_mtime.tv_sec = local_to_gmt(s, de->write_date); 648 root->i_mtime.tv_nsec = 0; 649 - root->i_ctime.tv_sec = local_to_gmt(s, de->creation_date); 650 root->i_ctime.tv_nsec = 0; 651 - hpfs_i(root)->i_ea_size = de->ea_size; 652 hpfs_i(root)->i_parent_dir = root->i_ino; 653 if (root->i_size == -1) 654 root->i_size = 2048;
··· 135 n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; 136 count = 0; 137 for (n = 0; n < n_bands; n++) 138 + count += hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); 139 return count; 140 } 141 ··· 509 if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; 510 511 /* Check magics */ 512 + if (/*le16_to_cpu(bootblock->magic) != BB_MAGIC 513 + ||*/ le32_to_cpu(superblock->magic) != SB_MAGIC 514 + || le32_to_cpu(spareblock->magic) != SP_MAGIC) { 515 if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); 516 goto bail4; 517 } ··· 532 s->s_op = &hpfs_sops; 533 s->s_d_op = &hpfs_dentry_operations; 534 535 + sbi->sb_root = le32_to_cpu(superblock->root); 536 + sbi->sb_fs_size = le32_to_cpu(superblock->n_sectors); 537 + sbi->sb_bitmaps = le32_to_cpu(superblock->bitmaps); 538 + sbi->sb_dirband_start = le32_to_cpu(superblock->dir_band_start); 539 + sbi->sb_dirband_size = le32_to_cpu(superblock->n_dir_band); 540 + sbi->sb_dmap = le32_to_cpu(superblock->dir_band_bitmap); 541 sbi->sb_uid = uid; 542 sbi->sb_gid = gid; 543 sbi->sb_mode = 0777 & ~umask; ··· 555 sbi->sb_max_fwd_alloc = 0xffffff; 556 557 /* Load bitmap directory */ 558 + if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps)))) 559 goto bail4; 560 561 /* Check for general fs errors*/ ··· 573 mark_buffer_dirty(bh2); 574 } 575 576 + if (le32_to_cpu(spareblock->hotfixes_used) || le32_to_cpu(spareblock->n_spares_used)) { 577 if (errs >= 2) { 578 printk("HPFS: Hotfixes not supported here, try chkdsk\n"); 579 mark_dirty(s, 0); ··· 583 if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); 584 else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); 585 } 586 + if (le32_to_cpu(spareblock->n_dnode_spares) != le32_to_cpu(spareblock->n_dnode_spares_free)) { 587 if (errs >= 2) { 588 printk("HPFS: Spare dnodes used, try chkdsk\n"); 589 mark_dirty(s, 0); ··· 594 } 595 if (chk) { 596 unsigned a; 597 + if (le32_to_cpu(superblock->dir_band_end) - le32_to_cpu(superblock->dir_band_start) + 1 != le32_to_cpu(superblock->n_dir_band) || 598 + le32_to_cpu(superblock->dir_band_end) < le32_to_cpu(superblock->dir_band_start) || le32_to_cpu(superblock->n_dir_band) > 0x4000) { 599 hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", 600 + le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->dir_band_end), le32_to_cpu(superblock->n_dir_band)); 601 goto bail4; 602 } 603 a = sbi->sb_dirband_size; 604 sbi->sb_dirband_size = 0; 605 + if (hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->n_dir_band), "dir_band") || 606 + hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_bitmap), 4, "dir_band_bitmap") || 607 + hpfs_chk_sectors(s, le32_to_cpu(superblock->bitmaps), 4, "bitmaps")) { 608 mark_dirty(s, 0); 609 goto bail4; 610 } ··· 612 } else printk("HPFS: You really don't want any checks? You are crazy...\n"); 613 614 /* Load code page table */ 615 + if (le32_to_cpu(spareblock->n_code_pages)) 616 + if (!(sbi->sb_cp_table = hpfs_load_code_page(s, le32_to_cpu(spareblock->code_page_dir)))) 617 printk("HPFS: Warning: code page support is disabled\n"); 618 619 brelse(bh2); ··· 642 if (!de) 643 hpfs_error(s, "unable to find root dir"); 644 else { 645 + root->i_atime.tv_sec = local_to_gmt(s, le32_to_cpu(de->read_date)); 646 root->i_atime.tv_nsec = 0; 647 + root->i_mtime.tv_sec = local_to_gmt(s, le32_to_cpu(de->write_date)); 648 root->i_mtime.tv_nsec = 0; 649 + root->i_ctime.tv_sec = local_to_gmt(s, le32_to_cpu(de->creation_date)); 650 root->i_ctime.tv_nsec = 0; 651 + hpfs_i(root)->i_ea_size = le16_to_cpu(de->ea_size); 652 hpfs_i(root)->i_parent_dir = root->i_ino; 653 if (root->i_size == -1) 654 root->i_size = 2048;