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