[Ocfs2-tools-devel] [PATCH] libocfs2: Don't free cached_inode in ocfs2_file_write.

Tao Ma tao.ma at oracle.com
Tue Oct 13 02:03:26 PDT 2009


In ocfs2_file_write, ci is passed from the caller, so
we can't free it and then initialize.

Add a new function named ocfs2_refresh_cached_inode which
will re-read the inode from the disk to refresh
the stale inode information in ocfs2_cached_inode.

Note:
There are also some functions which call free_cached_inode
first and then read_cached_inode. They also can be changed
to ocfs2_refresh_cached_inode, but it should be in another
separate patch of course.

Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 include/ocfs2/ocfs2.h   |    2 ++
 libocfs2/cached_inode.c |   10 ++++++++++
 libocfs2/fileio.c       |   11 ++++++++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
index 652d41a..a1db2a4 100644
--- a/include/ocfs2/ocfs2.h
+++ b/include/ocfs2/ocfs2.h
@@ -329,6 +329,8 @@ errcode_t ocfs2_write_cached_inode(ocfs2_filesys *fs,
 				   ocfs2_cached_inode *cinode);
 errcode_t ocfs2_free_cached_inode(ocfs2_filesys *fs,
 				  ocfs2_cached_inode *cinode);
+errcode_t ocfs2_refresh_cached_inode(ocfs2_filesys *fs,
+				     ocfs2_cached_inode *cinode);
 
 /*
  * obj is the object containing the extent list.  eg, if you are swapping
diff --git a/libocfs2/cached_inode.c b/libocfs2/cached_inode.c
index eedfd96..4dbb9ea 100644
--- a/libocfs2/cached_inode.c
+++ b/libocfs2/cached_inode.c
@@ -101,3 +101,13 @@ errcode_t ocfs2_write_cached_inode(ocfs2_filesys *fs,
 
 	return ret;
 }
+
+errcode_t ocfs2_refresh_cached_inode(ocfs2_filesys *fs,
+				     ocfs2_cached_inode *cinode)
+{
+	if (cinode->ci_chains)
+		ocfs2_bitmap_free(cinode->ci_chains);
+
+	return ocfs2_read_inode(fs, cinode->ci_blkno,
+				(char *)cinode->ci_inode);
+}
diff --git a/libocfs2/fileio.c b/libocfs2/fileio.c
index 7c51e13..c4664ec 100644
--- a/libocfs2/fileio.c
+++ b/libocfs2/fileio.c
@@ -302,7 +302,6 @@ static errcode_t ocfs2_file_block_write(ocfs2_cached_inode *ci,
 	uint32_t	tmp;
 	uint64_t	num_blocks;
 	int		bs_bits = OCFS2_RAW_SB(fs->fs_super)->s_blocksize_bits;
-	uint64_t	ino = ci->ci_blkno;
 	uint32_t	n_clusters, cluster_begin, cluster_end;
 	uint64_t	bpc = fs->fs_clustersize/fs->fs_blocksize;
 	int		insert = 0;
@@ -438,8 +437,14 @@ static errcode_t ocfs2_file_block_write(ocfs2_cached_inode *ci,
 					p_blkno & ~(bpc - 1));
 			if (ret)
 				return ret;
-			ocfs2_free_cached_inode(fs, ci);
-			ocfs2_read_cached_inode(fs,ino, &ci);
+			/*
+			 * We don't cache in the library right now, so any
+			 * work done in mark_extent_written won't be reflected
+			 * in our now stale copy. So refresh it.
+			 */
+			ret = ocfs2_refresh_cached_inode(fs, ci);
+			if (ret)
+				return ret;
 		}
 
 		*wrote += (contig_blocks << bs_bits);
-- 
1.5.5




More information about the Ocfs2-tools-devel mailing list