xref: /openbmc/linux/fs/reiserfs/namei.c (revision d739b42b)
1 /*
2  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3  *
4  * Trivial changes by Alan Cox to remove EHASHCOLLISION for compatibility
5  *
6  * Trivial Changes:
7  * Rights granted to Hans Reiser to redistribute under other terms providing
8  * he accepts all liability including but not limited to patent, fitness
9  * for purpose, and direct or indirect claims arising from failure to perform.
10  *
11  * NO WARRANTY
12  */
13 
14 #include <linux/config.h>
15 #include <linux/time.h>
16 #include <linux/bitops.h>
17 #include <linux/reiserfs_fs.h>
18 #include <linux/reiserfs_acl.h>
19 #include <linux/reiserfs_xattr.h>
20 #include <linux/smp_lock.h>
21 #include <linux/quotaops.h>
22 
23 #define INC_DIR_INODE_NLINK(i) if (i->i_nlink != 1) { i->i_nlink++; if (i->i_nlink >= REISERFS_LINK_MAX) i->i_nlink=1; }
24 #define DEC_DIR_INODE_NLINK(i) if (i->i_nlink != 1) i->i_nlink--;
25 
26 // directory item contains array of entry headers. This performs
27 // binary search through that array
28 static int bin_search_in_dir_item(struct reiserfs_dir_entry *de, loff_t off)
29 {
30 	struct item_head *ih = de->de_ih;
31 	struct reiserfs_de_head *deh = de->de_deh;
32 	int rbound, lbound, j;
33 
34 	lbound = 0;
35 	rbound = I_ENTRY_COUNT(ih) - 1;
36 
37 	for (j = (rbound + lbound) / 2; lbound <= rbound;
38 	     j = (rbound + lbound) / 2) {
39 		if (off < deh_offset(deh + j)) {
40 			rbound = j - 1;
41 			continue;
42 		}
43 		if (off > deh_offset(deh + j)) {
44 			lbound = j + 1;
45 			continue;
46 		}
47 		// this is not name found, but matched third key component
48 		de->de_entry_num = j;
49 		return NAME_FOUND;
50 	}
51 
52 	de->de_entry_num = lbound;
53 	return NAME_NOT_FOUND;
54 }
55 
56 // comment?  maybe something like set de to point to what the path points to?
57 static inline void set_de_item_location(struct reiserfs_dir_entry *de,
58 					struct path *path)
59 {
60 	de->de_bh = get_last_bh(path);
61 	de->de_ih = get_ih(path);
62 	de->de_deh = B_I_DEH(de->de_bh, de->de_ih);
63 	de->de_item_num = PATH_LAST_POSITION(path);
64 }
65 
66 // de_bh, de_ih, de_deh (points to first element of array), de_item_num is set
67 inline void set_de_name_and_namelen(struct reiserfs_dir_entry *de)
68 {
69 	struct reiserfs_de_head *deh = de->de_deh + de->de_entry_num;
70 
71 	if (de->de_entry_num >= ih_entry_count(de->de_ih))
72 		BUG();
73 
74 	de->de_entrylen = entry_length(de->de_bh, de->de_ih, de->de_entry_num);
75 	de->de_namelen = de->de_entrylen - (de_with_sd(deh) ? SD_SIZE : 0);
76 	de->de_name = B_I_PITEM(de->de_bh, de->de_ih) + deh_location(deh);
77 	if (de->de_name[de->de_namelen - 1] == 0)
78 		de->de_namelen = strlen(de->de_name);
79 }
80 
81 // what entry points to
82 static inline void set_de_object_key(struct reiserfs_dir_entry *de)
83 {
84 	if (de->de_entry_num >= ih_entry_count(de->de_ih))
85 		BUG();
86 	de->de_dir_id = deh_dir_id(&(de->de_deh[de->de_entry_num]));
87 	de->de_objectid = deh_objectid(&(de->de_deh[de->de_entry_num]));
88 }
89 
90 static inline void store_de_entry_key(struct reiserfs_dir_entry *de)
91 {
92 	struct reiserfs_de_head *deh = de->de_deh + de->de_entry_num;
93 
94 	if (de->de_entry_num >= ih_entry_count(de->de_ih))
95 		BUG();
96 
97 	/* store key of the found entry */
98 	de->de_entry_key.version = KEY_FORMAT_3_5;
99 	de->de_entry_key.on_disk_key.k_dir_id =
100 	    le32_to_cpu(de->de_ih->ih_key.k_dir_id);
101 	de->de_entry_key.on_disk_key.k_objectid =
102 	    le32_to_cpu(de->de_ih->ih_key.k_objectid);
103 	set_cpu_key_k_offset(&(de->de_entry_key), deh_offset(deh));
104 	set_cpu_key_k_type(&(de->de_entry_key), TYPE_DIRENTRY);
105 }
106 
107 /* We assign a key to each directory item, and place multiple entries
108 in a single directory item.  A directory item has a key equal to the
109 key of the first directory entry in it.
110 
111 This function first calls search_by_key, then, if item whose first
112 entry matches is not found it looks for the entry inside directory
113 item found by search_by_key. Fills the path to the entry, and to the
114 entry position in the item
115 
116 */
117 
118 /* The function is NOT SCHEDULE-SAFE! */
119 int search_by_entry_key(struct super_block *sb, const struct cpu_key *key,
120 			struct path *path, struct reiserfs_dir_entry *de)
121 {
122 	int retval;
123 
124 	retval = search_item(sb, key, path);
125 	switch (retval) {
126 	case ITEM_NOT_FOUND:
127 		if (!PATH_LAST_POSITION(path)) {
128 			reiserfs_warning(sb,
129 					 "vs-7000: search_by_entry_key: search_by_key returned item position == 0");
130 			pathrelse(path);
131 			return IO_ERROR;
132 		}
133 		PATH_LAST_POSITION(path)--;
134 
135 	case ITEM_FOUND:
136 		break;
137 
138 	case IO_ERROR:
139 		return retval;
140 
141 	default:
142 		pathrelse(path);
143 		reiserfs_warning(sb,
144 				 "vs-7002: search_by_entry_key: no path to here");
145 		return IO_ERROR;
146 	}
147 
148 	set_de_item_location(de, path);
149 
150 #ifdef CONFIG_REISERFS_CHECK
151 	if (!is_direntry_le_ih(de->de_ih) ||
152 	    COMP_SHORT_KEYS(&(de->de_ih->ih_key), key)) {
153 		print_block(de->de_bh, 0, -1, -1);
154 		reiserfs_panic(sb,
155 			       "vs-7005: search_by_entry_key: found item %h is not directory item or "
156 			       "does not belong to the same directory as key %K",
157 			       de->de_ih, key);
158 	}
159 #endif				/* CONFIG_REISERFS_CHECK */
160 
161 	/* binary search in directory item by third componen t of the
162 	   key. sets de->de_entry_num of de */
163 	retval = bin_search_in_dir_item(de, cpu_key_k_offset(key));
164 	path->pos_in_item = de->de_entry_num;
165 	if (retval != NAME_NOT_FOUND) {
166 		// ugly, but rename needs de_bh, de_deh, de_name, de_namelen, de_objectid set
167 		set_de_name_and_namelen(de);
168 		set_de_object_key(de);
169 	}
170 	return retval;
171 }
172 
173 /* Keyed 32-bit hash function using TEA in a Davis-Meyer function */
174 
175 /* The third component is hashed, and you can choose from more than
176    one hash function.  Per directory hashes are not yet implemented
177    but are thought about. This function should be moved to hashes.c
178    Jedi, please do so.  -Hans */
179 
180 static __u32 get_third_component(struct super_block *s,
181 				 const char *name, int len)
182 {
183 	__u32 res;
184 
185 	if (!len || (len == 1 && name[0] == '.'))
186 		return DOT_OFFSET;
187 	if (len == 2 && name[0] == '.' && name[1] == '.')
188 		return DOT_DOT_OFFSET;
189 
190 	res = REISERFS_SB(s)->s_hash_function(name, len);
191 
192 	// take bits from 7-th to 30-th including both bounds
193 	res = GET_HASH_VALUE(res);
194 	if (res == 0)
195 		// needed to have no names before "." and ".." those have hash
196 		// value == 0 and generation conters 1 and 2 accordingly
197 		res = 128;
198 	return res + MAX_GENERATION_NUMBER;
199 }
200 
201 static int reiserfs_match(struct reiserfs_dir_entry *de,
202 			  const char *name, int namelen)
203 {
204 	int retval = NAME_NOT_FOUND;
205 
206 	if ((namelen == de->de_namelen) &&
207 	    !memcmp(de->de_name, name, de->de_namelen))
208 		retval =
209 		    (de_visible(de->de_deh + de->de_entry_num) ? NAME_FOUND :
210 		     NAME_FOUND_INVISIBLE);
211 
212 	return retval;
213 }
214 
215 /* de's de_bh, de_ih, de_deh, de_item_num, de_entry_num are set already */
216 
217 				/* used when hash collisions exist */
218 
219 static int linear_search_in_dir_item(struct cpu_key *key,
220 				     struct reiserfs_dir_entry *de,
221 				     const char *name, int namelen)
222 {
223 	struct reiserfs_de_head *deh = de->de_deh;
224 	int retval;
225 	int i;
226 
227 	i = de->de_entry_num;
228 
229 	if (i == I_ENTRY_COUNT(de->de_ih) ||
230 	    GET_HASH_VALUE(deh_offset(deh + i)) !=
231 	    GET_HASH_VALUE(cpu_key_k_offset(key))) {
232 		i--;
233 	}
234 
235 	RFALSE(de->de_deh != B_I_DEH(de->de_bh, de->de_ih),
236 	       "vs-7010: array of entry headers not found");
237 
238 	deh += i;
239 
240 	for (; i >= 0; i--, deh--) {
241 		if (GET_HASH_VALUE(deh_offset(deh)) !=
242 		    GET_HASH_VALUE(cpu_key_k_offset(key))) {
243 			// hash value does not match, no need to check whole name
244 			return NAME_NOT_FOUND;
245 		}
246 
247 		/* mark, that this generation number is used */
248 		if (de->de_gen_number_bit_string)
249 			set_bit(GET_GENERATION_NUMBER(deh_offset(deh)),
250 				(unsigned long *)de->de_gen_number_bit_string);
251 
252 		// calculate pointer to name and namelen
253 		de->de_entry_num = i;
254 		set_de_name_and_namelen(de);
255 
256 		if ((retval =
257 		     reiserfs_match(de, name, namelen)) != NAME_NOT_FOUND) {
258 			// de's de_name, de_namelen, de_recordlen are set. Fill the rest:
259 
260 			// key of pointed object
261 			set_de_object_key(de);
262 
263 			store_de_entry_key(de);
264 
265 			// retval can be NAME_FOUND or NAME_FOUND_INVISIBLE
266 			return retval;
267 		}
268 	}
269 
270 	if (GET_GENERATION_NUMBER(le_ih_k_offset(de->de_ih)) == 0)
271 		/* we have reached left most entry in the node. In common we
272 		   have to go to the left neighbor, but if generation counter
273 		   is 0 already, we know for sure, that there is no name with
274 		   the same hash value */
275 		// FIXME: this work correctly only because hash value can not
276 		// be 0. Btw, in case of Yura's hash it is probably possible,
277 		// so, this is a bug
278 		return NAME_NOT_FOUND;
279 
280 	RFALSE(de->de_item_num,
281 	       "vs-7015: two diritems of the same directory in one node?");
282 
283 	return GOTO_PREVIOUS_ITEM;
284 }
285 
286 // may return NAME_FOUND, NAME_FOUND_INVISIBLE, NAME_NOT_FOUND
287 // FIXME: should add something like IOERROR
288 static int reiserfs_find_entry(struct inode *dir, const char *name, int namelen,
289 			       struct path *path_to_entry,
290 			       struct reiserfs_dir_entry *de)
291 {
292 	struct cpu_key key_to_search;
293 	int retval;
294 
295 	if (namelen > REISERFS_MAX_NAME(dir->i_sb->s_blocksize))
296 		return NAME_NOT_FOUND;
297 
298 	/* we will search for this key in the tree */
299 	make_cpu_key(&key_to_search, dir,
300 		     get_third_component(dir->i_sb, name, namelen),
301 		     TYPE_DIRENTRY, 3);
302 
303 	while (1) {
304 		retval =
305 		    search_by_entry_key(dir->i_sb, &key_to_search,
306 					path_to_entry, de);
307 		if (retval == IO_ERROR) {
308 			reiserfs_warning(dir->i_sb, "zam-7001: io error in %s",
309 					 __FUNCTION__);
310 			return IO_ERROR;
311 		}
312 
313 		/* compare names for all entries having given hash value */
314 		retval =
315 		    linear_search_in_dir_item(&key_to_search, de, name,
316 					      namelen);
317 		if (retval != GOTO_PREVIOUS_ITEM) {
318 			/* there is no need to scan directory anymore. Given entry found or does not exist */
319 			path_to_entry->pos_in_item = de->de_entry_num;
320 			return retval;
321 		}
322 
323 		/* there is left neighboring item of this directory and given entry can be there */
324 		set_cpu_key_k_offset(&key_to_search,
325 				     le_ih_k_offset(de->de_ih) - 1);
326 		pathrelse(path_to_entry);
327 
328 	}			/* while (1) */
329 }
330 
331 static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry,
332 				      struct nameidata *nd)
333 {
334 	int retval;
335 	struct inode *inode = NULL;
336 	struct reiserfs_dir_entry de;
337 	INITIALIZE_PATH(path_to_entry);
338 
339 	if (REISERFS_MAX_NAME(dir->i_sb->s_blocksize) < dentry->d_name.len)
340 		return ERR_PTR(-ENAMETOOLONG);
341 
342 	reiserfs_write_lock(dir->i_sb);
343 	de.de_gen_number_bit_string = NULL;
344 	retval =
345 	    reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,
346 				&path_to_entry, &de);
347 	pathrelse(&path_to_entry);
348 	if (retval == NAME_FOUND) {
349 		/* Hide the .reiserfs_priv directory */
350 		if (reiserfs_xattrs(dir->i_sb) &&
351 		    !old_format_only(dir->i_sb) &&
352 		    REISERFS_SB(dir->i_sb)->priv_root &&
353 		    REISERFS_SB(dir->i_sb)->priv_root->d_inode &&
354 		    de.de_objectid ==
355 		    le32_to_cpu(INODE_PKEY
356 				(REISERFS_SB(dir->i_sb)->priv_root->d_inode)->
357 				k_objectid)) {
358 			reiserfs_write_unlock(dir->i_sb);
359 			return ERR_PTR(-EACCES);
360 		}
361 
362 		inode =
363 		    reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
364 		if (!inode || IS_ERR(inode)) {
365 			reiserfs_write_unlock(dir->i_sb);
366 			return ERR_PTR(-EACCES);
367 		}
368 
369 		/* Propogate the priv_object flag so we know we're in the priv tree */
370 		if (is_reiserfs_priv_object(dir))
371 			reiserfs_mark_inode_private(inode);
372 	}
373 	reiserfs_write_unlock(dir->i_sb);
374 	if (retval == IO_ERROR) {
375 		return ERR_PTR(-EIO);
376 	}
377 
378 	return d_splice_alias(inode, dentry);
379 }
380 
381 /*
382 ** looks up the dentry of the parent directory for child.
383 ** taken from ext2_get_parent
384 */
385 struct dentry *reiserfs_get_parent(struct dentry *child)
386 {
387 	int retval;
388 	struct inode *inode = NULL;
389 	struct reiserfs_dir_entry de;
390 	INITIALIZE_PATH(path_to_entry);
391 	struct dentry *parent;
392 	struct inode *dir = child->d_inode;
393 
394 	if (dir->i_nlink == 0) {
395 		return ERR_PTR(-ENOENT);
396 	}
397 	de.de_gen_number_bit_string = NULL;
398 
399 	reiserfs_write_lock(dir->i_sb);
400 	retval = reiserfs_find_entry(dir, "..", 2, &path_to_entry, &de);
401 	pathrelse(&path_to_entry);
402 	if (retval != NAME_FOUND) {
403 		reiserfs_write_unlock(dir->i_sb);
404 		return ERR_PTR(-ENOENT);
405 	}
406 	inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
407 	reiserfs_write_unlock(dir->i_sb);
408 
409 	if (!inode || IS_ERR(inode)) {
410 		return ERR_PTR(-EACCES);
411 	}
412 	parent = d_alloc_anon(inode);
413 	if (!parent) {
414 		iput(inode);
415 		parent = ERR_PTR(-ENOMEM);
416 	}
417 	return parent;
418 }
419 
420 /* add entry to the directory (entry can be hidden).
421 
422 insert definition of when hidden directories are used here -Hans
423 
424  Does not mark dir   inode dirty, do it after successesfull call to it */
425 
426 static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
427 			      struct inode *dir, const char *name, int namelen,
428 			      struct inode *inode, int visible)
429 {
430 	struct cpu_key entry_key;
431 	struct reiserfs_de_head *deh;
432 	INITIALIZE_PATH(path);
433 	struct reiserfs_dir_entry de;
434 	int bit_string[MAX_GENERATION_NUMBER / (sizeof(int) * 8) + 1];
435 	int gen_number;
436 	char small_buf[32 + DEH_SIZE];	/* 48 bytes now and we avoid kmalloc
437 					   if we create file with short name */
438 	char *buffer;
439 	int buflen, paste_size;
440 	int retval;
441 
442 	BUG_ON(!th->t_trans_id);
443 
444 	/* cannot allow items to be added into a busy deleted directory */
445 	if (!namelen)
446 		return -EINVAL;
447 
448 	if (namelen > REISERFS_MAX_NAME(dir->i_sb->s_blocksize))
449 		return -ENAMETOOLONG;
450 
451 	/* each entry has unique key. compose it */
452 	make_cpu_key(&entry_key, dir,
453 		     get_third_component(dir->i_sb, name, namelen),
454 		     TYPE_DIRENTRY, 3);
455 
456 	/* get memory for composing the entry */
457 	buflen = DEH_SIZE + ROUND_UP(namelen);
458 	if (buflen > sizeof(small_buf)) {
459 		buffer = kmalloc(buflen, GFP_NOFS);
460 		if (buffer == 0)
461 			return -ENOMEM;
462 	} else
463 		buffer = small_buf;
464 
465 	paste_size =
466 	    (get_inode_sd_version(dir) ==
467 	     STAT_DATA_V1) ? (DEH_SIZE + namelen) : buflen;
468 
469 	/* fill buffer : directory entry head, name[, dir objectid | , stat data | ,stat data, dir objectid ] */
470 	deh = (struct reiserfs_de_head *)buffer;
471 	deh->deh_location = 0;	/* JDM Endian safe if 0 */
472 	put_deh_offset(deh, cpu_key_k_offset(&entry_key));
473 	deh->deh_state = 0;	/* JDM Endian safe if 0 */
474 	/* put key (ino analog) to de */
475 	deh->deh_dir_id = INODE_PKEY(inode)->k_dir_id;	/* safe: k_dir_id is le */
476 	deh->deh_objectid = INODE_PKEY(inode)->k_objectid;	/* safe: k_objectid is le */
477 
478 	/* copy name */
479 	memcpy((char *)(deh + 1), name, namelen);
480 	/* padd by 0s to the 4 byte boundary */
481 	padd_item((char *)(deh + 1), ROUND_UP(namelen), namelen);
482 
483 	/* entry is ready to be pasted into tree, set 'visibility' and 'stat data in entry' attributes */
484 	mark_de_without_sd(deh);
485 	visible ? mark_de_visible(deh) : mark_de_hidden(deh);
486 
487 	/* find the proper place for the new entry */
488 	memset(bit_string, 0, sizeof(bit_string));
489 	de.de_gen_number_bit_string = (char *)bit_string;
490 	retval = reiserfs_find_entry(dir, name, namelen, &path, &de);
491 	if (retval != NAME_NOT_FOUND) {
492 		if (buffer != small_buf)
493 			kfree(buffer);
494 		pathrelse(&path);
495 
496 		if (retval == IO_ERROR) {
497 			return -EIO;
498 		}
499 
500 		if (retval != NAME_FOUND) {
501 			reiserfs_warning(dir->i_sb,
502 					 "zam-7002:%s: \"reiserfs_find_entry\" "
503 					 "has returned unexpected value (%d)",
504 					 __FUNCTION__, retval);
505 		}
506 
507 		return -EEXIST;
508 	}
509 
510 	gen_number =
511 	    find_first_zero_bit((unsigned long *)bit_string,
512 				MAX_GENERATION_NUMBER + 1);
513 	if (gen_number > MAX_GENERATION_NUMBER) {
514 		/* there is no free generation number */
515 		reiserfs_warning(dir->i_sb,
516 				 "reiserfs_add_entry: Congratulations! we have got hash function screwed up");
517 		if (buffer != small_buf)
518 			kfree(buffer);
519 		pathrelse(&path);
520 		return -EBUSY;
521 	}
522 	/* adjust offset of directory enrty */
523 	put_deh_offset(deh, SET_GENERATION_NUMBER(deh_offset(deh), gen_number));
524 	set_cpu_key_k_offset(&entry_key, deh_offset(deh));
525 
526 	/* update max-hash-collisions counter in reiserfs_sb_info */
527 	PROC_INFO_MAX(th->t_super, max_hash_collisions, gen_number);
528 
529 	if (gen_number != 0) {	/* we need to re-search for the insertion point */
530 		if (search_by_entry_key(dir->i_sb, &entry_key, &path, &de) !=
531 		    NAME_NOT_FOUND) {
532 			reiserfs_warning(dir->i_sb,
533 					 "vs-7032: reiserfs_add_entry: "
534 					 "entry with this key (%K) already exists",
535 					 &entry_key);
536 
537 			if (buffer != small_buf)
538 				kfree(buffer);
539 			pathrelse(&path);
540 			return -EBUSY;
541 		}
542 	}
543 
544 	/* perform the insertion of the entry that we have prepared */
545 	retval =
546 	    reiserfs_paste_into_item(th, &path, &entry_key, dir, buffer,
547 				     paste_size);
548 	if (buffer != small_buf)
549 		kfree(buffer);
550 	if (retval) {
551 		reiserfs_check_path(&path);
552 		return retval;
553 	}
554 
555 	dir->i_size += paste_size;
556 	dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
557 	if (!S_ISDIR(inode->i_mode) && visible)
558 		// reiserfs_mkdir or reiserfs_rename will do that by itself
559 		reiserfs_update_sd(th, dir);
560 
561 	reiserfs_check_path(&path);
562 	return 0;
563 }
564 
565 /* quota utility function, call if you've had to abort after calling
566 ** new_inode_init, and have not called reiserfs_new_inode yet.
567 ** This should only be called on inodes that do not have stat data
568 ** inserted into the tree yet.
569 */
570 static int drop_new_inode(struct inode *inode)
571 {
572 	DQUOT_DROP(inode);
573 	make_bad_inode(inode);
574 	inode->i_flags |= S_NOQUOTA;
575 	iput(inode);
576 	return 0;
577 }
578 
579 /* utility function that does setup for reiserfs_new_inode.
580 ** DQUOT_INIT needs lots of credits so it's better to have it
581 ** outside of a transaction, so we had to pull some bits of
582 ** reiserfs_new_inode out into this func.
583 */
584 static int new_inode_init(struct inode *inode, struct inode *dir, int mode)
585 {
586 
587 	/* the quota init calls have to know who to charge the quota to, so
588 	 ** we have to set uid and gid here
589 	 */
590 	inode->i_uid = current->fsuid;
591 	inode->i_mode = mode;
592 	/* Make inode invalid - just in case we are going to drop it before
593 	 * the initialization happens */
594 	INODE_PKEY(inode)->k_objectid = 0;
595 
596 	if (dir->i_mode & S_ISGID) {
597 		inode->i_gid = dir->i_gid;
598 		if (S_ISDIR(mode))
599 			inode->i_mode |= S_ISGID;
600 	} else {
601 		inode->i_gid = current->fsgid;
602 	}
603 	DQUOT_INIT(inode);
604 	return 0;
605 }
606 
607 static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode,
608 			   struct nameidata *nd)
609 {
610 	int retval;
611 	struct inode *inode;
612 	/* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
613 	int jbegin_count =
614 	    JOURNAL_PER_BALANCE_CNT * 2 +
615 	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
616 		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
617 	struct reiserfs_transaction_handle th;
618 	int locked;
619 
620 	if (!(inode = new_inode(dir->i_sb))) {
621 		return -ENOMEM;
622 	}
623 	new_inode_init(inode, dir, mode);
624 
625 	locked = reiserfs_cache_default_acl(dir);
626 
627 	reiserfs_write_lock(dir->i_sb);
628 
629 	if (locked)
630 		reiserfs_write_lock_xattrs(dir->i_sb);
631 
632 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
633 	if (retval) {
634 		drop_new_inode(inode);
635 		goto out_failed;
636 	}
637 
638 	retval =
639 	    reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,
640 			       inode);
641 	if (retval)
642 		goto out_failed;
643 
644 	if (locked) {
645 		reiserfs_write_unlock_xattrs(dir->i_sb);
646 		locked = 0;
647 	}
648 
649 	inode->i_op = &reiserfs_file_inode_operations;
650 	inode->i_fop = &reiserfs_file_operations;
651 	inode->i_mapping->a_ops = &reiserfs_address_space_operations;
652 
653 	retval =
654 	    reiserfs_add_entry(&th, dir, dentry->d_name.name,
655 			       dentry->d_name.len, inode, 1 /*visible */ );
656 	if (retval) {
657 		int err;
658 		inode->i_nlink--;
659 		reiserfs_update_sd(&th, inode);
660 		err = journal_end(&th, dir->i_sb, jbegin_count);
661 		if (err)
662 			retval = err;
663 		iput(inode);
664 		goto out_failed;
665 	}
666 	reiserfs_update_inode_transaction(inode);
667 	reiserfs_update_inode_transaction(dir);
668 
669 	d_instantiate(dentry, inode);
670 	retval = journal_end(&th, dir->i_sb, jbegin_count);
671 
672       out_failed:
673 	if (locked)
674 		reiserfs_write_unlock_xattrs(dir->i_sb);
675 	reiserfs_write_unlock(dir->i_sb);
676 	return retval;
677 }
678 
679 static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
680 			  dev_t rdev)
681 {
682 	int retval;
683 	struct inode *inode;
684 	struct reiserfs_transaction_handle th;
685 	/* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
686 	int jbegin_count =
687 	    JOURNAL_PER_BALANCE_CNT * 3 +
688 	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
689 		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
690 	int locked;
691 
692 	if (!new_valid_dev(rdev))
693 		return -EINVAL;
694 
695 	if (!(inode = new_inode(dir->i_sb))) {
696 		return -ENOMEM;
697 	}
698 	new_inode_init(inode, dir, mode);
699 
700 	locked = reiserfs_cache_default_acl(dir);
701 
702 	reiserfs_write_lock(dir->i_sb);
703 
704 	if (locked)
705 		reiserfs_write_lock_xattrs(dir->i_sb);
706 
707 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
708 	if (retval) {
709 		drop_new_inode(inode);
710 		goto out_failed;
711 	}
712 
713 	retval =
714 	    reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,
715 			       inode);
716 	if (retval) {
717 		goto out_failed;
718 	}
719 
720 	if (locked) {
721 		reiserfs_write_unlock_xattrs(dir->i_sb);
722 		locked = 0;
723 	}
724 
725 	inode->i_op = &reiserfs_special_inode_operations;
726 	init_special_inode(inode, inode->i_mode, rdev);
727 
728 	//FIXME: needed for block and char devices only
729 	reiserfs_update_sd(&th, inode);
730 
731 	reiserfs_update_inode_transaction(inode);
732 	reiserfs_update_inode_transaction(dir);
733 
734 	retval =
735 	    reiserfs_add_entry(&th, dir, dentry->d_name.name,
736 			       dentry->d_name.len, inode, 1 /*visible */ );
737 	if (retval) {
738 		int err;
739 		inode->i_nlink--;
740 		reiserfs_update_sd(&th, inode);
741 		err = journal_end(&th, dir->i_sb, jbegin_count);
742 		if (err)
743 			retval = err;
744 		iput(inode);
745 		goto out_failed;
746 	}
747 
748 	d_instantiate(dentry, inode);
749 	retval = journal_end(&th, dir->i_sb, jbegin_count);
750 
751       out_failed:
752 	if (locked)
753 		reiserfs_write_unlock_xattrs(dir->i_sb);
754 	reiserfs_write_unlock(dir->i_sb);
755 	return retval;
756 }
757 
758 static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
759 {
760 	int retval;
761 	struct inode *inode;
762 	struct reiserfs_transaction_handle th;
763 	/* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
764 	int jbegin_count =
765 	    JOURNAL_PER_BALANCE_CNT * 3 +
766 	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
767 		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
768 	int locked;
769 
770 #ifdef DISPLACE_NEW_PACKING_LOCALITIES
771 	/* set flag that new packing locality created and new blocks for the content     * of that directory are not displaced yet */
772 	REISERFS_I(dir)->new_packing_locality = 1;
773 #endif
774 	mode = S_IFDIR | mode;
775 	if (!(inode = new_inode(dir->i_sb))) {
776 		return -ENOMEM;
777 	}
778 	new_inode_init(inode, dir, mode);
779 
780 	locked = reiserfs_cache_default_acl(dir);
781 
782 	reiserfs_write_lock(dir->i_sb);
783 	if (locked)
784 		reiserfs_write_lock_xattrs(dir->i_sb);
785 
786 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
787 	if (retval) {
788 		drop_new_inode(inode);
789 		goto out_failed;
790 	}
791 
792 	/* inc the link count now, so another writer doesn't overflow it while
793 	 ** we sleep later on.
794 	 */
795 	INC_DIR_INODE_NLINK(dir)
796 
797 	    retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ ,
798 					old_format_only(dir->i_sb) ?
799 					EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE,
800 					dentry, inode);
801 	if (retval) {
802 		dir->i_nlink--;
803 		goto out_failed;
804 	}
805 
806 	if (locked) {
807 		reiserfs_write_unlock_xattrs(dir->i_sb);
808 		locked = 0;
809 	}
810 
811 	reiserfs_update_inode_transaction(inode);
812 	reiserfs_update_inode_transaction(dir);
813 
814 	inode->i_op = &reiserfs_dir_inode_operations;
815 	inode->i_fop = &reiserfs_dir_operations;
816 
817 	// note, _this_ add_entry will not update dir's stat data
818 	retval =
819 	    reiserfs_add_entry(&th, dir, dentry->d_name.name,
820 			       dentry->d_name.len, inode, 1 /*visible */ );
821 	if (retval) {
822 		int err;
823 		inode->i_nlink = 0;
824 		DEC_DIR_INODE_NLINK(dir);
825 		reiserfs_update_sd(&th, inode);
826 		err = journal_end(&th, dir->i_sb, jbegin_count);
827 		if (err)
828 			retval = err;
829 		iput(inode);
830 		goto out_failed;
831 	}
832 	// the above add_entry did not update dir's stat data
833 	reiserfs_update_sd(&th, dir);
834 
835 	d_instantiate(dentry, inode);
836 	retval = journal_end(&th, dir->i_sb, jbegin_count);
837       out_failed:
838 	if (locked)
839 		reiserfs_write_unlock_xattrs(dir->i_sb);
840 	reiserfs_write_unlock(dir->i_sb);
841 	return retval;
842 }
843 
844 static inline int reiserfs_empty_dir(struct inode *inode)
845 {
846 	/* we can cheat because an old format dir cannot have
847 	 ** EMPTY_DIR_SIZE, and a new format dir cannot have
848 	 ** EMPTY_DIR_SIZE_V1.  So, if the inode is either size,
849 	 ** regardless of disk format version, the directory is empty.
850 	 */
851 	if (inode->i_size != EMPTY_DIR_SIZE &&
852 	    inode->i_size != EMPTY_DIR_SIZE_V1) {
853 		return 0;
854 	}
855 	return 1;
856 }
857 
858 static int reiserfs_rmdir(struct inode *dir, struct dentry *dentry)
859 {
860 	int retval, err;
861 	struct inode *inode;
862 	struct reiserfs_transaction_handle th;
863 	int jbegin_count;
864 	INITIALIZE_PATH(path);
865 	struct reiserfs_dir_entry de;
866 
867 	/* we will be doing 2 balancings and update 2 stat data, we change quotas
868 	 * of the owner of the directory and of the owner of the parent directory.
869 	 * The quota structure is possibly deleted only on last iput => outside
870 	 * of this transaction */
871 	jbegin_count =
872 	    JOURNAL_PER_BALANCE_CNT * 2 + 2 +
873 	    4 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);
874 
875 	reiserfs_write_lock(dir->i_sb);
876 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
877 	if (retval)
878 		goto out_rmdir;
879 
880 	de.de_gen_number_bit_string = NULL;
881 	if ((retval =
882 	     reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,
883 				 &path, &de)) == NAME_NOT_FOUND) {
884 		retval = -ENOENT;
885 		goto end_rmdir;
886 	} else if (retval == IO_ERROR) {
887 		retval = -EIO;
888 		goto end_rmdir;
889 	}
890 
891 	inode = dentry->d_inode;
892 
893 	reiserfs_update_inode_transaction(inode);
894 	reiserfs_update_inode_transaction(dir);
895 
896 	if (de.de_objectid != inode->i_ino) {
897 		// FIXME: compare key of an object and a key found in the
898 		// entry
899 		retval = -EIO;
900 		goto end_rmdir;
901 	}
902 	if (!reiserfs_empty_dir(inode)) {
903 		retval = -ENOTEMPTY;
904 		goto end_rmdir;
905 	}
906 
907 	/* cut entry from dir directory */
908 	retval = reiserfs_cut_from_item(&th, &path, &(de.de_entry_key), dir, NULL,	/* page */
909 					0 /*new file size - not used here */ );
910 	if (retval < 0)
911 		goto end_rmdir;
912 
913 	if (inode->i_nlink != 2 && inode->i_nlink != 1)
914 		reiserfs_warning(inode->i_sb, "%s: empty directory has nlink "
915 				 "!= 2 (%d)", __FUNCTION__, inode->i_nlink);
916 
917 	inode->i_nlink = 0;
918 	inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
919 	reiserfs_update_sd(&th, inode);
920 
921 	DEC_DIR_INODE_NLINK(dir)
922 	    dir->i_size -= (DEH_SIZE + de.de_entrylen);
923 	reiserfs_update_sd(&th, dir);
924 
925 	/* prevent empty directory from getting lost */
926 	add_save_link(&th, inode, 0 /* not truncate */ );
927 
928 	retval = journal_end(&th, dir->i_sb, jbegin_count);
929 	reiserfs_check_path(&path);
930       out_rmdir:
931 	reiserfs_write_unlock(dir->i_sb);
932 	return retval;
933 
934       end_rmdir:
935 	/* we must release path, because we did not call
936 	   reiserfs_cut_from_item, or reiserfs_cut_from_item does not
937 	   release path if operation was not complete */
938 	pathrelse(&path);
939 	err = journal_end(&th, dir->i_sb, jbegin_count);
940 	reiserfs_write_unlock(dir->i_sb);
941 	return err ? err : retval;
942 }
943 
944 static int reiserfs_unlink(struct inode *dir, struct dentry *dentry)
945 {
946 	int retval, err;
947 	struct inode *inode;
948 	struct reiserfs_dir_entry de;
949 	INITIALIZE_PATH(path);
950 	struct reiserfs_transaction_handle th;
951 	int jbegin_count;
952 	unsigned long savelink;
953 
954 	inode = dentry->d_inode;
955 
956 	/* in this transaction we can be doing at max two balancings and update
957 	 * two stat datas, we change quotas of the owner of the directory and of
958 	 * the owner of the parent directory. The quota structure is possibly
959 	 * deleted only on iput => outside of this transaction */
960 	jbegin_count =
961 	    JOURNAL_PER_BALANCE_CNT * 2 + 2 +
962 	    4 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);
963 
964 	reiserfs_write_lock(dir->i_sb);
965 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
966 	if (retval)
967 		goto out_unlink;
968 
969 	de.de_gen_number_bit_string = NULL;
970 	if ((retval =
971 	     reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,
972 				 &path, &de)) == NAME_NOT_FOUND) {
973 		retval = -ENOENT;
974 		goto end_unlink;
975 	} else if (retval == IO_ERROR) {
976 		retval = -EIO;
977 		goto end_unlink;
978 	}
979 
980 	reiserfs_update_inode_transaction(inode);
981 	reiserfs_update_inode_transaction(dir);
982 
983 	if (de.de_objectid != inode->i_ino) {
984 		// FIXME: compare key of an object and a key found in the
985 		// entry
986 		retval = -EIO;
987 		goto end_unlink;
988 	}
989 
990 	if (!inode->i_nlink) {
991 		reiserfs_warning(inode->i_sb, "%s: deleting nonexistent file "
992 				 "(%s:%lu), %d", __FUNCTION__,
993 				 reiserfs_bdevname(inode->i_sb), inode->i_ino,
994 				 inode->i_nlink);
995 		inode->i_nlink = 1;
996 	}
997 
998 	inode->i_nlink--;
999 
1000 	/*
1001 	 * we schedule before doing the add_save_link call, save the link
1002 	 * count so we don't race
1003 	 */
1004 	savelink = inode->i_nlink;
1005 
1006 	retval =
1007 	    reiserfs_cut_from_item(&th, &path, &(de.de_entry_key), dir, NULL,
1008 				   0);
1009 	if (retval < 0) {
1010 		inode->i_nlink++;
1011 		goto end_unlink;
1012 	}
1013 	inode->i_ctime = CURRENT_TIME_SEC;
1014 	reiserfs_update_sd(&th, inode);
1015 
1016 	dir->i_size -= (de.de_entrylen + DEH_SIZE);
1017 	dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
1018 	reiserfs_update_sd(&th, dir);
1019 
1020 	if (!savelink)
1021 		/* prevent file from getting lost */
1022 		add_save_link(&th, inode, 0 /* not truncate */ );
1023 
1024 	retval = journal_end(&th, dir->i_sb, jbegin_count);
1025 	reiserfs_check_path(&path);
1026 	reiserfs_write_unlock(dir->i_sb);
1027 	return retval;
1028 
1029       end_unlink:
1030 	pathrelse(&path);
1031 	err = journal_end(&th, dir->i_sb, jbegin_count);
1032 	reiserfs_check_path(&path);
1033 	if (err)
1034 		retval = err;
1035       out_unlink:
1036 	reiserfs_write_unlock(dir->i_sb);
1037 	return retval;
1038 }
1039 
1040 static int reiserfs_symlink(struct inode *parent_dir,
1041 			    struct dentry *dentry, const char *symname)
1042 {
1043 	int retval;
1044 	struct inode *inode;
1045 	char *name;
1046 	int item_len;
1047 	struct reiserfs_transaction_handle th;
1048 	int mode = S_IFLNK | S_IRWXUGO;
1049 	/* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
1050 	int jbegin_count =
1051 	    JOURNAL_PER_BALANCE_CNT * 3 +
1052 	    2 * (REISERFS_QUOTA_INIT_BLOCKS(parent_dir->i_sb) +
1053 		 REISERFS_QUOTA_TRANS_BLOCKS(parent_dir->i_sb));
1054 
1055 	if (!(inode = new_inode(parent_dir->i_sb))) {
1056 		return -ENOMEM;
1057 	}
1058 	new_inode_init(inode, parent_dir, mode);
1059 
1060 	reiserfs_write_lock(parent_dir->i_sb);
1061 	item_len = ROUND_UP(strlen(symname));
1062 	if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) {
1063 		retval = -ENAMETOOLONG;
1064 		drop_new_inode(inode);
1065 		goto out_failed;
1066 	}
1067 
1068 	name = kmalloc(item_len, GFP_NOFS);
1069 	if (!name) {
1070 		drop_new_inode(inode);
1071 		retval = -ENOMEM;
1072 		goto out_failed;
1073 	}
1074 	memcpy(name, symname, strlen(symname));
1075 	padd_item(name, item_len, strlen(symname));
1076 
1077 	/* We would inherit the default ACL here, but symlinks don't get ACLs */
1078 
1079 	retval = journal_begin(&th, parent_dir->i_sb, jbegin_count);
1080 	if (retval) {
1081 		drop_new_inode(inode);
1082 		kfree(name);
1083 		goto out_failed;
1084 	}
1085 
1086 	retval =
1087 	    reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname),
1088 			       dentry, inode);
1089 	kfree(name);
1090 	if (retval) {		/* reiserfs_new_inode iputs for us */
1091 		goto out_failed;
1092 	}
1093 
1094 	reiserfs_update_inode_transaction(inode);
1095 	reiserfs_update_inode_transaction(parent_dir);
1096 
1097 	inode->i_op = &reiserfs_symlink_inode_operations;
1098 	inode->i_mapping->a_ops = &reiserfs_address_space_operations;
1099 
1100 	// must be sure this inode is written with this transaction
1101 	//
1102 	//reiserfs_update_sd (&th, inode, READ_BLOCKS);
1103 
1104 	retval = reiserfs_add_entry(&th, parent_dir, dentry->d_name.name,
1105 				    dentry->d_name.len, inode, 1 /*visible */ );
1106 	if (retval) {
1107 		int err;
1108 		inode->i_nlink--;
1109 		reiserfs_update_sd(&th, inode);
1110 		err = journal_end(&th, parent_dir->i_sb, jbegin_count);
1111 		if (err)
1112 			retval = err;
1113 		iput(inode);
1114 		goto out_failed;
1115 	}
1116 
1117 	d_instantiate(dentry, inode);
1118 	retval = journal_end(&th, parent_dir->i_sb, jbegin_count);
1119       out_failed:
1120 	reiserfs_write_unlock(parent_dir->i_sb);
1121 	return retval;
1122 }
1123 
1124 static int reiserfs_link(struct dentry *old_dentry, struct inode *dir,
1125 			 struct dentry *dentry)
1126 {
1127 	int retval;
1128 	struct inode *inode = old_dentry->d_inode;
1129 	struct reiserfs_transaction_handle th;
1130 	/* We need blocks for transaction + update of quotas for the owners of the directory */
1131 	int jbegin_count =
1132 	    JOURNAL_PER_BALANCE_CNT * 3 +
1133 	    2 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);
1134 
1135 	reiserfs_write_lock(dir->i_sb);
1136 	if (inode->i_nlink >= REISERFS_LINK_MAX) {
1137 		//FIXME: sd_nlink is 32 bit for new files
1138 		reiserfs_write_unlock(dir->i_sb);
1139 		return -EMLINK;
1140 	}
1141 	if (inode->i_nlink == 0) {
1142 		reiserfs_write_unlock(dir->i_sb);
1143 		return -ENOENT;
1144 	}
1145 
1146 	/* inc before scheduling so reiserfs_unlink knows we are here */
1147 	inode->i_nlink++;
1148 
1149 	retval = journal_begin(&th, dir->i_sb, jbegin_count);
1150 	if (retval) {
1151 		inode->i_nlink--;
1152 		reiserfs_write_unlock(dir->i_sb);
1153 		return retval;
1154 	}
1155 
1156 	/* create new entry */
1157 	retval =
1158 	    reiserfs_add_entry(&th, dir, dentry->d_name.name,
1159 			       dentry->d_name.len, inode, 1 /*visible */ );
1160 
1161 	reiserfs_update_inode_transaction(inode);
1162 	reiserfs_update_inode_transaction(dir);
1163 
1164 	if (retval) {
1165 		int err;
1166 		inode->i_nlink--;
1167 		err = journal_end(&th, dir->i_sb, jbegin_count);
1168 		reiserfs_write_unlock(dir->i_sb);
1169 		return err ? err : retval;
1170 	}
1171 
1172 	inode->i_ctime = CURRENT_TIME_SEC;
1173 	reiserfs_update_sd(&th, inode);
1174 
1175 	atomic_inc(&inode->i_count);
1176 	d_instantiate(dentry, inode);
1177 	retval = journal_end(&th, dir->i_sb, jbegin_count);
1178 	reiserfs_write_unlock(dir->i_sb);
1179 	return retval;
1180 }
1181 
1182 // de contains information pointing to an entry which
1183 static int de_still_valid(const char *name, int len,
1184 			  struct reiserfs_dir_entry *de)
1185 {
1186 	struct reiserfs_dir_entry tmp = *de;
1187 
1188 	// recalculate pointer to name and name length
1189 	set_de_name_and_namelen(&tmp);
1190 	// FIXME: could check more
1191 	if (tmp.de_namelen != len || memcmp(name, de->de_name, len))
1192 		return 0;
1193 	return 1;
1194 }
1195 
1196 static int entry_points_to_object(const char *name, int len,
1197 				  struct reiserfs_dir_entry *de,
1198 				  struct inode *inode)
1199 {
1200 	if (!de_still_valid(name, len, de))
1201 		return 0;
1202 
1203 	if (inode) {
1204 		if (!de_visible(de->de_deh + de->de_entry_num))
1205 			reiserfs_panic(NULL,
1206 				       "vs-7042: entry_points_to_object: entry must be visible");
1207 		return (de->de_objectid == inode->i_ino) ? 1 : 0;
1208 	}
1209 
1210 	/* this must be added hidden entry */
1211 	if (de_visible(de->de_deh + de->de_entry_num))
1212 		reiserfs_panic(NULL,
1213 			       "vs-7043: entry_points_to_object: entry must be visible");
1214 
1215 	return 1;
1216 }
1217 
1218 /* sets key of objectid the entry has to point to */
1219 static void set_ino_in_dir_entry(struct reiserfs_dir_entry *de,
1220 				 struct reiserfs_key *key)
1221 {
1222 	/* JDM These operations are endian safe - both are le */
1223 	de->de_deh[de->de_entry_num].deh_dir_id = key->k_dir_id;
1224 	de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid;
1225 }
1226 
1227 /*
1228  * process, that is going to call fix_nodes/do_balance must hold only
1229  * one path. If it holds 2 or more, it can get into endless waiting in
1230  * get_empty_nodes or its clones
1231  */
1232 static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry,
1233 			   struct inode *new_dir, struct dentry *new_dentry)
1234 {
1235 	int retval;
1236 	INITIALIZE_PATH(old_entry_path);
1237 	INITIALIZE_PATH(new_entry_path);
1238 	INITIALIZE_PATH(dot_dot_entry_path);
1239 	struct item_head new_entry_ih, old_entry_ih, dot_dot_ih;
1240 	struct reiserfs_dir_entry old_de, new_de, dot_dot_de;
1241 	struct inode *old_inode, *new_dentry_inode;
1242 	struct reiserfs_transaction_handle th;
1243 	int jbegin_count;
1244 	umode_t old_inode_mode;
1245 	unsigned long savelink = 1;
1246 	struct timespec ctime;
1247 
1248 	/* three balancings: (1) old name removal, (2) new name insertion
1249 	   and (3) maybe "save" link insertion
1250 	   stat data updates: (1) old directory,
1251 	   (2) new directory and (3) maybe old object stat data (when it is
1252 	   directory) and (4) maybe stat data of object to which new entry
1253 	   pointed initially and (5) maybe block containing ".." of
1254 	   renamed directory
1255 	   quota updates: two parent directories */
1256 	jbegin_count =
1257 	    JOURNAL_PER_BALANCE_CNT * 3 + 5 +
1258 	    4 * REISERFS_QUOTA_TRANS_BLOCKS(old_dir->i_sb);
1259 
1260 	old_inode = old_dentry->d_inode;
1261 	new_dentry_inode = new_dentry->d_inode;
1262 
1263 	// make sure, that oldname still exists and points to an object we
1264 	// are going to rename
1265 	old_de.de_gen_number_bit_string = NULL;
1266 	reiserfs_write_lock(old_dir->i_sb);
1267 	retval =
1268 	    reiserfs_find_entry(old_dir, old_dentry->d_name.name,
1269 				old_dentry->d_name.len, &old_entry_path,
1270 				&old_de);
1271 	pathrelse(&old_entry_path);
1272 	if (retval == IO_ERROR) {
1273 		reiserfs_write_unlock(old_dir->i_sb);
1274 		return -EIO;
1275 	}
1276 
1277 	if (retval != NAME_FOUND || old_de.de_objectid != old_inode->i_ino) {
1278 		reiserfs_write_unlock(old_dir->i_sb);
1279 		return -ENOENT;
1280 	}
1281 
1282 	old_inode_mode = old_inode->i_mode;
1283 	if (S_ISDIR(old_inode_mode)) {
1284 		// make sure, that directory being renamed has correct ".."
1285 		// and that its new parent directory has not too many links
1286 		// already
1287 
1288 		if (new_dentry_inode) {
1289 			if (!reiserfs_empty_dir(new_dentry_inode)) {
1290 				reiserfs_write_unlock(old_dir->i_sb);
1291 				return -ENOTEMPTY;
1292 			}
1293 		}
1294 
1295 		/* directory is renamed, its parent directory will be changed,
1296 		 ** so find ".." entry
1297 		 */
1298 		dot_dot_de.de_gen_number_bit_string = NULL;
1299 		retval =
1300 		    reiserfs_find_entry(old_inode, "..", 2, &dot_dot_entry_path,
1301 					&dot_dot_de);
1302 		pathrelse(&dot_dot_entry_path);
1303 		if (retval != NAME_FOUND) {
1304 			reiserfs_write_unlock(old_dir->i_sb);
1305 			return -EIO;
1306 		}
1307 
1308 		/* inode number of .. must equal old_dir->i_ino */
1309 		if (dot_dot_de.de_objectid != old_dir->i_ino) {
1310 			reiserfs_write_unlock(old_dir->i_sb);
1311 			return -EIO;
1312 		}
1313 	}
1314 
1315 	retval = journal_begin(&th, old_dir->i_sb, jbegin_count);
1316 	if (retval) {
1317 		reiserfs_write_unlock(old_dir->i_sb);
1318 		return retval;
1319 	}
1320 
1321 	/* add new entry (or find the existing one) */
1322 	retval =
1323 	    reiserfs_add_entry(&th, new_dir, new_dentry->d_name.name,
1324 			       new_dentry->d_name.len, old_inode, 0);
1325 	if (retval == -EEXIST) {
1326 		if (!new_dentry_inode) {
1327 			reiserfs_panic(old_dir->i_sb,
1328 				       "vs-7050: new entry is found, new inode == 0\n");
1329 		}
1330 	} else if (retval) {
1331 		int err = journal_end(&th, old_dir->i_sb, jbegin_count);
1332 		reiserfs_write_unlock(old_dir->i_sb);
1333 		return err ? err : retval;
1334 	}
1335 
1336 	reiserfs_update_inode_transaction(old_dir);
1337 	reiserfs_update_inode_transaction(new_dir);
1338 
1339 	/* this makes it so an fsync on an open fd for the old name will
1340 	 ** commit the rename operation
1341 	 */
1342 	reiserfs_update_inode_transaction(old_inode);
1343 
1344 	if (new_dentry_inode)
1345 		reiserfs_update_inode_transaction(new_dentry_inode);
1346 
1347 	while (1) {
1348 		// look for old name using corresponding entry key (found by reiserfs_find_entry)
1349 		if ((retval =
1350 		     search_by_entry_key(new_dir->i_sb, &old_de.de_entry_key,
1351 					 &old_entry_path,
1352 					 &old_de)) != NAME_FOUND) {
1353 			pathrelse(&old_entry_path);
1354 			journal_end(&th, old_dir->i_sb, jbegin_count);
1355 			reiserfs_write_unlock(old_dir->i_sb);
1356 			return -EIO;
1357 		}
1358 
1359 		copy_item_head(&old_entry_ih, get_ih(&old_entry_path));
1360 
1361 		reiserfs_prepare_for_journal(old_inode->i_sb, old_de.de_bh, 1);
1362 
1363 		// look for new name by reiserfs_find_entry
1364 		new_de.de_gen_number_bit_string = NULL;
1365 		retval =
1366 		    reiserfs_find_entry(new_dir, new_dentry->d_name.name,
1367 					new_dentry->d_name.len, &new_entry_path,
1368 					&new_de);
1369 		// reiserfs_add_entry should not return IO_ERROR, because it is called with essentially same parameters from
1370 		// reiserfs_add_entry above, and we'll catch any i/o errors before we get here.
1371 		if (retval != NAME_FOUND_INVISIBLE && retval != NAME_FOUND) {
1372 			pathrelse(&new_entry_path);
1373 			pathrelse(&old_entry_path);
1374 			journal_end(&th, old_dir->i_sb, jbegin_count);
1375 			reiserfs_write_unlock(old_dir->i_sb);
1376 			return -EIO;
1377 		}
1378 
1379 		copy_item_head(&new_entry_ih, get_ih(&new_entry_path));
1380 
1381 		reiserfs_prepare_for_journal(old_inode->i_sb, new_de.de_bh, 1);
1382 
1383 		if (S_ISDIR(old_inode->i_mode)) {
1384 			if ((retval =
1385 			     search_by_entry_key(new_dir->i_sb,
1386 						 &dot_dot_de.de_entry_key,
1387 						 &dot_dot_entry_path,
1388 						 &dot_dot_de)) != NAME_FOUND) {
1389 				pathrelse(&dot_dot_entry_path);
1390 				pathrelse(&new_entry_path);
1391 				pathrelse(&old_entry_path);
1392 				journal_end(&th, old_dir->i_sb, jbegin_count);
1393 				reiserfs_write_unlock(old_dir->i_sb);
1394 				return -EIO;
1395 			}
1396 			copy_item_head(&dot_dot_ih,
1397 				       get_ih(&dot_dot_entry_path));
1398 			// node containing ".." gets into transaction
1399 			reiserfs_prepare_for_journal(old_inode->i_sb,
1400 						     dot_dot_de.de_bh, 1);
1401 		}
1402 		/* we should check seals here, not do
1403 		   this stuff, yes? Then, having
1404 		   gathered everything into RAM we
1405 		   should lock the buffers, yes?  -Hans */
1406 		/* probably.  our rename needs to hold more
1407 		 ** than one path at once.  The seals would
1408 		 ** have to be written to deal with multi-path
1409 		 ** issues -chris
1410 		 */
1411 		/* sanity checking before doing the rename - avoid races many
1412 		 ** of the above checks could have scheduled.  We have to be
1413 		 ** sure our items haven't been shifted by another process.
1414 		 */
1415 		if (item_moved(&new_entry_ih, &new_entry_path) ||
1416 		    !entry_points_to_object(new_dentry->d_name.name,
1417 					    new_dentry->d_name.len,
1418 					    &new_de, new_dentry_inode) ||
1419 		    item_moved(&old_entry_ih, &old_entry_path) ||
1420 		    !entry_points_to_object(old_dentry->d_name.name,
1421 					    old_dentry->d_name.len,
1422 					    &old_de, old_inode)) {
1423 			reiserfs_restore_prepared_buffer(old_inode->i_sb,
1424 							 new_de.de_bh);
1425 			reiserfs_restore_prepared_buffer(old_inode->i_sb,
1426 							 old_de.de_bh);
1427 			if (S_ISDIR(old_inode_mode))
1428 				reiserfs_restore_prepared_buffer(old_inode->
1429 								 i_sb,
1430 								 dot_dot_de.
1431 								 de_bh);
1432 			continue;
1433 		}
1434 		if (S_ISDIR(old_inode_mode)) {
1435 			if (item_moved(&dot_dot_ih, &dot_dot_entry_path) ||
1436 			    !entry_points_to_object("..", 2, &dot_dot_de,
1437 						    old_dir)) {
1438 				reiserfs_restore_prepared_buffer(old_inode->
1439 								 i_sb,
1440 								 old_de.de_bh);
1441 				reiserfs_restore_prepared_buffer(old_inode->
1442 								 i_sb,
1443 								 new_de.de_bh);
1444 				reiserfs_restore_prepared_buffer(old_inode->
1445 								 i_sb,
1446 								 dot_dot_de.
1447 								 de_bh);
1448 				continue;
1449 			}
1450 		}
1451 
1452 		RFALSE(S_ISDIR(old_inode_mode) &&
1453 		       !buffer_journal_prepared(dot_dot_de.de_bh), "");
1454 
1455 		break;
1456 	}
1457 
1458 	/* ok, all the changes can be done in one fell swoop when we
1459 	   have claimed all the buffers needed. */
1460 
1461 	mark_de_visible(new_de.de_deh + new_de.de_entry_num);
1462 	set_ino_in_dir_entry(&new_de, INODE_PKEY(old_inode));
1463 	journal_mark_dirty(&th, old_dir->i_sb, new_de.de_bh);
1464 
1465 	mark_de_hidden(old_de.de_deh + old_de.de_entry_num);
1466 	journal_mark_dirty(&th, old_dir->i_sb, old_de.de_bh);
1467 	ctime = CURRENT_TIME_SEC;
1468 	old_dir->i_ctime = old_dir->i_mtime = ctime;
1469 	new_dir->i_ctime = new_dir->i_mtime = ctime;
1470 	/* thanks to Alex Adriaanse <alex_a@caltech.edu> for patch which adds ctime update of
1471 	   renamed object */
1472 	old_inode->i_ctime = ctime;
1473 
1474 	if (new_dentry_inode) {
1475 		// adjust link number of the victim
1476 		if (S_ISDIR(new_dentry_inode->i_mode)) {
1477 			new_dentry_inode->i_nlink = 0;
1478 		} else {
1479 			new_dentry_inode->i_nlink--;
1480 		}
1481 		new_dentry_inode->i_ctime = ctime;
1482 		savelink = new_dentry_inode->i_nlink;
1483 	}
1484 
1485 	if (S_ISDIR(old_inode_mode)) {
1486 		// adjust ".." of renamed directory
1487 		set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir));
1488 		journal_mark_dirty(&th, new_dir->i_sb, dot_dot_de.de_bh);
1489 
1490 		if (!new_dentry_inode)
1491 			/* there (in new_dir) was no directory, so it got new link
1492 			   (".."  of renamed directory) */
1493 			INC_DIR_INODE_NLINK(new_dir);
1494 
1495 		/* old directory lost one link - ".. " of renamed directory */
1496 		DEC_DIR_INODE_NLINK(old_dir);
1497 	}
1498 	// looks like in 2.3.99pre3 brelse is atomic. so we can use pathrelse
1499 	pathrelse(&new_entry_path);
1500 	pathrelse(&dot_dot_entry_path);
1501 
1502 	// FIXME: this reiserfs_cut_from_item's return value may screw up
1503 	// anybody, but it will panic if will not be able to find the
1504 	// entry. This needs one more clean up
1505 	if (reiserfs_cut_from_item
1506 	    (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL,
1507 	     0) < 0)
1508 		reiserfs_warning(old_dir->i_sb,
1509 				 "vs-7060: reiserfs_rename: couldn't not cut old name. Fsck later?");
1510 
1511 	old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;
1512 
1513 	reiserfs_update_sd(&th, old_dir);
1514 	reiserfs_update_sd(&th, new_dir);
1515 	reiserfs_update_sd(&th, old_inode);
1516 
1517 	if (new_dentry_inode) {
1518 		if (savelink == 0)
1519 			add_save_link(&th, new_dentry_inode,
1520 				      0 /* not truncate */ );
1521 		reiserfs_update_sd(&th, new_dentry_inode);
1522 	}
1523 
1524 	retval = journal_end(&th, old_dir->i_sb, jbegin_count);
1525 	reiserfs_write_unlock(old_dir->i_sb);
1526 	return retval;
1527 }
1528 
1529 /*
1530  * directories can handle most operations...
1531  */
1532 struct inode_operations reiserfs_dir_inode_operations = {
1533 	//&reiserfs_dir_operations,   /* default_file_ops */
1534 	.create = reiserfs_create,
1535 	.lookup = reiserfs_lookup,
1536 	.link = reiserfs_link,
1537 	.unlink = reiserfs_unlink,
1538 	.symlink = reiserfs_symlink,
1539 	.mkdir = reiserfs_mkdir,
1540 	.rmdir = reiserfs_rmdir,
1541 	.mknod = reiserfs_mknod,
1542 	.rename = reiserfs_rename,
1543 	.setattr = reiserfs_setattr,
1544 	.setxattr = reiserfs_setxattr,
1545 	.getxattr = reiserfs_getxattr,
1546 	.listxattr = reiserfs_listxattr,
1547 	.removexattr = reiserfs_removexattr,
1548 	.permission = reiserfs_permission,
1549 };
1550 
1551 /*
1552  * symlink operations.. same as page_symlink_inode_operations, with xattr
1553  * stuff added
1554  */
1555 struct inode_operations reiserfs_symlink_inode_operations = {
1556 	.readlink = generic_readlink,
1557 	.follow_link = page_follow_link_light,
1558 	.put_link = page_put_link,
1559 	.setattr = reiserfs_setattr,
1560 	.setxattr = reiserfs_setxattr,
1561 	.getxattr = reiserfs_getxattr,
1562 	.listxattr = reiserfs_listxattr,
1563 	.removexattr = reiserfs_removexattr,
1564 	.permission = reiserfs_permission,
1565 
1566 };
1567 
1568 /*
1569  * special file operations.. just xattr/acl stuff
1570  */
1571 struct inode_operations reiserfs_special_inode_operations = {
1572 	.setattr = reiserfs_setattr,
1573 	.setxattr = reiserfs_setxattr,
1574 	.getxattr = reiserfs_getxattr,
1575 	.listxattr = reiserfs_listxattr,
1576 	.removexattr = reiserfs_removexattr,
1577 	.permission = reiserfs_permission,
1578 
1579 };
1580