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