head	1.1;
access;
symbols
	LKML-branch:1.1.0.2;
locks; strict;
comment	@# @;


1.1
date	2006.10.13.09.40.40;	author jsipek;	state dead;
branches
	1.1.2.1;
next	;

1.1.2.1
date	2006.10.13.09.40.40;	author jsipek;	state Exp;
branches;
next	1.1.2.2;

1.1.2.2
date	2006.10.17.05.12.40;	author jsipek;	state Exp;
branches;
next	1.1.2.3;

1.1.2.3
date	2006.10.17.22.27.42;	author jsipek;	state dead;
branches;
next	;


desc
@@


1.1
log
@file stackfs-unionfs was initially added on branch LKML-branch.
@
text
@@


1.1.2.1
log
@Some generic bits for stackfs
@
text
@a0 182
diff -r 6d04fe0f7bed fs/unionfs/union.h
--- a/fs/unionfs/union.h	Fri Oct 13 05:25:06 2006 -0400
+++ b/fs/unionfs/union.h	Fri Oct 13 05:25:52 2006 -0400
@@@@ -41,6 +41,7 @@@@
 #include <linux/vmalloc.h>
 #include <linux/writeback.h>
 #include <linux/xattr.h>
+#include <linux/stack_fs.h>
 
 #include <linux/union_fs.h>
 /* the file system name */
@@@@ -339,12 +340,16 @@@@ static inline int d_deleted(struct dentr
 }
 
 /* returns the sum of the n_link values of all the underlying inodes of the passed inode */
