patch-2.4.0-test3 linux/fs/inode.c

Next file: linux/fs/ioctl.c
Previous file: linux/fs/hpfs/namei.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test2/linux/fs/inode.c linux/fs/inode.c
@@ -26,7 +26,7 @@
 
 /* inode dynamic allocation 1999, Andrea Arcangeli <andrea@suse.de> */
 
-#define INODE_PARANOIA 1
+/* #define INODE_PARANOIA 1 */
 /* #define INODE_DEBUG 1 */
 
 /*
@@ -162,10 +162,10 @@
 }
 
 
-static inline void write_inode(struct inode *inode)
+static inline void write_inode(struct inode *inode, int sync)
 {
 	if (inode->i_sb && inode->i_sb->s_op && inode->i_sb->s_op->write_inode)
-		inode->i_sb->s_op->write_inode(inode);
+		inode->i_sb->s_op->write_inode(inode, sync);
 }
 
 static inline void __iget(struct inode * inode)
@@ -182,7 +182,7 @@
 	inodes_stat.nr_unused--;
 }
 
-static inline void sync_one(struct inode *inode)
+static inline void sync_one(struct inode *inode, int sync)
 {
 	if (inode->i_state & I_LOCK) {
 		__iget(inode);
@@ -199,7 +199,7 @@
 		inode->i_state ^= I_DIRTY | I_LOCK;
 		spin_unlock(&inode_lock);
 
-		write_inode(inode);
+		write_inode(inode, sync);
 
 		spin_lock(&inode_lock);
 		inode->i_state &= ~I_LOCK;
@@ -212,7 +212,7 @@
 	struct list_head * tmp;
 
 	while ((tmp = head->prev) != head)
-		sync_one(list_entry(tmp, struct inode, i_list));
+		sync_one(list_entry(tmp, struct inode, i_list), 0);
 }
 
 /**
@@ -266,14 +266,14 @@
  *	dirty. This is primarily needed by knfsd.
  */
  
-void write_inode_now(struct inode *inode)
+void write_inode_now(struct inode *inode, int sync)
 {
 	struct super_block * sb = inode->i_sb;
 
 	if (sb) {
 		spin_lock(&inode_lock);
 		while (inode->i_state & I_DIRTY)
-			sync_one(inode);
+			sync_one(inode, sync);
 		spin_unlock(&inode_lock);
 	}
 	else
@@ -327,6 +327,7 @@
 			truncate_inode_pages(&inode->i_data, 0);
 		clear_inode(inode);
 		destroy_inode(inode);
+		inodes_stat.nr_inodes--;
 	}
 }
 
