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