-static inline int get_nlinks(struct inode *inode)
+static inline int unionfs_get_nlinks(struct inode *inode)
 {
 	int sum_nlinks = 0;
 	int dirs = 0;
 	int bindex;
 	struct inode *hidden_inode;
+
+	/* don't bother to do all the work since we're unlinked */
+	if (inode->i_nlink == 0)
+		return 0;
 
 	if (!S_ISDIR(inode->i_mode))
 		return itohi(inode)->i_nlink;
@@@@ -371,48 +376,11 @@@@ static inline int get_nlinks(struct inod
 	return sum_nlinks + 2;
 }
 
-static inline void fist_copy_attr_atime(struct inode *dest,
-					const struct inode *src)
-{
-	dest->i_atime = src->i_atime;
-}
-
-static inline void fist_copy_attr_times(struct inode *dest,
-					const struct inode *src)
-{
-	dest->i_atime = src->i_atime;
-	dest->i_mtime = src->i_mtime;
-	dest->i_ctime = src->i_ctime;
-}
-
-static inline void fist_copy_attr_timesizes(struct inode *dest,
-					    const struct inode *src)
-{
-	dest->i_atime = src->i_atime;
-	dest->i_mtime = src->i_mtime;
-	dest->i_ctime = src->i_ctime;
-	dest->i_size = src->i_size;
-	dest->i_blocks = src->i_blocks;
-}
-
-static inline void fist_copy_attr_all(struct inode *dest,
-				      const struct inode *src)
-{
-	dest->i_mode = src->i_mode;
-	/* we do not need to copy if the file is a deleted file */
-	if (dest->i_nlink > 0)
-		dest->i_nlink = get_nlinks(dest);
-	dest->i_uid = src->i_uid;
-	dest->i_gid = src->i_gid;
-	dest->i_rdev = src->i_rdev;
-	dest->i_atime = src->i_atime;
-	dest->i_mtime = src->i_mtime;
-	dest->i_ctime = src->i_ctime;
-	dest->i_blkbits = src->i_blkbits;
-	dest->i_size = src->i_size;
-	dest->i_blocks = src->i_blocks;
-	dest->i_flags = src->i_flags;
-}
+#define fist_copy_attr_atime(d,s) stackfs_copy_attr_atime((d), (s))
+#define fist_copy_attr_times(d,s) stackfs_copy_attr_times((d), (s))
+#define fist_copy_attr_timesizes(d,s) \
+				  stackfs_copy_attr_timesizes((d), (s))
+#define fist_copy_attr_all(d,s)	  __stackfs_copy_attr_all((d), (s), &unionfs_get_nlinks)
 
 struct dentry *unionfs_lookup_backend(struct dentry *dentry, struct nameidata *nd, int lookupmode);
 int is_stale_inode(struct inode *inode);
diff -r 6d04fe0f7bed fs/unionfs/unlink.c
--- a/fs/unionfs/unlink.c	Fri Oct 13 05:25:06 2006 -0400
+++ b/fs/unionfs/unlink.c	Fri Oct 13 05:25:10 2006 -0400
@@@@ -111,7 +111,7 @@@@ static int unionfs_rmdir_first(struct in
 
 	fist_copy_attr_times(dir, hidden_dir_dentry->d_inode);
 	/* propagate number of hard-links */
-	dentry->d_inode->i_nlink = get_nlinks(dentry->d_inode);
+	dentry->d_inode->i_nlink = unionfs_get_nlinks(dentry->d_inode);
 
 out:
 	if (hidden_dir_dentry) {
diff -r 6d04fe0f7bed fs/unionfs/inode.c
--- a/fs/unionfs/inode.c	Fri Oct 13 05:25:06 2006 -0400
+++ b/fs/unionfs/inode.c	Fri Oct 13 05:26:41 2006 -0400
@@@@ -107,7 +107,7 @@@@ static int unionfs_create(struct inode *
 			fist_copy_attr_timesizes(parent,
 						 new_hidden_dentry->d_parent->
 						 d_inode);
-			parent->i_nlink = get_nlinks(parent);
+			parent->i_nlink = unionfs_get_nlinks(parent);
 		}
 
 		unlock_rename(hidden_dir_dentry, hidden_dir_dentry);
@@@@ -177,7 +177,7 @@@@ static int unionfs_create(struct inode *
 							 hidden_parent_dentry->
 							 d_inode);
 				/* update number of links on parent directory */
-				parent->i_nlink = get_nlinks(parent);
+				parent->i_nlink = unionfs_get_nlinks(parent);
 			}
 			unlock_dir(hidden_parent_dentry);
 			break;
@@@@ -248,7 +248,7 @@@@ static int unionfs_link(struct dentry *o
 				       whiteout_dentry);
 		}
 		fist_copy_attr_times(dir, hidden_dir_dentry->d_inode);
-		dir->i_nlink = get_nlinks(dir);
+		dir->i_nlink = unionfs_get_nlinks(dir);
 		unlock_dir(hidden_dir_dentry);
 		hidden_dir_dentry = NULL;
 		dput(whiteout_dentry);
@@@@ -314,7 +314,7 @@@@ check_link:
 	d_instantiate(new_dentry, new_dentry->d_inode);
 	fist_copy_attr_all(dir, hidden_new_dentry->d_parent->d_inode);
 	/* propagate number of hard-links */
-	old_dentry->d_inode->i_nlink = get_nlinks(old_dentry->d_inode);
+	old_dentry->d_inode->i_nlink = unionfs_get_nlinks(old_dentry->d_inode);
 
 out:
 	if (!new_dentry->d_inode)
@@@@ -377,7 +377,7 @@@@ static int unionfs_symlink(struct inode 
 
 		fist_copy_attr_times(dir, hidden_dir_dentry->d_inode);
 		/* propagate number of hard-links */
-		dir->i_nlink = get_nlinks(dir);
+		dir->i_nlink = unionfs_get_nlinks(dir);
 
 		unlock_dir(hidden_dir_dentry);
 
@@@@ -432,7 +432,7 @@@@ static int unionfs_symlink(struct inode 
 							 hidden_dir_dentry->
 							 d_inode);
 				/* update number of links on parent directory */
-				dir->i_nlink = get_nlinks(dir);
+				dir->i_nlink = unionfs_get_nlinks(dir);
 			}
 			break;
 		}
@@@@ -550,7 +550,7 @@@@ static int unionfs_mkdir(struct inode *p
 					hidden_parent_dentry->d_inode);
 
 			/* update number of links on parent directory */
-			parent->i_nlink = get_nlinks(parent);
+			parent->i_nlink = unionfs_get_nlinks(parent);
 		}
 
 		err = make_dir_opaque(dentry, dbstart(dentry));
