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

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Fri Aug 27 19:06:54 CDT 2004


Author: mfasheh
Date: 2004-08-27 19:06:52 -0500 (Fri, 27 Aug 2004)
New Revision: 1396

Modified:
   trunk/src/aops.c
   trunk/src/file.c
   trunk/src/ocfs.h
   trunk/src/super.c
Log:
* catch a race between write and truncate. This fixes bugzilla #119.



Modified: trunk/src/aops.c
===================================================================
--- trunk/src/aops.c	2004-08-27 23:37:36 UTC (rev 1395)
+++ trunk/src/aops.c	2004-08-28 00:06:52 UTC (rev 1396)
@@ -158,36 +158,14 @@
 
 	vbo = (__s64) iblock << inode->i_sb->s_blocksize_bits;
 
-#if 0
-	if (!INODE_JOURNAL(inode) && vbo >= OCFS_I(inode)->ip_alloc_size) {
-		int vbo_pad;
-		
-		vbo_pad = inode->i_sb->s_blocksize;
-		vbo_pad -= vbo & (s64)(inode->i_sb->s_blocksize - 1);
-
-		LOG_TRACE_STR("Extending allocation");
-		LOG_ERROR_ARGS("extending inode %lu in get_block!!\n", 
-			       inode->i_ino);
-		down_write(&OCFS_I(inode)->ip_io_sem);
-		err = ocfs_extend_file(osb, vbo + vbo_pad, 
-				       NULL, inode, NULL, 0, NULL);
-		up_write(&OCFS_I(inode)->ip_io_sem);
-		if (err < 0) {
-			err = -ENOSPC;
-			LOG_ERROR_STATUS (err);
-			goto bail;
-		}
-	}
-#else
+	/* this can happen if another node truncs after our extend! */
+	down(&OCFS_I(inode)->ip_sem);
 	if (vbo >= OCFS_I(inode)->ip_alloc_size) {
+		up(&OCFS_I(inode)->ip_sem);
 		err = -EIO;
-		LOG_ERROR_ARGS("Trying to extend in ocfs_get_block() "
-			"(inode %llu, blkno %llu, vbo %llu, alloc %llu)\n",
-			OCFS_I(inode)->ip_blkno, (u64)iblock, (u64)vbo,
-			OCFS_I(inode)->ip_alloc_size);
 		goto bail;
 	}
-#endif
+	up(&OCFS_I(inode)->ip_sem);
 
 	len = inode->i_sb->s_blocksize;
 	if (!open_direct)
@@ -229,7 +207,7 @@
 		goto bail;
 	}
 
-	bh_result->b_state |= (1UL << BH_New);
+	set_buffer_new(bh_result);
 	OCFS_I(inode)->ip_mmu_private += inode->i_sb->s_blocksize;
 
 bail:

Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-08-27 23:37:36 UTC (rev 1395)
+++ trunk/src/file.c	2004-08-28 00:06:52 UTC (rev 1396)
@@ -596,6 +596,7 @@
 	struct super_block *sb = inode->i_sb;
 	int do_direct_io = 0;
 	int sector_size;
+	int have_i_sem = 0;
 
 	LOG_SET_CONTEXT(WRITE);
 
@@ -635,6 +636,9 @@
 		goto bail;
 	}
 	
+	down(&inode->i_sem);
+	have_i_sem = 1;
+
 	if (filp->f_flags & O_APPEND) {
 		LOG_TRACE_ARGS("O_APPEND: inode->i_size=%llu, ppos was %llu\n",
 			       inode->i_size, *ppos);
@@ -671,31 +675,18 @@
 	}
 
 	newsize = count + *ppos;
+	if (filp->f_flags & O_APPEND)
+		newsize = count + inode->i_size;
 
