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