2 * linux/fs/hpfs/dnode.c
4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
6 * handling directory dnode tree - adding, deleteing & searching for dirents
11 static loff_t
get_pos(struct dnode
*d
, struct hpfs_dirent
*fde
)
13 struct hpfs_dirent
*de
;
14 struct hpfs_dirent
*de_end
= dnode_end_de(d
);
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
;
20 pr_info("%s(): not_found\n", __func__
);
21 return ((loff_t
)le32_to_cpu(d
->self
) << 4) | (loff_t
)1;
24 int hpfs_add_pos(struct inode
*inode
, loff_t
*pos
)
26 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(inode
);
30 if (hpfs_inode
->i_rddir_off
)
31 for (; hpfs_inode
->i_rddir_off
[i
]; i
++)
32 if (hpfs_inode
->i_rddir_off
[i
] == pos
)
35 if (!(ppos
= kmalloc((i
+0x11) * sizeof(loff_t
*), GFP_NOFS
))) {
36 pr_err("out of memory for position list\n");
39 if (hpfs_inode
->i_rddir_off
) {
40 memcpy(ppos
, hpfs_inode
->i_rddir_off
, i
* sizeof(loff_t
));
41 kfree(hpfs_inode
->i_rddir_off
);
43 hpfs_inode
->i_rddir_off
= ppos
;
45 hpfs_inode
->i_rddir_off
[i
] = pos
;
46 hpfs_inode
->i_rddir_off
[i
+ 1] = NULL
;
50 void hpfs_del_pos(struct inode
*inode
, loff_t
*pos
)
52 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(inode
);
55 if (!hpfs_inode
->i_rddir_off
) goto not_f
;
56 for (i
= hpfs_inode
->i_rddir_off
; *i
; i
++) if (*i
== pos
) goto fnd
;
59 for (j
= i
+ 1; *j
; j
++) ;
62 if (j
- 1 == hpfs_inode
->i_rddir_off
) {
63 kfree(hpfs_inode
->i_rddir_off
);
64 hpfs_inode
->i_rddir_off
= NULL
;
68 /*pr_warn("position pointer %p->%08x not found\n",
73 static void for_all_poss(struct inode
*inode
, void (*f
)(loff_t
*, loff_t
, loff_t
),
76 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(inode
);
79 if (!hpfs_inode
->i_rddir_off
) return;
80 for (i
= hpfs_inode
->i_rddir_off
; *i
; i
++) (*f
)(*i
, p1
, p2
);
84 static void hpfs_pos_subst(loff_t
*p
, loff_t f
, loff_t t
)
89 /*void hpfs_hpfs_pos_substd(loff_t *p, loff_t f, loff_t t)
91 if ((*p & ~0x3f) == (f & ~0x3f)) *p = (t & ~0x3f) | (*p & 0x3f);
94 static void hpfs_pos_ins(loff_t
*p
, loff_t d
, loff_t c
)
96 if ((*p
& ~0x3f) == (d
& ~0x3f) && (*p
& 0x3f) >= (d
& 0x3f)) {
97 int n
= (*p
& 0x3f) + c
;
99 pr_err("%s(): %08x + %d\n",
100 __func__
, (int)*p
, (int)c
>> 8);
102 *p
= (*p
& ~0x3f) | n
;
106 static void hpfs_pos_del(loff_t
*p
, loff_t d
, loff_t c
)
108 if ((*p
& ~0x3f) == (d
& ~0x3f) && (*p
& 0x3f) >= (d
& 0x3f)) {
109 int n
= (*p
& 0x3f) - c
;
111 pr_err("%s(): %08x - %d\n",
112 __func__
, (int)*p
, (int)c
>> 8);
114 *p
= (*p
& ~0x3f) | n
;
118 static struct hpfs_dirent
*dnode_pre_last_de(struct dnode
*d
)
120 struct hpfs_dirent
*de
, *de_end
, *dee
= NULL
, *deee
= NULL
;
121 de_end
= dnode_end_de(d
);
122 for (de
= dnode_first_de(d
); de
< de_end
; de
= de_next_de(de
)) {
123 deee
= dee
; dee
= de
;
128 static struct hpfs_dirent
*dnode_last_de(struct dnode
*d
)
130 struct hpfs_dirent
*de
, *de_end
, *dee
= NULL
;
131 de_end
= dnode_end_de(d
);
132 for (de
= dnode_first_de(d
); de
< de_end
; de
= de_next_de(de
)) {
138 static void set_last_pointer(struct super_block
*s
, struct dnode
*d
, dnode_secno ptr
)
140 struct hpfs_dirent
*de
;
141 if (!(de
= dnode_last_de(d
))) {
142 hpfs_error(s
, "set_last_pointer: empty dnode %08x", le32_to_cpu(d
->self
));
145 if (hpfs_sb(s
)->sb_chk
) {
147 hpfs_error(s
, "set_last_pointer: dnode %08x has already last pointer %08x",
148 le32_to_cpu(d
->self
), de_down_pointer(de
));
151 if (le16_to_cpu(de
->length
) != 32) {
152 hpfs_error(s
, "set_last_pointer: bad last dirent in dnode %08x", le32_to_cpu(d
->self
));
157 le32_add_cpu(&d
->first_free
, 4);
158 if (le32_to_cpu(d
->first_free
) > 2048) {
159 hpfs_error(s
, "set_last_pointer: too long dnode %08x", le32_to_cpu(d
->self
));
160 le32_add_cpu(&d
->first_free
, -4);
163 de
->length
= cpu_to_le16(36);
165 *(__le32
*)((char *)de
+ 32) = cpu_to_le32(ptr
);
169 /* Add an entry to dnode and don't care if it grows over 2048 bytes */
171 struct hpfs_dirent
*hpfs_add_de(struct super_block
*s
, struct dnode
*d
,
172 const unsigned char *name
,
173 unsigned namelen
, secno down_ptr
)
175 struct hpfs_dirent
*de
;
176 struct hpfs_dirent
*de_end
= dnode_end_de(d
);
177 unsigned d_size
= de_size(namelen
, down_ptr
);
178 for (de
= dnode_first_de(d
); de
< de_end
; de
= de_next_de(de
)) {
179 int c
= hpfs_compare_names(s
, name
, namelen
, de
->name
, de
->namelen
, de
->last
);
181 hpfs_error(s
, "name (%c,%d) already exists in dnode %08x", *name
, namelen
, le32_to_cpu(d
->self
));
186 memmove((char *)de
+ d_size
, de
, (char *)de_end
- (char *)de
);
187 memset(de
, 0, d_size
);
189 *(__le32
*)((char *)de
+ d_size
- 4) = cpu_to_le32(down_ptr
);
192 de
->length
= cpu_to_le16(d_size
);
193 de
->not_8x3
= hpfs_is_name_long(name
, namelen
);
194 de
->namelen
= namelen
;
195 memcpy(de
->name
, name
, namelen
);
196 le32_add_cpu(&d
->first_free
, d_size
);
200 /* Delete dirent and don't care about its subtree */
202 static void hpfs_delete_de(struct super_block
*s
, struct dnode
*d
,
203 struct hpfs_dirent
*de
)
206 hpfs_error(s
, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d
->self
));
209 d
->first_free
= cpu_to_le32(le32_to_cpu(d
->first_free
) - le16_to_cpu(de
->length
));
210 memmove(de
, de_next_de(de
), le32_to_cpu(d
->first_free
) + (char *)d
- (char *)de
);
213 static void fix_up_ptrs(struct super_block
*s
, struct dnode
*d
)
215 struct hpfs_dirent
*de
;
216 struct hpfs_dirent
*de_end
= dnode_end_de(d
);
217 dnode_secno dno
= le32_to_cpu(d
->self
);
218 for (de
= dnode_first_de(d
); de
< de_end
; de
= de_next_de(de
))
220 struct quad_buffer_head qbh
;
222 if ((dd
= hpfs_map_dnode(s
, de_down_pointer(de
), &qbh
))) {
223 if (le32_to_cpu(dd
->up
) != dno
|| dd
->root_dnode
) {
224 dd
->up
= cpu_to_le32(dno
);
226 hpfs_mark_4buffers_dirty(&qbh
);
233 /* Add an entry to dnode and do dnode splitting if required */
235 static int hpfs_add_to_dnode(struct inode
*i
, dnode_secno dno
,
236 const unsigned char *name
, unsigned namelen
,
237 struct hpfs_dirent
*new_de
, dnode_secno down_ptr
)
239 struct quad_buffer_head qbh
, qbh1
, qbh2
;
240 struct dnode
*d
, *ad
, *rd
, *nd
= NULL
;
241 dnode_secno adno
, rdno
;
242 struct hpfs_dirent
*de
;
243 struct hpfs_dirent nde
;
244 unsigned char *nname
;
247 struct buffer_head
*bh
;
250 if (!(nname
= kmalloc(256, GFP_NOFS
))) {
251 pr_err("out of memory, can't add to dnode\n");
255 if (namelen
>= 256) {
256 hpfs_error(i
->i_sb
, "%s(): namelen == %d", __func__
, namelen
);
261 if (!(d
= hpfs_map_dnode(i
->i_sb
, dno
, &qbh
))) {
267 if (hpfs_sb(i
->i_sb
)->sb_chk
)
268 if (hpfs_stop_cycles(i
->i_sb
, dno
, &c1
, &c2
, "hpfs_add_to_dnode")) {
274 if (le32_to_cpu(d
->first_free
) + de_size(namelen
, down_ptr
) <= 2048) {
276 copy_de(de
=hpfs_add_de(i
->i_sb
, d
, name
, namelen
, down_ptr
), new_de
);
278 for_all_poss(i
, hpfs_pos_ins
, t
, 1);
279 for_all_poss(i
, hpfs_pos_subst
, 4, t
);
280 for_all_poss(i
, hpfs_pos_subst
, 5, t
+ 1);
281 hpfs_mark_4buffers_dirty(&qbh
);
287 if (!nd
) if (!(nd
= kmalloc(0x924, GFP_NOFS
))) {
288 /* 0x924 is a max size of dnode after adding a dirent with
289 max name length. We alloc this only once. There must
290 not be any error while splitting dnodes, otherwise the
291 whole directory, not only file we're adding, would
293 pr_err("out of memory for dnode splitting\n");
298 memcpy(nd
, d
, le32_to_cpu(d
->first_free
));
299 copy_de(de
= hpfs_add_de(i
->i_sb
, nd
, name
, namelen
, down_ptr
), new_de
);
300 for_all_poss(i
, hpfs_pos_ins
, get_pos(nd
, de
), 1);
301 h
= ((char *)dnode_last_de(nd
) - (char *)nd
) / 2 + 10;
302 if (!(ad
= hpfs_alloc_dnode(i
->i_sb
, le32_to_cpu(d
->up
), &adno
, &qbh1
))) {
303 hpfs_error(i
->i_sb
, "unable to alloc dnode - dnode tree will be corrupted");
312 for (de
= dnode_first_de(nd
); (char *)de_next_de(de
) - (char *)nd
< h
; de
= de_next_de(de
)) {
313 copy_de(hpfs_add_de(i
->i_sb
, ad
, de
->name
, de
->namelen
, de
->down
? de_down_pointer(de
) : 0), de
);
314 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)dno
<< 4) | pos
, ((loff_t
)adno
<< 4) | pos
);
317 copy_de(new_de
= &nde
, de
);
318 memcpy(nname
, de
->name
, de
->namelen
);
320 namelen
= de
->namelen
;
321 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)dno
<< 4) | pos
, 4);
323 set_last_pointer(i
->i_sb
, ad
, de
->down
? de_down_pointer(de
) : 0);
325 memmove((char *)nd
+ 20, de
, le32_to_cpu(nd
->first_free
) + (char *)nd
- (char *)de
);
326 le32_add_cpu(&nd
->first_free
, -((char *)de
- (char *)nd
- 20));
327 memcpy(d
, nd
, le32_to_cpu(nd
->first_free
));
328 for_all_poss(i
, hpfs_pos_del
, (loff_t
)dno
<< 4, pos
);
329 fix_up_ptrs(i
->i_sb
, ad
);
330 if (!d
->root_dnode
) {
332 dno
= le32_to_cpu(ad
->up
);
333 hpfs_mark_4buffers_dirty(&qbh
);
335 hpfs_mark_4buffers_dirty(&qbh1
);
339 if (!(rd
= hpfs_alloc_dnode(i
->i_sb
, le32_to_cpu(d
->up
), &rdno
, &qbh2
))) {
340 hpfs_error(i
->i_sb
, "unable to alloc dnode - dnode tree will be corrupted");
351 if (!(fnode
= hpfs_map_fnode(i
->i_sb
, le32_to_cpu(d
->up
), &bh
))) {
352 hpfs_free_dnode(i
->i_sb
, rdno
);
360 fnode
->u
.external
[0].disk_secno
= cpu_to_le32(rdno
);
361 mark_buffer_dirty(bh
);
363 hpfs_i(i
)->i_dno
= rdno
;
364 d
->up
= ad
->up
= cpu_to_le32(rdno
);
365 d
->root_dnode
= ad
->root_dnode
= 0;
366 hpfs_mark_4buffers_dirty(&qbh
);
368 hpfs_mark_4buffers_dirty(&qbh1
);
371 set_last_pointer(i
->i_sb
, rd
, dno
);
378 * Add an entry to directory btree.
379 * I hate such crazy directory structure.
380 * It's easy to read but terrible to write.
381 * I wrote this directory code 4 times.
382 * I hope, now it's finally bug-free.
385 int hpfs_add_dirent(struct inode
*i
,
386 const unsigned char *name
, unsigned namelen
,
387 struct hpfs_dirent
*new_de
)
389 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(i
);
391 struct hpfs_dirent
*de
, *de_end
;
392 struct quad_buffer_head qbh
;
396 dno
= hpfs_inode
->i_dno
;
398 if (hpfs_sb(i
->i_sb
)->sb_chk
)
399 if (hpfs_stop_cycles(i
->i_sb
, dno
, &c1
, &c2
, "hpfs_add_dirent")) return 1;
400 if (!(d
= hpfs_map_dnode(i
->i_sb
, dno
, &qbh
))) return 1;
401 de_end
= dnode_end_de(d
);
402 for (de
= dnode_first_de(d
); de
< de_end
; de
= de_next_de(de
)) {
403 if (!(c
= hpfs_compare_names(i
->i_sb
, name
, namelen
, de
->name
, de
->namelen
, de
->last
))) {
409 dno
= de_down_pointer(de
);
417 if (hpfs_check_free_dnodes(i
->i_sb
, FREE_DNODES_ADD
)) {
422 c
= hpfs_add_to_dnode(i
, dno
, name
, namelen
, new_de
, 0);
428 * Find dirent with higher name in 'from' subtree and move it to 'to' dnode.
429 * Return the dnode we moved from (to be checked later if it's empty)
432 static secno
move_to_top(struct inode
*i
, dnode_secno from
, dnode_secno to
)
434 dnode_secno dno
, ddno
;
435 dnode_secno chk_up
= to
;
437 struct quad_buffer_head qbh
;
438 struct hpfs_dirent
*de
, *nde
;
444 if (hpfs_sb(i
->i_sb
)->sb_chk
)
445 if (hpfs_stop_cycles(i
->i_sb
, dno
, &c1
, &c2
, "move_to_top"))
447 if (!(dnode
= hpfs_map_dnode(i
->i_sb
, dno
, &qbh
))) return 0;
448 if (hpfs_sb(i
->i_sb
)->sb_chk
) {
449 if (le32_to_cpu(dnode
->up
) != chk_up
) {
450 hpfs_error(i
->i_sb
, "move_to_top: up pointer from %08x should be %08x, is %08x",
451 dno
, chk_up
, le32_to_cpu(dnode
->up
));
457 if (!(de
= dnode_last_de(dnode
))) {
458 hpfs_error(i
->i_sb
, "move_to_top: dnode %08x has no last de", dno
);
462 if (!de
->down
) break;
463 dno
= de_down_pointer(de
);
466 while (!(de
= dnode_pre_last_de(dnode
))) {
467 dnode_secno up
= le32_to_cpu(dnode
->up
);
469 hpfs_free_dnode(i
->i_sb
, dno
);
472 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)dno
<< 4) | 1, 5);
473 if (up
== to
) return to
;
474 if (!(dnode
= hpfs_map_dnode(i
->i_sb
, up
, &qbh
))) return 0;
475 if (dnode
->root_dnode
) {
476 hpfs_error(i
->i_sb
, "move_to_top: got to root_dnode while moving from %08x to %08x", from
, to
);
480 de
= dnode_last_de(dnode
);
481 if (!de
|| !de
->down
) {
482 hpfs_error(i
->i_sb
, "move_to_top: dnode %08x doesn't point down to %08x", up
, dno
);
486 le32_add_cpu(&dnode
->first_free
, -4);
487 le16_add_cpu(&de
->length
, -4);
489 hpfs_mark_4buffers_dirty(&qbh
);
492 t
= get_pos(dnode
, de
);
493 for_all_poss(i
, hpfs_pos_subst
, t
, 4);
494 for_all_poss(i
, hpfs_pos_subst
, t
+ 1, 5);
495 if (!(nde
= kmalloc(le16_to_cpu(de
->length
), GFP_NOFS
))) {
496 hpfs_error(i
->i_sb
, "out of memory for dirent - directory will be corrupted");
500 memcpy(nde
, de
, le16_to_cpu(de
->length
));
501 ddno
= de
->down
? de_down_pointer(de
) : 0;
502 hpfs_delete_de(i
->i_sb
, dnode
, de
);
503 set_last_pointer(i
->i_sb
, dnode
, ddno
);
504 hpfs_mark_4buffers_dirty(&qbh
);
506 a
= hpfs_add_to_dnode(i
, to
, nde
->name
, nde
->namelen
, nde
, from
);
513 * Check if a dnode is empty and delete it from the tree
514 * (chkdsk doesn't like empty dnodes)
517 static void delete_empty_dnode(struct inode
*i
, dnode_secno dno
)
519 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(i
);
520 struct quad_buffer_head qbh
;
522 dnode_secno down
, up
, ndown
;
524 struct hpfs_dirent
*de
;
527 if (hpfs_stop_cycles(i
->i_sb
, dno
, &c1
, &c2
, "delete_empty_dnode")) return;
528 if (!(dnode
= hpfs_map_dnode(i
->i_sb
, dno
, &qbh
))) return;
529 if (le32_to_cpu(dnode
->first_free
) > 56) goto end
;
530 if (le32_to_cpu(dnode
->first_free
) == 52 || le32_to_cpu(dnode
->first_free
) == 56) {
531 struct hpfs_dirent
*de_end
;
532 int root
= dnode
->root_dnode
;
533 up
= le32_to_cpu(dnode
->up
);
534 de
= dnode_first_de(dnode
);
535 down
= de
->down
? de_down_pointer(de
) : 0;
536 if (hpfs_sb(i
->i_sb
)->sb_chk
) if (root
&& !down
) {
537 hpfs_error(i
->i_sb
, "delete_empty_dnode: root dnode %08x is empty", dno
);
541 hpfs_free_dnode(i
->i_sb
, dno
);
546 struct buffer_head
*bh
;
548 struct quad_buffer_head qbh1
;
549 if (hpfs_sb(i
->i_sb
)->sb_chk
)
550 if (up
!= i
->i_ino
) {
552 "bad pointer to fnode, dnode %08x, pointing to %08x, should be %08lx",
554 (unsigned long)i
->i_ino
);
557 if ((d1
= hpfs_map_dnode(i
->i_sb
, down
, &qbh1
))) {
558 d1
->up
= cpu_to_le32(up
);
560 hpfs_mark_4buffers_dirty(&qbh1
);
563 if ((fnode
= hpfs_map_fnode(i
->i_sb
, up
, &bh
))) {
564 fnode
->u
.external
[0].disk_secno
= cpu_to_le32(down
);
565 mark_buffer_dirty(bh
);
568 hpfs_inode
->i_dno
= down
;
569 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)dno
<< 4) | 1, (loff_t
) 12);
572 if (!(dnode
= hpfs_map_dnode(i
->i_sb
, up
, &qbh
))) return;
574 de_end
= dnode_end_de(dnode
);
575 for (de
= dnode_first_de(dnode
); de
< de_end
; de
= de_next_de(de
), p
++)
576 if (de
->down
) if (de_down_pointer(de
) == dno
) goto fnd
;
577 hpfs_error(i
->i_sb
, "delete_empty_dnode: pointer to dnode %08x not found in dnode %08x", dno
, up
);
580 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)dno
<< 4) | 1, ((loff_t
)up
<< 4) | p
);
583 le16_add_cpu(&de
->length
, -4);
584 le32_add_cpu(&dnode
->first_free
, -4);
585 memmove(de_next_de(de
), (char *)de_next_de(de
) + 4,
586 (char *)dnode
+ le32_to_cpu(dnode
->first_free
) - (char *)de_next_de(de
));
589 struct quad_buffer_head qbh1
;
590 *(dnode_secno
*) ((void *) de
+ le16_to_cpu(de
->length
) - 4) = down
;
591 if ((d1
= hpfs_map_dnode(i
->i_sb
, down
, &qbh1
))) {
592 d1
->up
= cpu_to_le32(up
);
593 hpfs_mark_4buffers_dirty(&qbh1
);
598 hpfs_error(i
->i_sb
, "delete_empty_dnode: dnode %08x, first_free == %03x", dno
, le32_to_cpu(dnode
->first_free
));
603 struct hpfs_dirent
*de_next
= de_next_de(de
);
604 struct hpfs_dirent
*de_cp
;
606 struct quad_buffer_head qbh1
;
607 if (!de_next
->down
) goto endm
;
608 ndown
= de_down_pointer(de_next
);
609 if (!(de_cp
= kmalloc(le16_to_cpu(de
->length
), GFP_NOFS
))) {
610 pr_err("out of memory for dtree balancing\n");
613 memcpy(de_cp
, de
, le16_to_cpu(de
->length
));
614 hpfs_delete_de(i
->i_sb
, dnode
, de
);
615 hpfs_mark_4buffers_dirty(&qbh
);
617 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)up
<< 4) | p
, 4);
618 for_all_poss(i
, hpfs_pos_del
, ((loff_t
)up
<< 4) | p
, 1);
619 if (de_cp
->down
) if ((d1
= hpfs_map_dnode(i
->i_sb
, de_down_pointer(de_cp
), &qbh1
))) {
620 d1
->up
= cpu_to_le32(ndown
);
621 hpfs_mark_4buffers_dirty(&qbh1
);
624 hpfs_add_to_dnode(i
, ndown
, de_cp
->name
, de_cp
->namelen
, de_cp
, de_cp
->down
? de_down_pointer(de_cp
) : 0);
625 /*pr_info("UP-TO-DNODE: %08x (ndown = %08x, down = %08x, dno = %08x)\n",
626 up, ndown, down, dno);*/
631 struct hpfs_dirent
*de_prev
= dnode_pre_last_de(dnode
);
632 struct hpfs_dirent
*de_cp
;
634 struct quad_buffer_head qbh1
;
637 hpfs_error(i
->i_sb
, "delete_empty_dnode: empty dnode %08x", up
);
638 hpfs_mark_4buffers_dirty(&qbh
);
643 if (!de_prev
->down
) goto endm
;
644 ndown
= de_down_pointer(de_prev
);
645 if ((d1
= hpfs_map_dnode(i
->i_sb
, ndown
, &qbh1
))) {
646 struct hpfs_dirent
*del
= dnode_last_de(d1
);
647 dlp
= del
->down
? de_down_pointer(del
) : 0;
649 if (le32_to_cpu(d1
->first_free
) > 2044) {
650 if (hpfs_sb(i
->i_sb
)->sb_chk
>= 2) {
651 pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n");
652 pr_err("terminating balancing operation\n");
657 if (hpfs_sb(i
->i_sb
)->sb_chk
>= 2) {
658 pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n");
661 le16_add_cpu(&del
->length
, 4);
663 le32_add_cpu(&d1
->first_free
, 4);
666 le16_add_cpu(&del
->length
, -4);
668 le32_add_cpu(&d1
->first_free
, -4);
670 *(__le32
*) ((void *) del
+ le16_to_cpu(del
->length
) - 4) = cpu_to_le32(down
);
672 if (!(de_cp
= kmalloc(le16_to_cpu(de_prev
->length
), GFP_NOFS
))) {
673 pr_err("out of memory for dtree balancing\n");
677 hpfs_mark_4buffers_dirty(&qbh1
);
679 memcpy(de_cp
, de_prev
, le16_to_cpu(de_prev
->length
));
680 hpfs_delete_de(i
->i_sb
, dnode
, de_prev
);
681 if (!de_prev
->down
) {
682 le16_add_cpu(&de_prev
->length
, 4);
684 le32_add_cpu(&dnode
->first_free
, 4);
686 *(__le32
*) ((void *) de_prev
+ le16_to_cpu(de_prev
->length
) - 4) = cpu_to_le32(ndown
);
687 hpfs_mark_4buffers_dirty(&qbh
);
689 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)up
<< 4) | (p
- 1), 4);
690 for_all_poss(i
, hpfs_pos_subst
, ((loff_t
)up
<< 4) | p
, ((loff_t
)up
<< 4) | (p
- 1));
691 if (down
) if ((d1
= hpfs_map_dnode(i
->i_sb
, de_down_pointer(de
), &qbh1
))) {
692 d1
->up
= cpu_to_le32(ndown
);
693 hpfs_mark_4buffers_dirty(&qbh1
);
696 hpfs_add_to_dnode(i
, ndown
, de_cp
->name
, de_cp
->namelen
, de_cp
, dlp
);
702 hpfs_mark_4buffers_dirty(&qbh
);
708 /* Delete dirent from directory */
710 int hpfs_remove_dirent(struct inode
*i
, dnode_secno dno
, struct hpfs_dirent
*de
,
711 struct quad_buffer_head
*qbh
, int depth
)
713 struct dnode
*dnode
= qbh
->data
;
714 dnode_secno down
= 0;
716 if (de
->first
|| de
->last
) {
717 hpfs_error(i
->i_sb
, "hpfs_remove_dirent: attempt to delete first or last dirent in dnode %08x", dno
);
721 if (de
->down
) down
= de_down_pointer(de
);
722 if (depth
&& (de
->down
|| (de
== dnode_first_de(dnode
) && de_next_de(de
)->last
))) {
723 if (hpfs_check_free_dnodes(i
->i_sb
, FREE_DNODES_DEL
)) {
729 for_all_poss(i
, hpfs_pos_del
, (t
= get_pos(dnode
, de
)) + 1, 1);
730 hpfs_delete_de(i
->i_sb
, dnode
, de
);
731 hpfs_mark_4buffers_dirty(qbh
);
734 dnode_secno a
= move_to_top(i
, down
, dno
);
735 for_all_poss(i
, hpfs_pos_subst
, 5, t
);
736 if (a
) delete_empty_dnode(i
, a
);
739 delete_empty_dnode(i
, dno
);
743 void hpfs_count_dnodes(struct super_block
*s
, dnode_secno dno
, int *n_dnodes
,
744 int *n_subdirs
, int *n_items
)
747 struct quad_buffer_head qbh
;
748 struct hpfs_dirent
*de
;
749 dnode_secno ptr
, odno
= 0;
753 if (n_dnodes
) (*n_dnodes
)++;
754 if (hpfs_sb(s
)->sb_chk
)
755 if (hpfs_stop_cycles(s
, dno
, &c1
, &c2
, "hpfs_count_dnodes #1")) return;
758 if (!(dnode
= hpfs_map_dnode(s
, dno
, &qbh
))) return;
759 if (hpfs_sb(s
)->sb_chk
) if (odno
&& odno
!= -1 && le32_to_cpu(dnode
->up
) != odno
)
760 hpfs_error(s
, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno
, dno
, le32_to_cpu(dnode
->up
));
761 de
= dnode_first_de(dnode
);
763 if (de
->down
) if (de_down_pointer(de
) == ptr
) goto process_de
;
766 hpfs_error(s
, "hpfs_count_dnodes: pointer to dnode %08x not found in dnode %08x, got here from %08x",
775 dno
= de_down_pointer(de
);
780 if (!de
->first
&& !de
->last
&& de
->directory
&& n_subdirs
) (*n_subdirs
)++;
781 if (!de
->first
&& !de
->last
&& n_items
) (*n_items
)++;
782 if ((de
= de_next_de(de
)) < dnode_end_de(dnode
)) goto next_de
;
784 dno
= le32_to_cpu(dnode
->up
);
785 if (dnode
->root_dnode
) {
790 if (hpfs_sb(s
)->sb_chk
)
791 if (hpfs_stop_cycles(s
, ptr
, &d1
, &d2
, "hpfs_count_dnodes #2")) return;
796 static struct hpfs_dirent
*map_nth_dirent(struct super_block
*s
, dnode_secno dno
, int n
,
797 struct quad_buffer_head
*qbh
, struct dnode
**dn
)
800 struct hpfs_dirent
*de
, *de_end
;
802 dnode
= hpfs_map_dnode(s
, dno
, qbh
);
803 if (!dnode
) return NULL
;
805 de
= dnode_first_de(dnode
);
806 de_end
= dnode_end_de(dnode
);
807 for (i
= 1; de
< de_end
; i
++, de
= de_next_de(de
)) {
814 hpfs_error(s
, "map_nth_dirent: n too high; dnode = %08x, requested %08x", dno
, n
);
818 dnode_secno
hpfs_de_as_down_as_possible(struct super_block
*s
, dnode_secno dno
)
820 struct quad_buffer_head qbh
;
823 struct hpfs_dirent
*de
;
827 if (hpfs_sb(s
)->sb_chk
)
828 if (hpfs_stop_cycles(s
, d
, &c1
, &c2
, "hpfs_de_as_down_as_possible"))
830 if (!(de
= map_nth_dirent(s
, d
, 1, &qbh
, NULL
))) return dno
;
831 if (hpfs_sb(s
)->sb_chk
)
832 if (up
&& le32_to_cpu(((struct dnode
*)qbh
.data
)->up
) != up
)
833 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
));
839 d
= de_down_pointer(de
);
844 struct hpfs_dirent
*map_pos_dirent(struct inode
*inode
, loff_t
*posp
,
845 struct quad_buffer_head
*qbh
)
850 struct hpfs_dirent
*de
, *d
;
851 struct hpfs_dirent
*up_de
;
852 struct hpfs_dirent
*end_up_de
;
854 struct dnode
*up_dnode
;
855 struct quad_buffer_head qbh0
;
860 if (!(de
= map_nth_dirent(inode
->i_sb
, dno
, pos
, qbh
, &dnode
)))
863 /* Going to the next dirent */
864 if ((d
= de_next_de(de
)) < dnode_end_de(dnode
)) {
865 if (!(++*posp
& 077)) {
866 hpfs_error(inode
->i_sb
,
867 "map_pos_dirent: pos crossed dnode boundary; pos = %08llx",
868 (unsigned long long)*posp
);
871 /* We're going down the tree */
873 *posp
= ((loff_t
) hpfs_de_as_down_as_possible(inode
->i_sb
, de_down_pointer(d
)) << 4) + 1;
880 if (dnode
->root_dnode
) goto bail
;
882 if (!(up_dnode
= hpfs_map_dnode(inode
->i_sb
, le32_to_cpu(dnode
->up
), &qbh0
)))
885 end_up_de
= dnode_end_de(up_dnode
);
887 for (up_de
= dnode_first_de(up_dnode
); up_de
< end_up_de
;
888 up_de
= de_next_de(up_de
)) {
889 if (!(++c
& 077)) hpfs_error(inode
->i_sb
,
890 "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", le32_to_cpu(dnode
->up
));
891 if (up_de
->down
&& de_down_pointer(up_de
) == dno
) {
892 *posp
= ((loff_t
) le32_to_cpu(dnode
->up
) << 4) + c
;
898 hpfs_error(inode
->i_sb
, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x",
899 dno
, le32_to_cpu(dnode
->up
));
907 /* Find a dirent in tree */
909 struct hpfs_dirent
*map_dirent(struct inode
*inode
, dnode_secno dno
,
910 const unsigned char *name
, unsigned len
,
911 dnode_secno
*dd
, struct quad_buffer_head
*qbh
)
914 struct hpfs_dirent
*de
;
915 struct hpfs_dirent
*de_end
;
918 if (!S_ISDIR(inode
->i_mode
)) hpfs_error(inode
->i_sb
, "map_dirent: not a directory\n");
920 if (hpfs_sb(inode
->i_sb
)->sb_chk
)
921 if (hpfs_stop_cycles(inode
->i_sb
, dno
, &c1
, &c2
, "map_dirent")) return NULL
;
922 if (!(dnode
= hpfs_map_dnode(inode
->i_sb
, dno
, qbh
))) return NULL
;
924 de_end
= dnode_end_de(dnode
);
925 for (de
= dnode_first_de(dnode
); de
< de_end
; de
= de_next_de(de
)) {
926 int t
= hpfs_compare_names(inode
->i_sb
, name
, len
, de
->name
, de
->namelen
, de
->last
);
933 dno
= de_down_pointer(de
);
945 * Remove empty directory. In normal cases it is only one dnode with two
946 * entries, but we must handle also such obscure cases when it's a tree
950 void hpfs_remove_dtree(struct super_block
*s
, dnode_secno dno
)
952 struct quad_buffer_head qbh
;
954 struct hpfs_dirent
*de
;
955 dnode_secno d1
, d2
, rdno
= dno
;
957 if (!(dnode
= hpfs_map_dnode(s
, dno
, &qbh
))) return;
958 de
= dnode_first_de(dnode
);
960 if (de
->down
) d1
= de_down_pointer(de
);
963 hpfs_free_dnode(s
, dno
);
967 if (!de
->first
) goto error
;
968 d1
= de
->down
? de_down_pointer(de
) : 0;
970 if (!de
->last
) goto error
;
971 d2
= de
->down
? de_down_pointer(de
) : 0;
973 hpfs_free_dnode(s
, dno
);
976 if (!(dnode
= hpfs_map_dnode(s
, dno
= d1
, &qbh
))) return;
977 de
= dnode_first_de(dnode
);
978 if (!de
->last
) goto error
;
979 d1
= de
->down
? de_down_pointer(de
) : 0;
981 hpfs_free_dnode(s
, dno
);
989 hpfs_free_dnode(s
, dno
);
990 hpfs_error(s
, "directory %08x is corrupted or not empty", rdno
);
994 * Find dirent for specified fnode. Use truncated 15-char name in fnode as
995 * a help for searching.
998 struct hpfs_dirent
*map_fnode_dirent(struct super_block
*s
, fnode_secno fno
,
999 struct fnode
*f
, struct quad_buffer_head
*qbh
)
1001 unsigned char *name1
;
1002 unsigned char *name2
;
1003 int name1len
, name2len
;
1005 dnode_secno dno
, downd
;
1007 struct buffer_head
*bh
;
1008 struct hpfs_dirent
*de
, *de_end
;
1013 if (!(name2
= kmalloc(256, GFP_NOFS
))) {
1014 pr_err("out of memory, can't map dirent\n");
1018 memcpy(name2
, name1
, name1len
= name2len
= f
->len
);
1020 memcpy(name2
, name1
, 15);
1021 memset(name2
+ 15, 0xff, 256 - 15);
1022 /*name2[15] = 0xff;*/
1023 name1len
= 15; name2len
= 256;
1025 if (!(upf
= hpfs_map_fnode(s
, le32_to_cpu(f
->up
), &bh
))) {
1029 if (!fnode_is_dir(upf
)) {
1031 hpfs_error(s
, "fnode %08x has non-directory parent %08x", fno
, le32_to_cpu(f
->up
));
1035 dno
= le32_to_cpu(upf
->u
.external
[0].disk_secno
);
1040 if (!(d
= hpfs_map_dnode(s
, dno
, qbh
))) {
1044 de_end
= dnode_end_de(d
);
1045 de
= dnode_first_de(d
);
1047 while (de
< de_end
) {
1048 if (de
->down
) if (de_down_pointer(de
) == downd
) goto f
;
1049 de
= de_next_de(de
);
1051 hpfs_error(s
, "pointer to dnode %08x not found in dnode %08x", downd
, dno
);
1057 if (le32_to_cpu(de
->fnode
) == fno
) {
1061 c
= hpfs_compare_names(s
, name1
, name1len
, de
->name
, de
->namelen
, de
->last
);
1062 if (c
< 0 && de
->down
) {
1063 dno
= de_down_pointer(de
);
1065 if (hpfs_sb(s
)->sb_chk
)
1066 if (hpfs_stop_cycles(s
, dno
, &c1
, &c2
, "map_fnode_dirent #1")) {
1073 if (le32_to_cpu(de
->fnode
) == fno
) {
1077 c
= hpfs_compare_names(s
, name2
, name2len
, de
->name
, de
->namelen
, de
->last
);
1078 if (c
< 0 && !de
->last
) goto not_found
;
1079 if ((de
= de_next_de(de
)) < de_end
) goto next_de
;
1080 if (d
->root_dnode
) goto not_found
;
1082 dno
= le32_to_cpu(d
->up
);
1084 if (hpfs_sb(s
)->sb_chk
)
1085 if (hpfs_stop_cycles(s
, downd
, &d1
, &d2
, "map_fnode_dirent #2")) {
1092 hpfs_error(s
, "dirent for fnode %08x not found", fno
);