[Ocfs2-devel] [PATCH 1/1] OCFS2: protects generic_fillattr in metalock/unlock in ocfs2_getattr()

wangang wang wen.gang.wang at oracle.com
Mon Sep 22 01:47:42 PDT 2008


we need do generic_fillattr() bettwen meta lock and meata unlock in ocfs2_getattr().
1) move generic_fillattr() bettwen meta lock and meata unlock
2) fails this call if nlink is zero.

the patches are against 1.4 git and 1.2 svn respectively.

Signed-off-by: Wengang wang <wen.gang.wang at oracle.com>
--
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index e2f74fb..9808e9f 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1158,13 +1158,27 @@ int ocfs2_getattr(struct vfsmount *mnt,
 		  struct kstat *stat)
 {
 	struct inode *inode = dentry->d_inode;
-	struct super_block *sb = dentry->d_inode->i_sb;
-	struct ocfs2_super *osb = sb->s_fs_info;
+	struct ocfs2_super *osb = dentry->d_inode->i_sb->s_fs_info;
 	int err;
 
 	mlog_entry_void();
 
-	err = ocfs2_inode_revalidate(dentry);
+	if (!inode) {
+		mlog(0, "eep, no inode!\n");
+		err = -ENOENT;
+		goto bail;
+	}
+
+	spin_lock(&OCFS2_I(inode)->ip_lock);
+	if ((OCFS2_I(inode)->ip_flags & OCFS2_INODE_DELETED)) {
+		spin_unlock(&OCFS2_I(inode)->ip_lock);
+		mlog(0, "inode deleted!\n");
+		err = -ENOENT;
+		goto bail;
+	}
+	spin_unlock(&OCFS2_I(inode)->ip_lock);
+	
+	err = ocfs2_inode_lock(inode, NULL, 0);
 	if (err) {
 		if (err != -ENOENT)
 			mlog_errno(err);
@@ -1172,10 +1186,16 @@ int ocfs2_getattr(struct vfsmount *mnt,
 	}
 
 	generic_fillattr(inode, stat);
-
+	
 	/* We set the blksize from the cluster size for performance */
 	stat->blksize = osb->s_clustersize;
 
+	if (!stat->nlink) {
+		mlog(0, "inode deleted!\n");
+		err = -ENOENT;
+	}
+
+	ocfs2_inode_unlock(inode, 0);
 bail:
 	mlog_exit(err);
 
Index: fs/ocfs2/file.c
===================================================================
--- fs/ocfs2/file.c	(revision 3101)
+++ fs/ocfs2/file.c	(working copy)
@@ -1162,14 +1162,28 @@
 		  struct kstat *stat)
 {
 	struct inode *inode = dentry->d_inode;
-	struct super_block *sb = dentry->d_inode->i_sb;
-	struct ocfs2_super *osb = sb->s_fs_info;
+	struct ocfs2_super *osb = dentry->d_inode->i_sb->s_fs_info;
 	int err;
 
 	mlog_entry_void();
 
-	err = ocfs2_inode_revalidate(dentry);
-	if (err) {
+	if (!inode) {
+		mlog(0, "eep, no inode!\n");
+		err = -ENOENT;
+		goto bail;
+	}
+
+	spin_lock(&OCFS2_I(inode)->ip_lock);
+	if ((OCFS2_I(inode)->ip_flags & OCFS2_INODE_DELETED)) {
+		spin_unlock(&OCFS2_I(inode)->ip_lock);
+		mlog(0, "inode deleted!\n");
+		err = -ENOENT;
+		goto bail;
+	}
+	spin_unlock(&OCFS2_I(inode)->ip_lock);
+
+	err =  ocfs2_meta_lock(inode, NULL, NULL, 0);
+	if (err<0) {
 		if (err != -ENOENT)
 			mlog_errno(err);
 		goto bail;
@@ -1180,6 +1194,12 @@
 	/* We set the blksize from the cluster size for performance */
 	stat->blksize = osb->s_clustersize;
 
+	if (!stat->nlink) {
+		mlog(0, "inode deleted!\n");
+		err = -ENOENT;
+	}
+
+	ocfs2_meta_unlock(inode, 0);
 bail:
 	mlog_exit(err);
 



More information about the Ocfs2-devel mailing list