[Ocfs2-commits] mfasheh commits r1421 - trunk/src

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Fri Sep 3 17:08:26 CDT 2004


Author: mfasheh
Date: 2004-09-03 17:08:24 -0500 (Fri, 03 Sep 2004)
New Revision: 1421

Modified:
   trunk/src/file.c
Log:
* figure out the size we want to extend to *after* taking the cluster
  lock :)



Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-09-03 20:42:54 UTC (rev 1420)
+++ trunk/src/file.c	2004-09-03 22:08:24 UTC (rev 1421)
@@ -1037,37 +1037,7 @@
 	if (file_size == 0)
 		goto leave;
 
-	if (fe_bh)
-		bh = fe_bh;
-	else {
-		status = ocfs_read_bh(osb,
-				      OCFS_I(inode)->ip_blkno << inode->i_sb->s_blocksize_bits,
-				      &bh, OCFS_BH_CACHED, inode);
-		if (status < 0) {
-			LOG_ERROR_STATUS (status);
-			goto leave;
-		}
-	}
-	fe = (ocfs2_dinode *) bh->b_data;
-
-	if (!IS_VALID_FILE_ENTRY(fe)) {
-		printk("fe->signature=%8s\n", fe->i_signature);
-		LOG_ERROR_ARGS("Invalid fe at block %llu",
-			       OCFS_I(inode)->ip_blkno);
-		status = -EFAIL;
-		goto leave;
-	}
-
-	current_alloc = (u64)fe->i_clusters << osb->s_clustersize_bits;
-	alloc_size = file_size - current_alloc;
-
-	LOG_TRACE_ARGS("current_alloc=%llu, alloc_size=%llu\n",
-		       current_alloc, alloc_size);
-
 	if (passed_handle == NULL) {
-		credits = ocfs_calc_extend_credits(osb->sb,
-						   (__u32) alloc_size); 
-
 		handle = ocfs_alloc_handle(osb);
 		if (handle == NULL) {
 			LOG_ERROR_STATUS(status = -ENOMEM);
@@ -1085,14 +1055,39 @@
 				     OCFS_LKM_EXMODE,
 				     FLAG_FILE_EXTEND|FLAG_FILE_UPDATE_OIN,
 				     inode);
+	} else {
+		handle = passed_handle;
+		/* fe_bh is optional if you already have a transaction open. */
+		if (fe_bh)
+			bh = fe_bh;
+		else {
+			status = ocfs_read_bh(osb,
+					      OCFS_I(inode)->ip_blkno << inode->i_sb->s_blocksize_bits,
+					      &bh, OCFS_BH_CACHED, inode);
+			if (status < 0) {
+				LOG_ERROR_STATUS (status);
+				goto leave;
+			}
+		}
+	}
 
+	fe = (ocfs2_dinode *) bh->b_data;
+	OCFS_ASSERT(IS_VALID_FILE_ENTRY(fe));
+
+	current_alloc = (u64)fe->i_clusters << osb->s_clustersize_bits;
+	alloc_size = file_size - current_alloc;
+	LOG_TRACE_ARGS("current_alloc=%llu, alloc_size=%llu\n",
+		       current_alloc, alloc_size);
+
+	if (passed_handle == NULL) {
+		credits = ocfs_calc_extend_credits(osb->sb, 
+						   (__u32) alloc_size); 
+
 		handle = ocfs_start_trans(osb, handle, credits);
 		if (handle == NULL) {
 			LOG_ERROR_STATUS(status = -ENOMEM);
 			goto leave;
 		}
-	} else {
-		handle = passed_handle;
 	}
 
 	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);



More information about the Ocfs2-commits mailing list