-	if ((newsize > inode->i_size) || (filp->f_flags & O_APPEND)) {
-		down(&osb->extend_sem);
-		writingAtEOF = 1;
-
-		if (filp->f_flags & O_APPEND) 
-			newsize = count + inode->i_size;
-
-		/* did someone beat us to it? */
-		if (newsize <= inode->i_size) {
-			writingAtEOF = 0;
-			up(&osb->extend_sem);
-		}
-	}
-
-	if (writingAtEOF)
-		LOG_TRACE_STR ("Writing at EOF");
-
 	LOG_TRACE_ARGS ("ppos=%llu newsize=%llu cursize=%llu\n",
 			*ppos, newsize, inode->i_size);
 
-	if (writingAtEOF) {
+	if (newsize > inode->i_size) {
+		writingAtEOF = 1;
+
 		LOG_TRACE_ARGS
-		    ("Will need more allocation: have=%llu, need=%llu\n",
-		     OCFS_I(inode)->ip_alloc_size, newsize);
+		    ("Writing at EOF, will need more allocation: have=%llu, "
+		     "need=%llu\n", OCFS_I(inode)->ip_alloc_size, newsize);
 		down_write(&OCFS_I(inode)->ip_io_sem);
 		status = ocfs_extend_file(osb, newsize,
 					  NULL, inode, NULL, 0, NULL);
@@ -703,12 +694,12 @@
 		if (status < 0) {
 			if (status != -EINTR && status != -ENOSPC) {
 				LOG_ERROR_STATUS (status);
-				LOG_ERROR_ARGS ("Failed to extend file from %llu to %llu",
+				LOG_ERROR_ARGS ("Failed to extend file from "
+						"%llu to %llu",
 			     		*ppos, newsize);
 				ret = -ENOSPC;
 			} else
 				ret = status;
-			up(&osb->extend_sem);
 			goto bail;
 		}
 	}
@@ -727,14 +718,14 @@
 			filp->f_flags |= O_DIRECT;
 		else
 			filp->f_flags &= ~O_DIRECT;
-		ret = generic_file_write (filp, buf, count, ppos);
+		ret = generic_file_write_nolock (filp, buf, count, ppos);
 		filp->f_flags = savedflags;
 	}
 #else
 	if (do_direct_io)
 		ret = ocfs_rw_direct (WRITE, filp, (char *) buf, count, ppos);
 	else
-		ret = generic_file_write (filp, buf, count, ppos);
+		ret = generic_file_write_nolock (filp, buf, count, ppos);
 #endif
 	if (writingAtEOF) {
 		LOG_TRACE_STR
@@ -756,10 +747,11 @@
 			if (status)
 				LOG_ERROR_ARGS("Unable to pre-zero extension of inode (%d)", status);
 		}
-		up(&osb->extend_sem);
 	}
 
 bail:
+	if (have_i_sem)
+		up(&inode->i_sem);
 	LOG_EXIT_INT (ret);
 
 	LOG_CLEAR_CONTEXT();

Modified: trunk/src/ocfs.h
===================================================================
--- trunk/src/ocfs.h	2004-08-27 23:37:36 UTC (rev 1395)
+++ trunk/src/ocfs.h	2004-08-28 00:06:52 UTC (rev 1396)
@@ -597,7 +597,6 @@
 	__u64 *last_publ_seq_num;
 	int have_local_alloc;
 	struct buffer_head *local_alloc_bh;
-	struct semaphore extend_sem;
 	__u8 check_mounted; /* tell nm to check mounted flag, protected by publish_lock*/
 	ocfs_dlm_stats net_reqst_stats;	/* stats of netdlm vote requests */
 	ocfs_dlm_stats net_reply_stats;	/* stats of netdlm vote reponses */

Modified: trunk/src/super.c
===================================================================
--- trunk/src/super.c	2004-08-27 23:37:36 UTC (rev 1395)
+++ trunk/src/super.c	2004-08-28 00:06:52 UTC (rev 1396)
@@ -1457,7 +1457,6 @@
 	init_MUTEX (&(osb->recovery_lock));
 	init_MUTEX (&(osb->orphan_recovery_lock));
 	init_MUTEX (&(osb->comm_lock));
-	init_MUTEX (&(osb->extend_sem));
 	init_MUTEX (&(osb->cfg_lock));
 	init_MUTEX (&(osb->vote_sem));
 



More information about the Ocfs2-commits mailing list