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