xref: /openbmc/linux/fs/hpfs/dnode.c (revision 4f205687)
1 /*
2  *  linux/fs/hpfs/dnode.c
3  *
4  *  Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
5  *
6  *  handling directory dnode tree - adding, deleteing & searching for dirents
7  */
8 
9 #include "hpfs_fn.h"
10 
11 static loff_t get_pos(struct dnode *d, struct hpfs_dirent *fde)
12 {
13 	struct hpfs_dirent *de;
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 	pr_info("%s(): not_found\n", __func__);
21 	return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1;
22 }
23 
24 int hpfs_add_pos(struct inode *inode, loff_t *pos)
25 {
26 	struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
27 	int i = 0;
28 	loff_t **ppos;
29 
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)
33 				return 0;
34 	if (!(i&0x0f)) {
35 		if (!(ppos = kmalloc((i+0x11) * sizeof(loff_t*), GFP_NOFS))) {
36 			pr_err("out of memory for position list\n");
37 			return -ENOMEM;
38 		}
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);
42 		}
43 		hpfs_inode->i_rddir_off = ppos;
44 	}
45 	hpfs_inode->i_rddir_off[i] = pos;
46 	hpfs_inode->i_rddir_off[i + 1] = NULL;
47 	return 0;
48 }
49 
50 void hpfs_del_pos(struct inode *inode, loff_t *pos)
51 {
52 	struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
53 	loff_t **i, **j;
54 
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;
57 	goto not_f;
58 	fnd:
59 	for (j = i + 1; *j; j++) ;
60 	*i = *(j - 1);
61 	*(j - 1) = NULL;
62 	if (j - 1 == hpfs_inode->i_rddir_off) {
63 		kfree(hpfs_inode->i_rddir_off);
64 		hpfs_inode->i_rddir_off = NULL;
65 	}
66 	return;
67 	not_f:
68 	/*pr_warn("position pointer %p->%08x not found\n",
69 		  pos, (int)*pos);*/
70 	return;
71 }
72 
73 static void for_all_poss(struct inode *inode, void (*f)(loff_t *, loff_t, loff_t),
74 			 loff_t p1, loff_t p2)
75 {
76 	struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
77 	loff_t **i;
78 
79 	if (!hpfs_inode->i_rddir_off) return;
80 	for (i = hpfs_inode->i_rddir_off; *i; i++) (*f)(*i, p1, p2);
81 	return;
82 }
83 
84 static void hpfs_pos_subst(loff_t *p, loff_t f, loff_t t)
85 {
86 	if (*p == f) *p = t;
87 }
88 
89 /*void hpfs_hpfs_pos_substd(loff_t *p, loff_t f, loff_t t)
90 {
91 	if ((*p & ~0x3f) == (f & ~0x3f)) *p = (t & ~0x3f) | (*p & 0x3f);
92 }*/
93 
94 static void hpfs_pos_ins(loff_t *p, loff_t d, loff_t c)
95 {
96 	if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {
97 		int n = (*p & 0x3f) + c;
98 		if (n > 0x3f)
99 			pr_err("%s(): %08x + %d\n",
100 				__func__, (int)*p, (int)c >> 8);
101 		else
102 			*p = (*p & ~0x3f) | n;
103 	}
104 }
105 
106 static void hpfs_pos_del(loff_t *p, loff_t d, loff_t c)
107 {
108 	if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {
109 		int n = (*p & 0x3f) - c;
110 		if (n < 1)
111 			pr_err("%s(): %08x - %d\n",
112 				__func__, (int)*p, (int)c >> 8);
113 		else
114 			*p = (*p & ~0x3f) | n;
115 	}
116 }
117 
118 static struct hpfs_dirent *dnode_pre_last_de(struct dnode *d)
119 {
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;
124 	}
125 	return deee;
126 }
127 
128 static struct hpfs_dirent *dnode_last_de(struct dnode *d)
129 {
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)) {
133 		dee = de;
134 	}
135 	return dee;
136 }
137 
138 static void set_last_pointer(struct super_block *s, struct dnode *d, dnode_secno ptr)
139 {
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));
143 		return;
144 	}
145 	if (hpfs_sb(s)->sb_chk) {
146 		if (de->down) {
147 			hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x",
148 				le32_to_cpu(d->self), de_down_pointer(de));
149 			return;
150 		}
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));
153 			return;
154 		}
155 	}
156 	if (ptr) {
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);
161 			return;
162 		}
163 		de->length = cpu_to_le16(36);
164 		de->down = 1;
165 		*(__le32 *)((char *)de + 32) = cpu_to_le32(ptr);
166 	}
167 }
168 
169 /* Add an entry to dnode and don't care if it grows over 2048 bytes */
170 
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)
174 {
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);
180 		if (!c) {
181 			hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, le32_to_cpu(d->self));
182 			return NULL;
183 		}
184 		if (c < 0) break;
185 	}
186 	memmove((char *)de + d_size, de, (char *)de_end - (char *)de);
187 	memset(de, 0, d_size);
188 	if (down_ptr) {
189 		*(__le32 *)((char *)de + d_size - 4) = cpu_to_le32(down_ptr);
190 		de->down = 1;
191 	}
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);
197 	return de;
198 }
199 
200 /* Delete dirent and don't care about its subtree */
201 
202 static void hpfs_delete_de(struct super_block *s, struct dnode *d,
203 			   struct hpfs_dirent *de)
204 {
205 	if (de->last) {
206 		hpfs_error(s, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d->self));
207 		return;
208 	}
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);
211 }
212 
213 static void fix_up_ptrs(struct super_block *s, struct dnode *d)
214 {
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))
219 		if (de->down) {
220 			struct quad_buffer_head qbh;
221 			struct dnode *dd;
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);
225 					dd->root_dnode = 0;
226 					hpfs_mark_4buffers_dirty(&qbh);
227 				}
228 				hpfs_brelse4(&qbh);
229 			}
230 		}
231 }
232 
233 /* Add an entry to dnode and do dnode splitting if required */
234 
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)
238 {
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;
245 	int h;
246 	int pos;
247 	struct buffer_head *bh;
248 	struct fnode *fnode;
249 	int c1, c2 = 0;
250 	if (!(nname = kmalloc(256, GFP_NOFS))) {
251 		pr_err("out of memory, can't add to dnode\n");
252 		return 1;
253 	}
254 	go_up:
255 	if (namelen >= 256) {
256 		hpfs_error(i->i_sb, "%s(): namelen == %d", __func__, namelen);
257 		kfree(nd);
258 		kfree(nname);
259 		return 1;
260 	}
261 	if (!(d = hpfs_map_dnode(i->i_sb, dno, &qbh))) {
262 		kfree(nd);
263 		kfree(nname);
264 		return 1;
265 	}
266 	go_up_a:
267 	if (hpfs_sb(i->i_sb)->sb_chk)
268 		if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "hpfs_add_to_dnode")) {
269 			hpfs_brelse4(&qbh);
270 			kfree(nd);
271 			kfree(nname);
272 			return 1;
273 		}
274 	if (le32_to_cpu(d->first_free) + de_size(namelen, down_ptr) <= 2048) {
275 		loff_t t;
276 		copy_de(de=hpfs_add_de(i->i_sb, d, name, namelen, down_ptr), new_de);
277 		t = get_pos(d, 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);
282 		hpfs_brelse4(&qbh);
283 		kfree(nd);
284 		kfree(nname);
285 		return 0;
286 	}
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
292 		   be lost. */
293 		pr_err("out of memory for dnode splitting\n");
294 		hpfs_brelse4(&qbh);
295 		kfree(nname);
296 		return 1;
297 	}
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");
304 		hpfs_brelse4(&qbh);
305 		kfree(nd);
306 		kfree(nname);
307 		return 1;
308 	}
309 	i->i_size += 2048;
310 	i->i_blocks += 4;
311 	pos = 1;
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);
315 		pos++;
316 	}
317 	copy_de(new_de = &nde, de);
318 	memcpy(nname, de->name, de->namelen);
319 	name = nname;
320 	namelen = de->namelen;
321 	for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | pos, 4);
322 	down_ptr = adno;
323 	set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0);
324 	de = de_next_de(de);
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) {
331 		ad->up = d->up;
332 		dno = le32_to_cpu(ad->up);
333 		hpfs_mark_4buffers_dirty(&qbh);
334 		hpfs_brelse4(&qbh);
335 		hpfs_mark_4buffers_dirty(&qbh1);
336 		hpfs_brelse4(&qbh1);
337 		goto go_up;
338 	}
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");
341 		hpfs_brelse4(&qbh);
342 		hpfs_brelse4(&qbh1);
343 		kfree(nd);
344 		kfree(nname);
345 		return 1;
346 	}
347 	i->i_size += 2048;
348 	i->i_blocks += 4;
349 	rd->root_dnode = 1;
350 	rd->up = d->up;
351 	if (!(fnode = hpfs_map_fnode(i->i_sb, le32_to_cpu(d->up), &bh))) {
352 		hpfs_free_dnode(i->i_sb, rdno);
353 		hpfs_brelse4(&qbh);
354 		hpfs_brelse4(&qbh1);
355 		hpfs_brelse4(&qbh2);
356 		kfree(nd);
357 		kfree(nname);
358 		return 1;
359 	}
360 	fnode->u.external[0].disk_secno = cpu_to_le32(rdno);
361 	mark_buffer_dirty(bh);
362 	brelse(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);
367 	hpfs_brelse4(&qbh);
368 	hpfs_mark_4buffers_dirty(&qbh1);
369 	hpfs_brelse4(&qbh1);
370 	qbh = qbh2;
371 	set_last_pointer(i->i_sb, rd, dno);
372 	dno = rdno;
373 	d = rd;
374 	goto go_up_a;
375 }
376 
377 /*
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.
383  */
384 
385 int hpfs_add_dirent(struct inode *i,
386 		    const unsigned char *name, unsigned namelen,
387 		    struct hpfs_dirent *new_de)
388 {
389 	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
390 	struct dnode *d;
391 	struct hpfs_dirent *de, *de_end;
392 	struct quad_buffer_head qbh;
393 	dnode_secno dno;
394 	int c;
395 	int c1, c2 = 0;
396 	dno = hpfs_inode->i_dno;
397 	down:
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))) {
404 			hpfs_brelse4(&qbh);
405 			return -1;
406 		}
407 		if (c < 0) {
408 			if (de->down) {
409 				dno = de_down_pointer(de);
410 				hpfs_brelse4(&qbh);
411 				goto down;
412 			}
413 			break;
414 		}
415 	}
416 	hpfs_brelse4(&qbh);
417 	if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_ADD)) {
418 		c = 1;
419 		goto ret;
420 	}
421 	i->i_version++;
422 	c = hpfs_add_to_dnode(i, dno, name, namelen, new_de, 0);
423 	ret:
424 	return c;
425 }
426 
427 /*
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)
430  */
431 
432 static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to)
433 {
434 	dnode_secno dno, ddno;
435 	dnode_secno chk_up = to;
436 	struct dnode *dnode;
437 	struct quad_buffer_head qbh;
438 	struct hpfs_dirent *de, *nde;
439 	int a;
440 	loff_t t;
441 	int c1, c2 = 0;
442 	dno = from;
443 	while (1) {
444 		if (hpfs_sb(i->i_sb)->sb_chk)
445 			if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "move_to_top"))
446 				return 0;
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));
452 				hpfs_brelse4(&qbh);
453 				return 0;
454 			}
455 			chk_up = dno;
456 		}
457 		if (!(de = dnode_last_de(dnode))) {
458 			hpfs_error(i->i_sb, "move_to_top: dnode %08x has no last de", dno);
459 			hpfs_brelse4(&qbh);
460 			return 0;
461 		}
462 		if (!de->down) break;
463 		dno = de_down_pointer(de);
464 		hpfs_brelse4(&qbh);
465 	}
466 	while (!(de = dnode_pre_last_de(dnode))) {
467 		dnode_secno up = le32_to_cpu(dnode->up);
468 		hpfs_brelse4(&qbh);
469 		hpfs_free_dnode(i->i_sb, dno);
470 		i->i_size -= 2048;
471 		i->i_blocks -= 4;
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);
477 			hpfs_brelse4(&qbh);
478 			return 0;
479 		}
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);
483 			hpfs_brelse4(&qbh);
484 			return 0;
485 		}
486 		le32_add_cpu(&dnode->first_free, -4);
487 		le16_add_cpu(&de->length, -4);
488 		de->down = 0;
489 		hpfs_mark_4buffers_dirty(&qbh);
490 		dno = up;
491 	}
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");
497 		hpfs_brelse4(&qbh);
498 		return 0;
499 	}
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);
505 	hpfs_brelse4(&qbh);
506 	a = hpfs_add_to_dnode(i, to, nde->name, nde->namelen, nde, from);
507 	kfree(nde);
508 	if (a) return 0;
509 	return dno;
510 }
511 
512 /*
513  * Check if a dnode is empty and delete it from the tree
514  * (chkdsk doesn't like empty dnodes)
515  */
516 
517 static void delete_empty_dnode(struct inode *i, dnode_secno dno)
518 {
519 	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
520 	struct quad_buffer_head qbh;
521 	struct dnode *dnode;
522 	dnode_secno down, up, ndown;
523 	int p;
524 	struct hpfs_dirent *de;
525 	int c1, c2 = 0;
526 	try_it_again:
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);
538 			goto end;
539 		}
540 		hpfs_brelse4(&qbh);
541 		hpfs_free_dnode(i->i_sb, dno);
542 		i->i_size -= 2048;
543 		i->i_blocks -= 4;
544 		if (root) {
545 			struct fnode *fnode;
546 			struct buffer_head *bh;
547 			struct dnode *d1;
548 			struct quad_buffer_head qbh1;
549 			if (hpfs_sb(i->i_sb)->sb_chk)
550 				if (up != i->i_ino) {
551 					hpfs_error(i->i_sb,
552 						   "bad pointer to fnode, dnode %08x, pointing to %08x, should be %08lx",
553 						   dno, up,
554 						   (unsigned long)i->i_ino);
555 					return;
556 				}
557 			if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) {
558 				d1->up = cpu_to_le32(up);
559 				d1->root_dnode = 1;
560 				hpfs_mark_4buffers_dirty(&qbh1);
561 				hpfs_brelse4(&qbh1);
562 			}
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);
566 				brelse(bh);
567 			}
568 			hpfs_inode->i_dno = down;
569 			for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, (loff_t) 12);
570 			return;
571 		}
572 		if (!(dnode = hpfs_map_dnode(i->i_sb, up, &qbh))) return;
573 		p = 1;
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);
578 		goto end;
579 		fnd:
580 		for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p);
581 		if (!down) {
582 			de->down = 0;
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));
587 		} else {
588 			struct dnode *d1;
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);
594 				hpfs_brelse4(&qbh1);
595 			}
596 		}
597 	} else {
598 		hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, le32_to_cpu(dnode->first_free));
599 		goto end;
600 	}
601 
602 	if (!de->last) {
603 		struct hpfs_dirent *de_next = de_next_de(de);
604 		struct hpfs_dirent *de_cp;
605 		struct dnode *d1;
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");
611 			goto endm;
612 		}
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);
616 		hpfs_brelse4(&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);
622 			hpfs_brelse4(&qbh1);
623 		}
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);*/
627 		dno = up;
628 		kfree(de_cp);
629 		goto try_it_again;
630 	} else {
631 		struct hpfs_dirent *de_prev = dnode_pre_last_de(dnode);
632 		struct hpfs_dirent *de_cp;
633 		struct dnode *d1;
634 		struct quad_buffer_head qbh1;
635 		dnode_secno dlp;
636 		if (!de_prev) {
637 			hpfs_error(i->i_sb, "delete_empty_dnode: empty dnode %08x", up);
638 			hpfs_mark_4buffers_dirty(&qbh);
639 			hpfs_brelse4(&qbh);
640 			dno = up;
641 			goto try_it_again;
642 		}
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;
648 			if (!dlp && down) {
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");
653 					}
654 					hpfs_brelse4(&qbh1);
655 					goto endm;
656 				}
657 				if (hpfs_sb(i->i_sb)->sb_chk >= 2) {
658 					pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n");
659 					pr_err("goin'on\n");
660 				}
661 				le16_add_cpu(&del->length, 4);
662 				del->down = 1;
663 				le32_add_cpu(&d1->first_free, 4);
664 			}
665 			if (dlp && !down) {
666 				le16_add_cpu(&del->length, -4);
667 				del->down = 0;
668 				le32_add_cpu(&d1->first_free, -4);
669 			} else if (down)
670 				*(__le32 *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down);
671 		} else goto endm;
672 		if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) {
673 			pr_err("out of memory for dtree balancing\n");
674 			hpfs_brelse4(&qbh1);
675 			goto endm;
676 		}
677 		hpfs_mark_4buffers_dirty(&qbh1);
678 		hpfs_brelse4(&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);
683 			de_prev->down = 1;
684 			le32_add_cpu(&dnode->first_free, 4);
685 		}
686 		*(__le32 *) ((void *) de_prev + le16_to_cpu(de_prev->length) - 4) = cpu_to_le32(ndown);
687 		hpfs_mark_4buffers_dirty(&qbh);
688 		hpfs_brelse4(&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);
694 			hpfs_brelse4(&qbh1);
695 		}
696 		hpfs_add_to_dnode(i, ndown, de_cp->name, de_cp->namelen, de_cp, dlp);
697 		dno = up;
698 		kfree(de_cp);
699 		goto try_it_again;
700 	}
701 	endm:
702 	hpfs_mark_4buffers_dirty(&qbh);
703 	end:
704 	hpfs_brelse4(&qbh);
705 }
706 
707 
708 /* Delete dirent from directory */
709 
710 int hpfs_remove_dirent(struct inode *i, dnode_secno dno, struct hpfs_dirent *de,
711 		       struct quad_buffer_head *qbh, int depth)
712 {
713 	struct dnode *dnode = qbh->data;
714 	dnode_secno down = 0;
715 	loff_t t;
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);
718 		hpfs_brelse4(qbh);
719 		return 1;
720 	}
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)) {
724 			hpfs_brelse4(qbh);
725 			return 2;
726 		}
727 	}
728 	i->i_version++;
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);
732 	hpfs_brelse4(qbh);
733 	if (down) {
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);
737 		return !a;
738 	}
739 	delete_empty_dnode(i, dno);
740 	return 0;
741 }
742 
743 void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes,
744 		       int *n_subdirs, int *n_items)
745 {
746 	struct dnode *dnode;
747 	struct quad_buffer_head qbh;
748 	struct hpfs_dirent *de;
749 	dnode_secno ptr, odno = 0;
750 	int c1, c2 = 0;
751 	int d1, d2 = 0;
752 	go_down:
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;
756 	ptr = 0;
757 	go_up:
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);
762 	if (ptr) while(1) {
763 		if (de->down) if (de_down_pointer(de) == ptr) goto process_de;
764 		if (de->last) {
765 			hpfs_brelse4(&qbh);
766 			hpfs_error(s, "hpfs_count_dnodes: pointer to dnode %08x not found in dnode %08x, got here from %08x",
767 				ptr, dno, odno);
768 			return;
769 		}
770 		de = de_next_de(de);
771 	}
772 	next_de:
773 	if (de->down) {
774 		odno = dno;
775 		dno = de_down_pointer(de);
776 		hpfs_brelse4(&qbh);
777 		goto go_down;
778 	}
779 	process_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;
783 	ptr = dno;
784 	dno = le32_to_cpu(dnode->up);
785 	if (dnode->root_dnode) {
786 		hpfs_brelse4(&qbh);
787 		return;
788 	}
789 	hpfs_brelse4(&qbh);
790 	if (hpfs_sb(s)->sb_chk)
791 		if (hpfs_stop_cycles(s, ptr, &d1, &d2, "hpfs_count_dnodes #2")) return;
792 	odno = -1;
793 	goto go_up;
794 }
795 
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)
798 {
799 	int i;
800 	struct hpfs_dirent *de, *de_end;
801 	struct dnode *dnode;
802 	dnode = hpfs_map_dnode(s, dno, qbh);
803 	if (!dnode) return NULL;
804 	if (dn) *dn=dnode;
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)) {
808 		if (i == n) {
809 			return de;
810 		}
811 		if (de->last) break;
812 	}
813 	hpfs_brelse4(qbh);
814 	hpfs_error(s, "map_nth_dirent: n too high; dnode = %08x, requested %08x", dno, n);
815 	return NULL;
816 }
817 
818 dnode_secno hpfs_de_as_down_as_possible(struct super_block *s, dnode_secno dno)
819 {
820 	struct quad_buffer_head qbh;
821 	dnode_secno d = dno;
822 	dnode_secno up = 0;
823 	struct hpfs_dirent *de;
824 	int c1, c2 = 0;
825 
826 	again:
827 	if (hpfs_sb(s)->sb_chk)
828 		if (hpfs_stop_cycles(s, d, &c1, &c2, "hpfs_de_as_down_as_possible"))
829 			return d;
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));
834 	if (!de->down) {
835 		hpfs_brelse4(&qbh);
836 		return d;
837 	}
838 	up = d;
839 	d = de_down_pointer(de);
840 	hpfs_brelse4(&qbh);
841 	goto again;
842 }
843 
844 struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp,
845 				   struct quad_buffer_head *qbh)
846 {
847 	loff_t pos;
848 	unsigned c;
849 	dnode_secno dno;
850 	struct hpfs_dirent *de, *d;
851 	struct hpfs_dirent *up_de;
852 	struct hpfs_dirent *end_up_de;
853 	struct dnode *dnode;
854 	struct dnode *up_dnode;
855 	struct quad_buffer_head qbh0;
856 
857 	pos = *posp;
858 	dno = pos >> 6 << 2;
859 	pos &= 077;
860 	if (!(de = map_nth_dirent(inode->i_sb, dno, pos, qbh, &dnode)))
861 		goto bail;
862 
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);
869 			goto bail;
870 		}
871 		/* We're going down the tree */
872 		if (d->down) {
873 			*posp = ((loff_t) hpfs_de_as_down_as_possible(inode->i_sb, de_down_pointer(d)) << 4) + 1;
874 		}
875 
876 		return de;
877 	}
878 
879 	/* Going up */
880 	if (dnode->root_dnode) goto bail;
881 
882 	if (!(up_dnode = hpfs_map_dnode(inode->i_sb, le32_to_cpu(dnode->up), &qbh0)))
883 		goto bail;
884 
885 	end_up_de = dnode_end_de(up_dnode);
886 	c = 0;
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;
893 			hpfs_brelse4(&qbh0);
894 			return de;
895 		}
896 	}
897 
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));
900 	hpfs_brelse4(&qbh0);
901 
902 	bail:
903 	*posp = 12;
904 	return de;
905 }
906 
907 /* Find a dirent in tree */
908 
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)
912 {
913 	struct dnode *dnode;
914 	struct hpfs_dirent *de;
915 	struct hpfs_dirent *de_end;
916 	int c1, c2 = 0;
917 
918 	if (!S_ISDIR(inode->i_mode)) hpfs_error(inode->i_sb, "map_dirent: not a directory\n");
919 	again:
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;
923 
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);
927 		if (!t) {
928 			if (dd) *dd = dno;
929 			return de;
930 		}
931 		if (t < 0) {
932 			if (de->down) {
933 				dno = de_down_pointer(de);
934 				hpfs_brelse4(qbh);
935 				goto again;
936 			}
937 		break;
938 		}
939 	}
940 	hpfs_brelse4(qbh);
941 	return NULL;
942 }
943 
944 /*
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
947  * of empty dnodes.
948  */
949 
950 void hpfs_remove_dtree(struct super_block *s, dnode_secno dno)
951 {
952 	struct quad_buffer_head qbh;
953 	struct dnode *dnode;
954 	struct hpfs_dirent *de;
955 	dnode_secno d1, d2, rdno = dno;
956 	while (1) {
957 		if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return;
958 		de = dnode_first_de(dnode);
959 		if (de->last) {
960 			if (de->down) d1 = de_down_pointer(de);
961 			else goto error;
962 			hpfs_brelse4(&qbh);
963 			hpfs_free_dnode(s, dno);
964 			dno = d1;
965 		} else break;
966 	}
967 	if (!de->first) goto error;
968 	d1 = de->down ? de_down_pointer(de) : 0;
969 	de = de_next_de(de);
970 	if (!de->last) goto error;
971 	d2 = de->down ? de_down_pointer(de) : 0;
972 	hpfs_brelse4(&qbh);
973 	hpfs_free_dnode(s, dno);
974 	do {
975 		while (d1) {
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;
980 			hpfs_brelse4(&qbh);
981 			hpfs_free_dnode(s, dno);
982 		}
983 		d1 = d2;
984 		d2 = 0;
985 	} while (d1);
986 	return;
987 	error:
988 	hpfs_brelse4(&qbh);
989 	hpfs_free_dnode(s, dno);
990 	hpfs_error(s, "directory %08x is corrupted or not empty", rdno);
991 }
992 
993 /*
994  * Find dirent for specified fnode. Use truncated 15-char name in fnode as
995  * a help for searching.
996  */
997 
998 struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno,
999 				     struct fnode *f, struct quad_buffer_head *qbh)
1000 {
1001 	unsigned char *name1;
1002 	unsigned char *name2;
1003 	int name1len, name2len;
1004 	struct dnode *d;
1005 	dnode_secno dno, downd;
1006 	struct fnode *upf;
1007 	struct buffer_head *bh;
1008 	struct hpfs_dirent *de, *de_end;
1009 	int c;
1010 	int c1, c2 = 0;
1011 	int d1, d2 = 0;
1012 	name1 = f->name;
1013 	if (!(name2 = kmalloc(256, GFP_NOFS))) {
1014 		pr_err("out of memory, can't map dirent\n");
1015 		return NULL;
1016 	}
1017 	if (f->len <= 15)
1018 		memcpy(name2, name1, name1len = name2len = f->len);
1019 	else {
1020 		memcpy(name2, name1, 15);
1021 		memset(name2 + 15, 0xff, 256 - 15);
1022 		/*name2[15] = 0xff;*/
1023 		name1len = 15; name2len = 256;
1024 	}
1025 	if (!(upf = hpfs_map_fnode(s, le32_to_cpu(f->up), &bh))) {
1026 		kfree(name2);
1027 		return NULL;
1028 	}
1029 	if (!fnode_is_dir(upf)) {
1030 		brelse(bh);
1031 		hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, le32_to_cpu(f->up));
1032 		kfree(name2);
1033 		return NULL;
1034 	}
1035 	dno = le32_to_cpu(upf->u.external[0].disk_secno);
1036 	brelse(bh);
1037 	go_down:
1038 	downd = 0;
1039 	go_up:
1040 	if (!(d = hpfs_map_dnode(s, dno, qbh))) {
1041 		kfree(name2);
1042 		return NULL;
1043 	}
1044 	de_end = dnode_end_de(d);
1045 	de = dnode_first_de(d);
1046 	if (downd) {
1047 		while (de < de_end) {
1048 			if (de->down) if (de_down_pointer(de) == downd) goto f;
1049 			de = de_next_de(de);
1050 		}
1051 		hpfs_error(s, "pointer to dnode %08x not found in dnode %08x", downd, dno);
1052 		hpfs_brelse4(qbh);
1053 		kfree(name2);
1054 		return NULL;
1055 	}
1056 	next_de:
1057 	if (le32_to_cpu(de->fnode) == fno) {
1058 		kfree(name2);
1059 		return de;
1060 	}
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);
1064 		hpfs_brelse4(qbh);
1065 		if (hpfs_sb(s)->sb_chk)
1066 			if (hpfs_stop_cycles(s, dno, &c1, &c2, "map_fnode_dirent #1")) {
1067 				kfree(name2);
1068 				return NULL;
1069 		}
1070 		goto go_down;
1071 	}
1072 	f:
1073 	if (le32_to_cpu(de->fnode) == fno) {
1074 		kfree(name2);
1075 		return de;
1076 	}
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;
1081 	downd = dno;
1082 	dno = le32_to_cpu(d->up);
1083 	hpfs_brelse4(qbh);
1084 	if (hpfs_sb(s)->sb_chk)
1085 		if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
1086 			kfree(name2);
1087 			return NULL;
1088 		}
1089 	goto go_up;
1090 	not_found:
1091 	hpfs_brelse4(qbh);
1092 	hpfs_error(s, "dirent for fnode %08x not found", fno);
1093 	kfree(name2);
1094 	return NULL;
1095 }
1096