vserver 2.0 rc7
[linux-2.6.git] / fs / reiserfs / namei.c
index 92b4fca..c2f21c5 100644 (file)
@@ -355,7 +355,7 @@ static struct dentry * reiserfs_lookup (struct inode * dir, struct dentry * dent
 
        /* Propogate the priv_object flag so we know we're in the priv tree */
        if (is_reiserfs_priv_object (dir))
-           REISERFS_I(inode)->i_flags |= i_priv_object;
+           reiserfs_mark_inode_private (inode);
     }
     reiserfs_write_unlock(dir->i_sb);
     if ( retval == IO_ERROR ) {
@@ -578,6 +578,7 @@ static int new_inode_init(struct inode *inode, struct inode *dir, int mode) {
     } else {
         inode->i_gid = current->fsgid;
     }
+    inode->i_xid = vx_current_fsxid(inode->i_sb);
     DQUOT_INIT(inode);
     return 0 ;
 }
@@ -610,7 +611,7 @@ static int reiserfs_create (struct inode * dir, struct dentry *dentry, int mode,
         goto out_failed;
     }
 
-    retval = reiserfs_new_inode (&th, dir, mode, 0, 0/*i_size*/, dentry, inode);
+    retval = reiserfs_new_inode (&th, dir, mode, NULL, 0/*i_size*/, dentry, inode);
     if (retval)
         goto out_failed;
        
@@ -1257,7 +1258,6 @@ static int reiserfs_rename (struct inode * old_dir, struct dentry *old_dentry,
         return retval;
     }
 
-
     /* add new entry (or find the existing one) */
     retval = reiserfs_add_entry (&th, new_dir, new_dentry->d_name.name, new_dentry->d_name.len, 
                                 old_inode, 0);
@@ -1285,8 +1285,13 @@ static int reiserfs_rename (struct inode * old_dir, struct dentry *old_dentry,
 
     while (1) {
        // look for old name using corresponding entry key (found by reiserfs_find_entry)
-       if (search_by_entry_key (new_dir->i_sb, &old_de.de_entry_key, &old_entry_path, &old_de) != NAME_FOUND)
-           BUG ();
+       if ((retval = search_by_entry_key (new_dir->i_sb, &old_de.de_entry_key,
+                                          &old_entry_path, &old_de)) != NAME_FOUND) {
+           pathrelse(&old_entry_path);
+           journal_end(&th, old_dir->i_sb, jbegin_count);
+           reiserfs_write_unlock(old_dir->i_sb);
+           return -EIO;
+       }
 
        copy_item_head(&old_entry_ih, get_ih(&old_entry_path)) ;
 
@@ -1298,16 +1303,28 @@ static int reiserfs_rename (struct inode * old_dir, struct dentry *old_dentry,
                                      &new_entry_path, &new_de);
        // reiserfs_add_entry should not return IO_ERROR, because it is called with essentially same parameters from
         // reiserfs_add_entry above, and we'll catch any i/o errors before we get here.
-       if (retval != NAME_FOUND_INVISIBLE && retval != NAME_FOUND)
-           BUG ();
+       if (retval != NAME_FOUND_INVISIBLE && retval != NAME_FOUND) {
+           pathrelse(&new_entry_path);
+           pathrelse(&old_entry_path);
+           journal_end(&th, old_dir->i_sb, jbegin_count);
+           reiserfs_write_unlock(old_dir->i_sb);
+           return -EIO;
+       }
 
        copy_item_head(&new_entry_ih, get_ih(&new_entry_path)) ;
 
        reiserfs_prepare_for_journal(old_inode->i_sb, new_de.de_bh, 1) ;
 
        if (S_ISDIR(old_inode->i_mode)) {
-           if (search_by_entry_key (new_dir->i_sb, &dot_dot_de.de_entry_key, &dot_dot_entry_path, &dot_dot_de) != NAME_FOUND)
-               BUG ();
+           if ((retval = search_by_entry_key (new_dir->i_sb, &dot_dot_de.de_entry_key,
+                                              &dot_dot_entry_path, &dot_dot_de)) != NAME_FOUND) {
+               pathrelse(&dot_dot_entry_path);
+               pathrelse(&new_entry_path);
+               pathrelse(&old_entry_path);
+               journal_end(&th, old_dir->i_sb, jbegin_count);
+               reiserfs_write_unlock(old_dir->i_sb);
+               return -EIO;
+           }
            copy_item_head(&dot_dot_ih, get_ih(&dot_dot_entry_path)) ;
            // node containing ".." gets into transaction
            reiserfs_prepare_for_journal(old_inode->i_sb, dot_dot_de.de_bh, 1) ;