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
- Lines: 205
- Date:
Fri Jul 7 17:30:41 2000
- Orig file:
v2.4.0-test2/linux/fs/inode.c
- Orig date:
Fri Jun 23 21:55:10 2000
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)