@@@@ -663,7 +663,7 @@@@ static int unionfs_mknod(struct inode *d
 						 hidden_parent_dentry->
 						 d_inode);
 			/* update number of links on parent directory */
-			dir->i_nlink = get_nlinks(dir);
+			dir->i_nlink = unionfs_get_nlinks(dir);
 		}
 		unlock_dir(hidden_parent_dentry);
 
diff -r 6d04fe0f7bed fs/unionfs/rename.c
--- a/fs/unionfs/rename.c	Fri Oct 13 05:25:06 2006 -0400
+++ b/fs/unionfs/rename.c	Fri Oct 13 05:27:02 2006 -0400
@@@@ -196,7 +196,7 @@@@ static int do_unionfs_rename(struct inod
 				     unlink_dir_dentry->d_inode);
 		/* propagate number of hard-links */
 		new_dentry->d_parent->d_inode->i_nlink =
-		    get_nlinks(new_dentry->d_parent->d_inode);
+		    unionfs_get_nlinks(new_dentry->d_parent->d_inode);
 
 		unlock_dir(unlink_dir_dentry);
 		if (!err) {
@


1.1.2.2
log
@fsstack updates
@
text
@d1 3
a3 128
diff -r b1e299d66306 fs/unionfs/inode.c
--- a/fs/unionfs/inode.c	Mon Oct 16 22:29:52 2006 -0400
+++ b/fs/unionfs/inode.c	Mon Oct 16 22:50:34 2006 -0400
@@@@ -104,10 +104,13 @@@@ static int unionfs_create(struct inode *
 				       new_hidden_dentry);
 		}
 		if (!err) {
-			fist_copy_attr_timesizes(parent,
+			fist_copy_attr_times(parent,
 						 new_hidden_dentry->d_parent->
 						 d_inode);
-			parent->i_nlink = get_nlinks(parent);
+			fist_copy_inode_size(parent,
+						 new_hidden_dentry->d_parent->
+						 d_inode);
+			parent->i_nlink = unionfs_get_nlinks(parent);
 		}
 
 		unlock_rename(hidden_dir_dentry, hidden_dir_dentry);
@@@@ -173,11 +176,14 @@@@ static int unionfs_create(struct inode *
 		} else {
 			err = unionfs_interpose(dentry, parent->i_sb, 0);
 			if (!err) {
-				fist_copy_attr_timesizes(parent,
+				fist_copy_attr_times(parent,
+							 hidden_parent_dentry->
+							 d_inode);
+				fist_copy_inode_size(parent,
 							 hidden_parent_dentry->
 							 d_inode);
 				/* update number of links on parent directory */
-				parent->i_nlink = get_nlinks(parent);
+				parent->i_nlink = unionfs_get_nlinks(parent);
 			}
 			unlock_dir(hidden_parent_dentry);
 			break;
@@@@ -248,7 +254,7 @@@@ static int unionfs_link(struct dentry *o
 				       whiteout_dentry);
 		}
 		fist_copy_attr_times(dir, hidden_dir_dentry->d_inode);
-		dir->i_nlink = get_nlinks(dir);
+		dir->i_nlink = unionfs_get_nlinks(dir);
 		unlock_dir(hidden_dir_dentry);
 		hidden_dir_dentry = NULL;
 		dput(whiteout_dentry);
@@@@ -314,7 +320,7 @@@@ check_link:
 	d_instantiate(new_dentry, new_dentry->d_inode);
 	fist_copy_attr_all(dir, hidden_new_dentry->d_parent->d_inode);
 	/* propagate number of hard-links */
-	old_dentry->d_inode->i_nlink = get_nlinks(old_dentry->d_inode);
+	old_dentry->d_inode->i_nlink = unionfs_get_nlinks(old_dentry->d_inode);
 
 out:
 	if (!new_dentry->d_inode)
@@@@ -377,7 +383,7 @@@@ static int unionfs_symlink(struct inode 
 
 		fist_copy_attr_times(dir, hidden_dir_dentry->d_inode);
 		/* propagate number of hard-links */
-		dir->i_nlink = get_nlinks(dir);
+		dir->i_nlink = unionfs_get_nlinks(dir);
 
 		unlock_dir(hidden_dir_dentry);
 
@@@@ -428,11 +434,14 @@@@ static int unionfs_symlink(struct inode 
 		} else {
 			err = unionfs_interpose(dentry, dir->i_sb, 0);
 			if (!err) {
-				fist_copy_attr_timesizes(dir,
+				fist_copy_attr_times(dir,
+							 hidden_dir_dentry->
+							 d_inode);
+				fist_copy_inode_size(dir,
 							 hidden_dir_dentry->
 							 d_inode);
 				/* update number of links on parent directory */
-				dir->i_nlink = get_nlinks(dir);
+				dir->i_nlink = unionfs_get_nlinks(dir);
 			}
 			break;
 		}
@@@@ -546,11 +555,13 @@@@ static int unionfs_mkdir(struct inode *p
 
 		err = unionfs_interpose(dentry, parent->i_sb, 0);
 		if (!err) {
-			fist_copy_attr_timesizes(parent,
+			fist_copy_attr_times(parent,
 					hidden_parent_dentry->d_inode);
+			fist_copy_inode_size(parent,
+					hidden_parent_dentry->d_inode);
 
 			/* update number of links on parent directory */
-			parent->i_nlink = get_nlinks(parent);
+			parent->i_nlink = unionfs_get_nlinks(parent);
 		}
 
 		err = make_dir_opaque(dentry, dbstart(dentry));
@@@@ -659,11 +670,14 @@@@ static int unionfs_mknod(struct inode *d
 
 		err = unionfs_interpose(dentry, dir->i_sb, 0);
 		if (!err) {
-			fist_copy_attr_timesizes(dir,
+			fist_copy_attr_times(dir,
+						 hidden_parent_dentry->
+						 d_inode);
+			fist_copy_inode_size(dir,
 						 hidden_parent_dentry->
 						 d_inode);
 			/* update number of links on parent directory */
-			dir->i_nlink = get_nlinks(dir);
+			dir->i_nlink = unionfs_get_nlinks(dir);
 		}
 		unlock_dir(hidden_parent_dentry);
 
diff -r b1e299d66306 fs/unionfs/rename.c
--- a/fs/unionfs/rename.c	Mon Oct 16 22:29:52 2006 -0400
+++ b/fs/unionfs/rename.c	Mon Oct 16 22:29:52 2006 -0400
@@@@ -196,7 +196,7 @@@@ static int do_unionfs_rename(struct inod
 				     unlink_dir_dentry->d_inode);
 		/* propagate number of hard-links */
 		new_dentry->d_parent->d_inode->i_nlink =
-		    get_nlinks(new_dentry->d_parent->d_inode);
+		    unionfs_get_nlinks(new_dentry->d_parent->d_inode);
 
 		unlock_dir(unlink_dir_dentry);
 		if (!err) {
diff -r b1e299d66306 fs/unionfs/union.h
--- a/fs/unionfs/union.h	Mon Oct 16 22:29:52 2006 -0400
+++ b/fs/unionfs/union.h	Mon Oct 16 22:48:41 2006 -0400
d8 1
a8 1
+#include <linux/fs_stack.h>
d30 1
a30 1
@@@@ -371,48 +376,10 @@@@ static inline int get_nlinks(struct inod
d76 5
a80 4
+#define fist_copy_inode_size(d,s) fsstack_copy_inode_size((d), (s))
+#define fist_copy_attr_atime(d,s) fsstack_copy_attr_atime((d), (s))
+#define fist_copy_attr_times(d,s) fsstack_copy_attr_times((d), (s))
+#define fist_copy_attr_all(d,s)	  __fsstack_copy_attr_all((d), (s), &unionfs_get_nlinks)
d84 3
a86 3
diff -r b1e299d66306 fs/unionfs/unlink.c
--- a/fs/unionfs/unlink.c	Mon Oct 16 22:29:52 2006 -0400
+++ b/fs/unionfs/unlink.c	Mon Oct 16 22:29:52 2006 -0400
d96 87
@


1.1.2.3
log
@fsstack is now in -mm
@
text
@@


