summaryrefslogtreecommitdiffstats
path: root/fs/nfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r--fs/nfs/inode.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index cf0ea6ef3..aedda1e90 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -44,7 +44,6 @@ void nfs_zap_caches(struct inode *);
static void nfs_invalidate_inode(struct inode *);
static void nfs_read_inode(struct inode *);
-static void nfs_put_inode(struct inode *);
static void nfs_delete_inode(struct inode *);
static void nfs_put_super(struct super_block *);
static void nfs_umount_begin(struct super_block *);
@@ -52,7 +51,7 @@ static int nfs_statfs(struct super_block *, struct statfs *);
static struct super_operations nfs_sops = {
read_inode: nfs_read_inode,
- put_inode: nfs_put_inode,
+ put_inode: force_delete,
delete_inode: nfs_delete_inode,
put_super: nfs_put_super,
statfs: nfs_statfs,
@@ -115,17 +114,6 @@ nfs_read_inode(struct inode * inode)
}
static void
-nfs_put_inode(struct inode * inode)
-{
- dprintk("NFS: put_inode(%x/%ld)\n", inode->i_dev, inode->i_ino);
- /*
- * We want to get rid of unused inodes ...
- */
- if (inode->i_count == 1)
- inode->i_nlink = 0;
-}
-
-static void
nfs_delete_inode(struct inode * inode)
{
dprintk("NFS: delete_inode(%x/%ld)\n", inode->i_dev, inode->i_ino);
@@ -690,7 +678,7 @@ nfs_inode_is_stale(struct inode *inode, struct nfs_fattr *fattr)
* don't invalidate their inodes even if all dentries are
* unhashed.
*/
- if (unhashed && inode->i_count == unhashed + 1
+ if (unhashed && atomic_read(&inode->i_count) == unhashed + 1
&& !S_ISSOCK(inode->i_mode) && !S_ISFIFO(inode->i_mode))
is_stale = 1;
@@ -717,7 +705,7 @@ nfs_fhget(struct dentry *dentry, struct nfs_fh *fhandle,
(long long)fattr->fileid);
/* Install the file handle in the dentry */
- *((struct nfs_fh *) dentry->d_fsdata) = *fhandle;
+ memcpy(dentry->d_fsdata, fhandle, sizeof(struct nfs_fh));
#ifdef CONFIG_NFS_SNAPSHOT
/*
@@ -784,7 +772,7 @@ __nfs_fhget(struct super_block *sb, struct nfs_fattr *fattr)
break;
dprintk("__nfs_fhget: inode %ld still busy, i_count=%d\n",
- inode->i_ino, inode->i_count);
+ inode->i_ino, atomic_read(&inode->i_count));
nfs_zap_caches(inode);
remove_inode_hash(inode);
iput(inode);
@@ -795,7 +783,7 @@ __nfs_fhget(struct super_block *sb, struct nfs_fattr *fattr)
nfs_fill_inode(inode, fattr);
dprintk("NFS: __nfs_fhget(%x/%ld ct=%d)\n",
- inode->i_dev, inode->i_ino, inode->i_count);
+ inode->i_dev, inode->i_ino, atomic_read(&inode->i_count));
out:
return inode;
@@ -870,7 +858,7 @@ nfs_wait_on_inode(struct inode *inode, int flag)
int error;
if (!(NFS_FLAGS(inode) & flag))
return 0;
- inode->i_count++;
+ atomic_inc(&inode->i_count);
error = nfs_wait_event(clnt, inode->i_wait, !(NFS_FLAGS(inode) & flag));
iput(inode);
return error;
@@ -1019,8 +1007,8 @@ nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
goto out;
dfprintk(VFS, "NFS: refresh_inode(%x/%ld ct=%d info=0x%x)\n",
- inode->i_dev, inode->i_ino, inode->i_count,
- fattr->valid);
+ inode->i_dev, inode->i_ino,
+ atomic_read(&inode->i_count), fattr->valid);
if (NFS_FSID(inode) != fattr->fsid ||