vfs: get_sb_single() - do not pass options twice
[safe/jmp/linux-2.6] / 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
925         inode = dentry->d_inode;
926
927         /* in this transaction we can be doing at max two balancings and update
928          * two stat datas, we change quotas of the owner of the directory and of
929          * the owner of the parent directory. The quota structure is possibly
930          * deleted only on iput => outside of this transaction */
931         jbegin_count =
932             JOURNAL_PER_BALANCE_CNT * 2 + 2 +
933             4 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);
934
935         reiserfs_write_lock(dir->i_sb);
936         retval = journal_begin(&th, dir->i_sb, jbegin_count);
937         if (retval)
938                 goto out_unlink;
939
940         de.de_gen_number_bit_string = NULL;
941         if ((retval =
942              reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,
943                                  &path, &de)) == NAME_NOT_FOUND) {
944                 retval = -ENOENT;
945                 goto end_unlink;
946         } else if (retval == IO_ERROR) {
947                 retval = -EIO;
948                 goto end_unlink;
949         }
950
951         reiserfs_update_inode_transaction(inode);
952         reiserfs_update_inode_transaction(dir);
953
954         if (de.de_objectid != inode->i_ino) {
955                 // FIXME: compare key of an object and a key found in the
956                 // entry
957                 retval = -EIO;
958                 goto end_unlink;
959         }
960
961         if (!inode->i_nlink) {
962                 reiserfs_warning(inode->i_sb, "reiserfs-7042",
963                                  "deleting nonexistent file (%lu), %d",
964                                  inode->i_ino, inode->i_nlink);
965                 inode->i_nlink = 1;
966         }
967
968         drop_nlink(inode);
969
970         /*
971          * we schedule before doing the add_save_link call, save the link
972          * count so we don't race
973          */
974         savelink = inode->i_nlink;
975
976         retval =
977             reiserfs_cut_from_item(&th, &path, &(de.de_entry_key), dir, NULL,
978                                    0);
979         if (retval < 0) {
980                 inc_nlink(inode);
981                 goto end_unlink;
982         }
983         inode->i_ctime = CURRENT_TIME_SEC;
984         reiserfs_update_sd(&th, inode);
985
986         dir->i_size -= (de.de_entrylen + DEH_SIZE);
987         dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
988         reiserfs_update_sd(&th, dir);
989
990         if (!savelink)
991                 /* prevent file from getting lost */
992                 add_save_link(&th, inode, 0 /* not truncate */ );
993
994         retval = journal_end(&th, dir->i_sb, jbegin_count);
995         reiserfs_check_path(&path);
996         reiserfs_write_unlock(dir->i_sb);
997         return retval;
998
999       end_unlink:
1000         pathrelse(&path);
1001         err = journal_end(&th, dir->i_sb, jbegin_count);
1002         reiserfs_check_path(&path);
1003         if (err)
1004                 retval = err;
1005       out_unlink:
1006         reiserfs_write_unlock(dir->i_sb);
1007         return retval;
1008 }
1009
1010 static int reiserfs_symlink(struct inode *parent_dir,
1011                             struct dentry *dentry, const char *symname)
1012 {
1013         int retval;
1014         struct inode *inode;
1015         char *name;
1016         int item_len;
1017         struct reiserfs_transaction_handle th;
1018         struct reiserfs_security_handle security;
1019         int mode = S_IFLNK | S_IRWXUGO;
1020         /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
1021         int jbegin_count =
1022             JOURNAL_PER_BALANCE_CNT * 3 +
1023             2 * (REISERFS_QUOTA_INIT_BLOCKS(parent_dir->i_sb) +
1024                  REISERFS_QUOTA_TRANS_BLOCKS(parent_dir->i_sb));
1025
1026         if (!(inode = new_inode(parent_dir->i_sb))) {
1027                 return -ENOMEM;
1028         }
1029         new_inode_init(inode, parent_dir, mode);
1030
1031         retval = reiserfs_security_init(parent_dir, inode, &security);
1032         if (retval < 0) {
1033                 drop_new_inode(inode);
1034                 return retval;
1035         }
1036         jbegin_count += retval;
1037
1038         reiserfs_write_lock(parent_dir->i_sb);
1039         item_len = ROUND_UP(strlen(symname));
1040         if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) {
1041                 retval = -ENAMETOOLONG;
1042                 drop_new_inode(inode);
1043                 goto out_failed;
1044         }
1045
1046         name = kmalloc(item_len, GFP_NOFS);
1047         if (!name) {
1048                 drop_new_inode(inode);
1049                 retval = -ENOMEM;
1050                 goto out_failed;
1051         }
1052         memcpy(name, symname, strlen(symname));
1053         padd_item(name, item_len, strlen(symname));
1054
1055         retval = journal_begin(&th, parent_dir->i_sb, jbegin_count);
1056         if (retval) {
1057                 drop_new_inode(inode);
1058                 kfree(name);
1059                 goto out_failed;
1060         }
1061
1062         retval =
1063             reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname),
1064                                dentry, inode, &security);
1065         kfree(name);
1066         if (retval) {           /* reiserfs_new_inode iputs for us */
1067                 goto out_failed;
1068         }
1069
1070         reiserfs_update_inode_transaction(inode);
1071         reiserfs_update_inode_transaction(parent_dir);
1072
1073         inode->i_op = &reiserfs_symlink_inode_operations;
1074         inode->i_mapping->a_ops = &reiserfs_address_space_operations;
1075
1076         // must be sure this inode is written with this transaction
1077         //
1078         //reiserfs_update_sd (&th, inode, READ_BLOCKS);
1079
1080         retval = reiserfs_add_entry(&th, parent_dir, dentry->d_name.name,
1081                                     dentry->d_name.len, inode, 1 /*visible */ );
1082         if (retval) {
1083                 int err;
1084                 inode->i_nlink--;
1085                 reiserfs_update_sd(&th, inode);
1086                 err = journal_end(&th, parent_dir->i_sb, jbegin_count);
1087                 if (err)
1088                         retval = err;
1089                 unlock_new_inode(inode);
1090                 iput(inode);
1091                 goto out_failed;
1092         }
1093
1094         d_instantiate(dentry, inode);
1095         unlock_new_inode(inode);
1096         retval = journal_end(&th, parent_dir->i_sb, jbegin_count);
1097       out_failed:
1098         reiserfs_write_unlock(parent_dir->i_sb);
1099         return retval;
1100 }
1101
1102 static int reiserfs_link(struct dentry *old_dentry, struct inode *dir,
1103                          struct dentry *dentry)
1104 {
1105         int retval;
1106         struct inode *inode = old_dentry->d_inode;
1107         struct reiserfs_transaction_handle th;
1108         /* We need blocks for transaction + update of quotas for the owners of the directory */
1109         int jbegin_count =
1110             JOURNAL_PER_BALANCE_CNT * 3 +
1111             2 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);
1112
1113         reiserfs_write_lock(dir->i_sb);
1114         if (inode->i_nlink >= REISERFS_LINK_MAX) {
1115                 //FIXME: sd_nlink is 32 bit for new files
1116                 reiserfs_write_unlock(dir->i_sb);
1117                 return -EMLINK;
1118         }
1119         if (inode->i_nlink == 0) {
1120                 reiserfs_write_unlock(dir->i_sb);
1121                 return -ENOENT;
1122         }
1123
1124         /* inc before scheduling so reiserfs_unlink knows we are here */
1125         inc_nlink(inode);
1126
1127         retval = journal_begin(&th, dir->i_sb, jbegin_count);
1128         if (retval) {
1129                 inode->i_nlink--;
1130                 reiserfs_write_unlock(dir->i_sb);
1131                 return retval;
1132         }
1133
1134         /* create new entry */
1135         retval =
1136             reiserfs_add_entry(&th, dir, dentry->d_name.name,
1137                                dentry->d_name.len, inode, 1 /*visible */ );
1138
1139         reiserfs_update_inode_transaction(inode);
1140         reiserfs_update_inode_transaction(dir);
1141
1142         if (retval) {
1143                 int err;
1144                 inode->i_nlink--;
1145                 err = journal_end(&th, dir->i_sb, jbegin_count);
1146                 reiserfs_write_unlock(dir->i_sb);
1147                 return err ? err : retval;
1148         }
1149
1150         inode->i_ctime = CURRENT_TIME_SEC;
1151         reiserfs_update_sd(&th, inode);
1152
1153         atomic_inc(&inode->i_count);
1154         d_instantiate(dentry, inode);
1155         retval = journal_end(&th, dir->i_sb, jbegin_count);
1156         reiserfs_write_unlock(dir->i_sb);
1157         return retval;
1158 }
1159
1160 /* de contains information pointing to an entry which */
1161 static int de_still_valid(const char *name, int len,
1162                           struct reiserfs_dir_entry *de)
1163 {
1164         struct reiserfs_dir_entry tmp = *de;
1165
1166         // recalculate pointer to name and name length
1167         set_de_name_and_namelen(&tmp);
1168         // FIXME: could check more
1169         if (tmp.de_namelen != len || memcmp(name, de->de_name, len))
1170                 return 0;
1171         return 1;
1172 }
1173
1174 static int entry_points_to_object(const char *name, int len,
1175                                   struct reiserfs_dir_entry *de,
1176                                   struct inode *inode)
1177 {
1178         if (!de_still_valid(name, len, de))
1179                 return 0;
1180
1181         if (inode) {
1182                 if (!de_visible(de->de_deh + de->de_entry_num))
1183                         reiserfs_panic(inode->i_sb, "vs-7042",
1184                                        "entry must be visible");
1185                 return (de->de_objectid == inode->i_ino) ? 1 : 0;
1186         }
1187
1188         /* this must be added hidden entry */
1189         if (de_visible(de->de_deh + de->de_entry_num))
1190                 reiserfs_panic(NULL, "vs-7043", "entry must be visible");
1191
1192         return 1;
1193 }
1194
1195 /* sets key of objectid the entry has to point to */
1196 static void set_ino_in_dir_entry(struct reiserfs_dir_entry *de,
1197                                  struct reiserfs_key *key)
1198 {
1199         /* JDM These operations are endian safe - both are le */
1200         de->de_deh[de->de_entry_num].deh_dir_id = key->k_dir_id;
1201         de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid;
1202 }
1203
1204 /*
1205  * process, that is going to call fix_nodes/do_balance must hold only
1206  * one path. If it holds 2 or more, it can get into endless waiting in
1207  * get_empty_nodes or its clones
1208  */
1209 static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry,
1210                            struct inode *new_dir, struct dentry *new_dentry)
1211 {
1212         int retval;
1213         INITIALIZE_PATH(old_entry_path);
1214         INITIALIZE_PATH(new_entry_path);
1215         INITIALIZE_PATH(dot_dot_entry_path);
1216         struct item_head new_entry_ih, old_entry_ih, dot_dot_ih;
1217         struct reiserfs_dir_entry old_de, new_de, dot_dot_de;
1218         struct inode *old_inode, *new_dentry_inode;
1219         struct reiserfs_transaction_handle th;
1220         int jbegin_count;
1221         umode_t old_inode_mode;
1222         unsigned long savelink = 1;
1223         struct timespec ctime;
1224
1225         /* three balancings: (1) old name removal, (2) new name insertion
1226            and (3) maybe "save" link insertion
1227            stat data updates: (1) old directory,
1228            (2) new directory and (3) maybe old object stat data (when it is
1229            directory) and (4) maybe stat data of object to which new entry
1230            pointed initially and (5) maybe block containing ".." of
1231            renamed directory
1232            quota updates: two parent directories */
1233         jbegin_count =
1234             JOURNAL_PER_BALANCE_CNT * 3 + 5 +
1235             4 * REISERFS_QUOTA_TRANS_BLOCKS(old_dir->i_sb);
1236
1237         old_inode = old_dentry->d_inode;
1238         new_dentry_inode = new_dentry->d_inode;
1239
1240         // make sure, that oldname still exists and points to an object we
1241         // are going to rename
1242         old_de.de_gen_number_bit_string = NULL;
1243         reiserfs_write_lock(old_dir->i_sb);
1244         retval =
1245             reiserfs_find_entry(old_dir, old_dentry->d_name.name,
1246                                 old_dentry->d_name.len, &old_entry_path,
1247                                 &old_de);
1248         pathrelse(&old_entry_path);
1249         if (retval == IO_ERROR) {
1250                 reiserfs_write_unlock(old_dir->i_sb);
1251                 return -EIO;
1252         }
1253
1254         if (retval != NAME_FOUND || old_de.de_objectid != old_inode->i_ino) {
1255                 reiserfs_write_unlock(old_dir->i_sb);
1256                 return -ENOENT;
1257         }
1258
1259         old_inode_mode = old_inode->i_mode;
1260         if (S_ISDIR(old_inode_mode)) {
1261                 // make sure, that directory being renamed has correct ".."
1262                 // and that its new parent directory has not too many links
1263                 // already
1264
1265                 if (new_dentry_inode) {
1266                         if (!reiserfs_empty_dir(new_dentry_inode)) {
1267                                 reiserfs_write_unlock(old_dir->i_sb);
1268                                 return -ENOTEMPTY;
1269                         }
1270                 }
1271
1272                 /* directory is renamed, its parent directory will be changed,
1273                  ** so find ".." entry
1274                  */
1275                 dot_dot_de.de_gen_number_bit_string = NULL;
1276                 retval =
1277                     reiserfs_find_entry(old_inode, "..", 2, &dot_dot_entry_path,
1278                                         &dot_dot_de);
1279                 pathrelse(&dot_dot_entry_path);
1280                 if (retval != NAME_FOUND) {
1281                         reiserfs_write_unlock(old_dir->i_sb);
1282                         return -EIO;
1283                 }
1284
1285                 /* inode number of .. must equal old_dir->i_ino */
1286                 if (dot_dot_de.de_objectid != old_dir->i_ino) {
1287                         reiserfs_write_unlock(old_dir->i_sb);
1288                         return -EIO;
1289                 }
1290         }
1291
1292         retval = journal_begin(&th, old_dir->i_sb, jbegin_count);
1293         if (retval) {
1294                 reiserfs_write_unlock(old_dir->i_sb);
1295                 return retval;
1296         }
1297
1298         /* add new entry (or find the existing one) */
1299         retval =
1300             reiserfs_add_entry(&th, new_dir, new_dentry->d_name.name,
1301                                new_dentry->d_name.len, old_inode, 0);
1302         if (retval == -EEXIST) {
1303                 if (!new_dentry_inode) {
1304                         reiserfs_panic(old_dir->i_sb, "vs-7050",
1305                                        "new entry is found, new inode == 0");
1306                 }
1307         } else if (retval) {
1308                 int err = journal_end(&th, old_dir->i_sb, jbegin_count);
1309                 reiserfs_write_unlock(old_dir->i_sb);
1310                 return err ? err : retval;
1311         }
1312
1313         reiserfs_update_inode_transaction(old_dir);
1314         reiserfs_update_inode_transaction(new_dir);
1315
1316         /* this makes it so an fsync on an open fd for the old name will
1317          ** commit the rename operation
1318          */
1319         reiserfs_update_inode_transaction(old_inode);
1320
1321         if (new_dentry_inode)
1322                 reiserfs_update_inode_transaction(new_dentry_inode);
1323
1324         while (1) {
1325                 // look for old name using corresponding entry key (found by reiserfs_find_entry)
1326                 if ((retval =
1327                      search_by_entry_key(new_dir->i_sb, &old_de.de_entry_key,
1328                                          &old_entry_path,
1329                                          &old_de)) != NAME_FOUND) {
1330                         pathrelse(&old_entry_path);
1331                         journal_end(&th, old_dir->i_sb, jbegin_count);
1332                         reiserfs_write_unlock(old_dir->i_sb);
1333                         return -EIO;
1334                 }
1335
1336                 copy_item_head(&old_entry_ih, get_ih(&old_entry_path));
1337
1338                 reiserfs_prepare_for_journal(old_inode->i_sb, old_de.de_bh, 1);
1339
1340                 // look for new name by reiserfs_find_entry
1341                 new_de.de_gen_number_bit_string = NULL;
1342                 retval =
1343                     reiserfs_find_entry(new_dir, new_dentry->d_name.name,
1344                                         new_dentry->d_name.len, &new_entry_path,
1345                                         &new_de);
1346                 // reiserfs_add_entry should not return IO_ERROR, because it is called with essentially same parameters from
1347                 // reiserfs_add_entry above, and we'll catch any i/o errors before we get here.
1348                 if (retval != NAME_FOUND_INVISIBLE && retval != NAME_FOUND) {
1349                         pathrelse(&new_entry_path);
1350                         pathrelse(&old_entry_path);
1351                         journal_end(&th, old_dir->i_sb, jbegin_count);
1352                         reiserfs_write_unlock(old_dir->i_sb);
1353                         return -EIO;
1354                 }
1355
1356                 copy_item_head(&new_entry_ih, get_ih(&new_entry_path));
1357
1358                 reiserfs_prepare_for_journal(old_inode->i_sb, new_de.de_bh, 1);
1359
1360                 if (S_ISDIR(old_inode->i_mode)) {
1361                         if ((retval =
1362                              search_by_entry_key(new_dir->i_sb,
1363                                                  &dot_dot_de.de_entry_key,
1364                                                  &dot_dot_entry_path,
1365                                                  &dot_dot_de)) != NAME_FOUND) {
1366                                 pathrelse(&dot_dot_entry_path);
1367                                 pathrelse(&new_entry_path);
1368                                 pathrelse(&old_entry_path);
1369                                 journal_end(&th, old_dir->i_sb, jbegin_count);
1370                                 reiserfs_write_unlock(old_dir->i_sb);
1371                                 return -EIO;
1372                         }
1373                         copy_item_head(&dot_dot_ih,
1374                                        get_ih(&dot_dot_entry_path));
1375                         // node containing ".." gets into transaction
1376                         reiserfs_prepare_for_journal(old_inode->i_sb,
1377                                                      dot_dot_de.de_bh, 1);
1378                 }
1379                 /* we should check seals here, not do
1380                    this stuff, yes? Then, having
1381                    gathered everything into RAM we
1382                    should lock the buffers, yes?  -Hans */
1383                 /* probably.  our rename needs to hold more
1384                  ** than one path at once.  The seals would
1385                  ** have to be written to deal with multi-path
1386                  ** issues -chris
1387                  */
1388                 /* sanity checking before doing the rename - avoid races many
1389                  ** of the above checks could have scheduled.  We have to be
1390                  ** sure our items haven't been shifted by another process.
1391                  */
1392                 if (item_moved(&new_entry_ih, &new_entry_path) ||
1393                     !entry_points_to_object(new_dentry->d_name.name,
1394                                             new_dentry->d_name.len,
1395                                             &new_de, new_dentry_inode) ||
1396                     item_moved(&old_entry_ih, &old_entry_path) ||
1397                     !entry_points_to_object(old_dentry->d_name.name,
1398                                             old_dentry->d_name.len,
1399                                             &old_de, old_inode)) {
1400                         reiserfs_restore_prepared_buffer(old_inode->i_sb,
1401                                                          new_de.de_bh);
1402                         reiserfs_restore_prepared_buffer(old_inode->i_sb,
1403                                                          old_de.de_bh);
1404                         if (S_ISDIR(old_inode_mode))
1405                                 reiserfs_restore_prepared_buffer(old_inode->
1406                                                                  i_sb,
1407                                                                  dot_dot_de.
1408                                                                  de_bh);
1409                         continue;
1410                 }
1411                 if (S_ISDIR(old_inode_mode)) {
1412                         if (item_moved(&dot_dot_ih, &dot_dot_entry_path) ||
1413                             !entry_points_to_object("..", 2, &dot_dot_de,
1414                                                     old_dir)) {
1415                                 reiserfs_restore_prepared_buffer(old_inode->
1416                                                                  i_sb,
1417                                                                  old_de.de_bh);
1418                                 reiserfs_restore_prepared_buffer(old_inode->
1419                                                                  i_sb,
1420                                                                  new_de.de_bh);
1421                                 reiserfs_restore_prepared_buffer(old_inode->
1422                                                                  i_sb,
1423                                                                  dot_dot_de.
1424                                                                  de_bh);
1425                                 continue;
1426                         }
1427                 }
1428
1429                 RFALSE(S_ISDIR(old_inode_mode) &&
1430                        !buffer_journal_prepared(dot_dot_de.de_bh), "");
1431
1432                 break;
1433         }
1434
1435         /* ok, all the changes can be done in one fell swoop when we
1436            have claimed all the buffers needed. */
1437
1438         mark_de_visible(new_de.de_deh + new_de.de_entry_num);
1439         set_ino_in_dir_entry(&new_de, INODE_PKEY(old_inode));
1440         journal_mark_dirty(&th, old_dir->i_sb, new_de.de_bh);
1441
1442         mark_de_hidden(old_de.de_deh + old_de.de_entry_num);
1443         journal_mark_dirty(&th, old_dir->i_sb, old_de.de_bh);
1444         ctime = CURRENT_TIME_SEC;
1445         old_dir->i_ctime = old_dir->i_mtime = ctime;
1446         new_dir->i_ctime = new_dir->i_mtime = ctime;
1447         /* thanks to Alex Adriaanse <alex_a@caltech.edu> for patch which adds ctime update of
1448            renamed object */
1449         old_inode->i_ctime = ctime;
1450
1451         if (new_dentry_inode) {
1452                 // adjust link number of the victim
1453                 if (S_ISDIR(new_dentry_inode->i_mode)) {
1454                         clear_nlink(new_dentry_inode);
1455                 } else {
1456                         drop_nlink(new_dentry_inode);
1457                 }
1458                 new_dentry_inode->i_ctime = ctime;
1459                 savelink = new_dentry_inode->i_nlink;
1460         }
1461
1462         if (S_ISDIR(old_inode_mode)) {
1463                 /* adjust ".." of renamed directory */
1464                 set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir));
1465                 journal_mark_dirty(&th, new_dir->i_sb, dot_dot_de.de_bh);
1466
1467                 if (!new_dentry_inode)
1468                         /* there (in new_dir) was no directory, so it got new link
1469                            (".."  of renamed directory) */
1470                         INC_DIR_INODE_NLINK(new_dir);
1471
1472                 /* old directory lost one link - ".. " of renamed directory */
1473                 DEC_DIR_INODE_NLINK(old_dir);
1474         }
1475         // looks like in 2.3.99pre3 brelse is atomic. so we can use pathrelse
1476         pathrelse(&new_entry_path);
1477         pathrelse(&dot_dot_entry_path);
1478
1479         // FIXME: this reiserfs_cut_from_item's return value may screw up
1480         // anybody, but it will panic if will not be able to find the
1481         // entry. This needs one more clean up
1482         if (reiserfs_cut_from_item
1483             (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL,
1484              0) < 0)
1485                 reiserfs_error(old_dir->i_sb, "vs-7060",
1486                                "couldn't not cut old name. Fsck later?");
1487
1488         old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;
1489
1490         reiserfs_update_sd(&th, old_dir);
1491         reiserfs_update_sd(&th, new_dir);
1492         reiserfs_update_sd(&th, old_inode);
1493
1494         if (new_dentry_inode) {
1495                 if (savelink == 0)
1496                         add_save_link(&th, new_dentry_inode,
1497                                       0 /* not truncate */ );
1498                 reiserfs_update_sd(&th, new_dentry_inode);
1499         }
1500
1501         retval = journal_end(&th, old_dir->i_sb, jbegin_count);
1502         reiserfs_write_unlock(old_dir->i_sb);
1503         return retval;
1504 }
1505
1506 /*
1507  * directories can handle most operations...
1508  */
1509 const struct inode_operations reiserfs_dir_inode_operations = {
1510         //&reiserfs_dir_operations,   /* default_file_ops */
1511         .create = reiserfs_create,
1512         .lookup = reiserfs_lookup,
1513         .link = reiserfs_link,
1514         .unlink = reiserfs_unlink,
1515         .symlink = reiserfs_symlink,
1516         .mkdir = reiserfs_mkdir,
1517         .rmdir = reiserfs_rmdir,
1518         .mknod = reiserfs_mknod,
1519         .rename = reiserfs_rename,
1520         .setattr = reiserfs_setattr,
1521         .setxattr = reiserfs_setxattr,
1522         .getxattr = reiserfs_getxattr,
1523         .listxattr = reiserfs_listxattr,
1524         .removexattr = reiserfs_removexattr,
1525         .permission = reiserfs_permission,
1526 };
1527
1528 /*
1529  * symlink operations.. same as page_symlink_inode_operations, with xattr
1530  * stuff added
1531  */
1532 const struct inode_operations reiserfs_symlink_inode_operations = {
1533         .readlink = generic_readlink,
1534         .follow_link = page_follow_link_light,
1535         .put_link = page_put_link,
1536         .setattr = reiserfs_setattr,
1537         .setxattr = reiserfs_setxattr,
1538         .getxattr = reiserfs_getxattr,
1539         .listxattr = reiserfs_listxattr,
1540         .removexattr = reiserfs_removexattr,
1541         .permission = reiserfs_permission,
1542
1543 };
1544
1545 /*
1546  * special file operations.. just xattr/acl stuff
1547  */
1548 const struct inode_operations reiserfs_special_inode_operations = {
1549         .setattr = reiserfs_setattr,
1550         .setxattr = reiserfs_setxattr,
1551         .getxattr = reiserfs_getxattr,
1552         .listxattr = reiserfs_listxattr,
1553         .removexattr = reiserfs_removexattr,
1554         .permission = reiserfs_permission,
1555
1556 };