commit d824ea4a5ddcf672bff1ce816517604ed2cef631
Author: Yiannis Pericleous <[EMAIL PROTECTED]>
Date:   Fri Feb 9 14:33:27 2007 -0500

    Rename.

diff --git a/fs/unionfs/odf.c b/fs/unionfs/odf.c
index b1f07a0..c0e4c01 100644
--- a/fs/unionfs/odf.c
+++ b/fs/unionfs/odf.c
@@ -826,6 +826,55 @@ out:
 }
 
 /*
+ * Rename in odf, expects UnionFS dentries.
+ * If the new_dentry exists (either as a file or wh)
+ * it is removed using odf_remove (ie dirs are reclaimed)
+ */
+int odf_rename(struct dentry *old_dentry, struct dentry *new_dentry)
+{
+       struct dentry *old_dir, *new_dir;
+       struct dentry *old_odfdentry, *new_odfdentry;
+       int err = 0;
+
+       UNIONFS_D(old_dentry)->odf_info = odf_lookup(
+                               old_dentry->d_parent,
+                               old_dentry,
+                               0);
+       UNIONFS_D(new_dentry)->odf_info = odf_lookup(
+                               new_dentry->d_parent,
+                               new_dentry,
+                               0);
+
+       /* if new exists, remove it */
+       if (UNIONFS_D(new_dentry)->odf_info)
+               err = odf_remove(new_dentry, ODF_RMV_ANY);
+               
+       old_odfdentry = UNIONFS_D(old_dentry)->odf_info->dentry;
+       old_dir = old_odfdentry->d_parent;
+       new_dir = (UNIONFS_D(new_dentry->d_parent))->odf_info->dentry;
+       new_odfdentry = lookup_one_len(
+                               new_dentry->d_name.name,
+                               new_dir,
+                               new_dentry->d_name.len);
+       if (IS_ERR(new_odfdentry)) { 
+               err = PTR_ERR(new_odfdentry);
+               goto out;
+       }
+       
+       /* this should never happen */
+       BUG_ON(new_odfdentry->d_inode);
+       
+       lock_rename(old_dir, new_dir);
+       err = vfs_rename(old_dir->d_inode, 
+                       old_odfdentry, new_dir->d_inode, 
+                       new_odfdentry);
+       unlock_rename(old_dir, new_dir);
+       dput(new_odfdentry);
+
+out:
+       return err;
+}
+/*
  * Lookup an entry in the odf, and create it if necessary
  * Returns a an odf_dentry_info containing whiteout and
  * opaqueness information. Also handles hard links.
diff --git a/fs/unionfs/rename.c b/fs/unionfs/rename.c
index 730e96f..d9d082e 100644
--- a/fs/unionfs/rename.c
+++ b/fs/unionfs/rename.c
@@ -230,6 +230,7 @@ out:
 
 revert:
        /* Do revert here. */
+       /* FIXME: revert odf also? only if create_wh_fails? */
        local_err = unionfs_refresh_hidden_dentry(new_dentry, old_bstart);
        if (local_err) {
                printk(KERN_WARNING "Revert failed in rename: the new refresh "
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to