@@ -548,6 +549,7 @@
 	if (inode)
 	{
 		spin_lock(&inode_lock);
+		inodes_stat.nr_inodes++;
 		list_add(&inode->i_list, &inode_in_use);
 		inode->i_sb = NULL;
 		inode->i_dev = 0;
@@ -579,6 +581,7 @@
 		/* We released the lock, so.. */
 		old = find_inode(sb, ino, head, find_actor, opaque);
 		if (!old) {
+			inodes_stat.nr_inodes++;
 			list_add(&inode->i_list, &inode_in_use);
 			list_add(&inode->i_hash, head);
 			inode->i_sb = sb;
@@ -752,78 +755,55 @@
 {
 	if (inode) {
 		struct super_operations *op = NULL;
-		int destroy = 0;
 
 		if (inode->i_sb && inode->i_sb->s_op)
 			op = inode->i_sb->s_op;
 		if (op && op->put_inode)
 			op->put_inode(inode);
 
-		spin_lock(&inode_lock);
-		if (atomic_dec_and_test(&inode->i_count)) {
-			if (!inode->i_nlink) {
-				list_del(&inode->i_hash);
-				INIT_LIST_HEAD(&inode->i_hash);
-				list_del(&inode->i_list);
-				INIT_LIST_HEAD(&inode->i_list);
-				inode->i_state|=I_FREEING;
-				spin_unlock(&inode_lock);
+		if (!atomic_dec_and_lock(&inode->i_count, &inode_lock))
+			return;
 
-				if (inode->i_data.nrpages)
-					truncate_inode_pages(&inode->i_data, 0);
+		if (!inode->i_nlink) {
+			list_del(&inode->i_hash);
+			INIT_LIST_HEAD(&inode->i_hash);
+			list_del(&inode->i_list);
+			INIT_LIST_HEAD(&inode->i_list);
+			inode->i_state|=I_FREEING;
+			spin_unlock(&inode_lock);
 
-				destroy = 1;
-				if (op && op->delete_inode) {
-					void (*delete)(struct inode *) = op->delete_inode;
-					/* s_op->delete_inode internally recalls clear_inode() */
-					delete(inode);
-				} else
-					clear_inode(inode);
-				if (inode->i_state != I_CLEAR)
-					BUG();
+			if (inode->i_data.nrpages)
+				truncate_inode_pages(&inode->i_data, 0);
 
-				spin_lock(&inode_lock);
-			} else {
-				if (!list_empty(&inode->i_hash)) {
-					if (!(inode->i_state & I_DIRTY)) {
-						list_del(&inode->i_list);
-						list_add(&inode->i_list,
-							 &inode_unused);
-					}
-					inodes_stat.nr_unused++;
-				} else {
-					/* magic nfs path */
+			if (op && op->delete_inode) {
+				void (*delete)(struct inode *) = op->delete_inode;
+				/* s_op->delete_inode internally recalls clear_inode() */
+				delete(inode);
+			} else
+				clear_inode(inode);
+			if (inode->i_state != I_CLEAR)
+				BUG();
+		} else {
+			if (!list_empty(&inode->i_hash)) {
+				if (!(inode->i_state & I_DIRTY)) {
 					list_del(&inode->i_list);
-					INIT_LIST_HEAD(&inode->i_list);
-					inode->i_state|=I_FREEING;
-					spin_unlock(&inode_lock);
-					clear_inode(inode);
-					destroy = 1;
-					spin_lock(&inode_lock);
+					list_add(&inode->i_list,
+						 &inode_unused);
 				}
+				inodes_stat.nr_unused++;
+				spin_unlock(&inode_lock);
+				return;
+			} else {
+				/* magic nfs path */
+				list_del(&inode->i_list);
+				INIT_LIST_HEAD(&inode->i_list);
+				inode->i_state|=I_FREEING;
+				spin_unlock(&inode_lock);
+				clear_inode(inode);
 			}
-#ifdef INODE_PARANOIA
-if (inode->i_flock)
-printk(KERN_ERR "iput: inode %s/%ld still has locks!\n",
-kdevname(inode->i_dev), inode->i_ino);
-if (!list_empty(&inode->i_dentry))
-printk(KERN_ERR "iput: device %s inode %ld still has aliases!\n",
-kdevname(inode->i_dev), inode->i_ino);
-if (atomic_read(&inode->i_count))
-printk(KERN_ERR "iput: device %s inode %ld count changed, count=%d\n",
-kdevname(inode->i_dev), inode->i_ino, atomic_read(&inode->i_count));
-if (atomic_read(&inode->i_sem.count) != 1)
-printk(KERN_ERR "iput: Aieee, semaphore in use inode %s/%ld, count=%d\n",
-kdevname(inode->i_dev), inode->i_ino, atomic_read(&inode->i_sem.count));
-#endif
-		}
-		if ((unsigned)atomic_read(&inode->i_count) > (1U<<31)) {
-			printk(KERN_ERR "iput: inode %s/%ld count wrapped\n",
-				kdevname(inode->i_dev), inode->i_ino);
 		}
-		spin_unlock(&inode_lock);
-		if (destroy)
-			destroy_inode(inode);
+		inodes_stat.nr_inodes--;
+		destroy_inode(inode);
 	}
 }
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)