[Ocfs2-commits] mfasheh commits r2279 - trunk/fs/ocfs2

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed May 18 01:41:36 CDT 2005


Author: mfasheh
Signed-off-by: manish
Date: 2005-05-18 01:41:34 -0500 (Wed, 18 May 2005)
New Revision: 2279

Modified:
   trunk/fs/ocfs2/Makefile
   trunk/fs/ocfs2/file.c
   trunk/fs/ocfs2/mmap.c
Log:
* factor out the oracore workarounds so that they are more easily removed   
  when spinning patches.              

Signed-off-by: manish



Modified: trunk/fs/ocfs2/Makefile
===================================================================
--- trunk/fs/ocfs2/Makefile	2005-05-18 05:18:19 UTC (rev 2278)
+++ trunk/fs/ocfs2/Makefile	2005-05-18 06:41:34 UTC (rev 2279)
@@ -21,7 +21,7 @@
 EXTRA_CFLAGS += -DDEBUG
 endif
 
-EXTRA_CFLAGS += -DCATCH_BH_JBD_RACES
+EXTRA_CFLAGS += -DCATCH_BH_JBD_RACES -DOCFS2_ORACORE_WORKAROUNDS
 
 ifdef JOURNAL_ACCESS_WITH_CREDITS
 EXTRA_CFLAGS += -DJOURNAL_ACCESS_WITH_CREDITS

Modified: trunk/fs/ocfs2/file.c
===================================================================
--- trunk/fs/ocfs2/file.c	2005-05-18 05:18:19 UTC (rev 2278)
+++ trunk/fs/ocfs2/file.c	2005-05-18 06:41:34 UTC (rev 2279)
@@ -196,22 +196,23 @@
 
 /*
  * ocfs_file_write()
- * Linux 2.6 TODO: Remove all O_DIRECT conditionals here, they are no longer
- * needed.
  */
-static ssize_t ocfs_file_write(struct file *filp, const char __user *buf,
-		size_t count, loff_t *ppos)
+static ssize_t ocfs_file_write(struct file *filp,
+			       const char __user *buf,
+			       size_t count,
+			       loff_t *ppos)
 {
 	struct iovec local_iov = { .iov_base = (void __user *)buf, 
 				   .iov_len = count };
-	unsigned int savedflags;
 	int ret = 0;
 	ocfs_super *osb = NULL;
 	struct dentry *dentry = filp->f_dentry;
 	struct inode *inode = dentry->d_inode;
-	int sector_size;
 	struct ocfs2_write_lock_info info = {0, };
 	DECLARE_BUFFER_LOCK_CTXT(ctxt);
+#ifdef OCFS2_ORACORE_WORKAROUNDS
+	unsigned int saved_flags;
+#endif
 
 	mlog_entry ("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf,
 			(unsigned int)count,
@@ -231,7 +232,6 @@
 	}
 
 	osb = OCFS2_SB(inode->i_sb);
-	sector_size = 1 << osb->s_sectsize_bits;
 
 	ret = ocfs_write_lock_maybe_extend(filp, buf, count, ppos, &info,
 					   &ctxt);
@@ -240,14 +240,17 @@
 
 	down_read(&OCFS_I(inode)->ip_alloc_sem);
 
-	/* ick.  seems to be our only way of toggling directio */
-	savedflags = filp->f_flags;
+#ifdef OCFS2_ORACORE_WORKAROUNDS
+	saved_flags = filp->f_flags;
 	if (info.wl_do_direct_io) 
 		filp->f_flags |= O_DIRECT;
 	else
 		filp->f_flags &= ~O_DIRECT;
-	ret = generic_file_write_nolock (filp, &local_iov, 1, ppos);
-	filp->f_flags = savedflags;
+#endif
+	ret = generic_file_write_nolock(filp, &local_iov, 1, ppos);
+#ifdef OCFS2_ORACORE_WORKAROUNDS
+	filp->f_flags = saved_flags;
+#endif
 
 	up_read(&OCFS_I(inode)->ip_alloc_sem);
 
@@ -268,20 +271,17 @@
 
 /*
  * ocfs_file_read()
- * Linux 2.6 TODO: Remove all O_DIRECT conditionals here, they are no longer
- * needed.
  */
-static ssize_t ocfs_file_read(struct file *filp, char __user *buf,
-		size_t count, loff_t *ppos)
+static ssize_t ocfs_file_read(struct file *filp,
+			      char __user *buf,
+			      size_t count,
+			      loff_t *ppos)
 {
-	unsigned int savedflags;
 	int ret = 0;
 	ocfs_super *osb = NULL;
 	struct dentry *dentry = filp->f_dentry;
 	struct inode *inode = dentry->d_inode;
 	ocfs2_backing_inode *target_binode;
-	int do_direct_io = 0;
-	int sector_size;
 	DECLARE_BUFFER_LOCK_CTXT(ctxt);
 
 	mlog_entry ("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf,
@@ -294,19 +294,19 @@
 	}
 
 	osb = OCFS2_SB(inode->i_sb);
-	sector_size = 1 << osb->s_sectsize_bits;
 
+#ifdef OCFS2_ORACORE_WORKAROUNDS
 	if (filp->f_flags & O_DIRECT) {
-		/* anything special for o_direct? */
-		mlog(0, "O_DIRECT\n");
-		if (((*ppos) & (sector_size - 1)) || (count & (sector_size - 1)) || 
-		    ((unsigned long)buf & (sector_size - 1)) || (i_size_read(inode) & (sector_size -1))) {
-			do_direct_io = 0;
+		int sector_size = 1 << osb->s_sectsize_bits;
+
+		if (((*ppos) & (sector_size - 1)) ||
+		    (count & (sector_size - 1)) || 
+		    ((unsigned long)buf & (sector_size - 1)) ||
+		    (i_size_read(inode) & (sector_size -1))) {
 			filp->f_flags &= ~O_DIRECT;
-		} else {
-			do_direct_io = 1;
 		}
 	}
+#endif
 
 	ret = ocfs2_setup_io_locks(inode->i_sb, inode, buf, count, &ctxt,
 				   &target_binode);
@@ -315,7 +315,7 @@
 		goto bail;
 	}
 
-	target_binode->ba_lock_data = do_direct_io ? 0 : 1;
+	target_binode->ba_lock_data = (filp->f_flags & O_DIRECT) ? 0 : 1;
 
 	ret = ocfs2_lock_buffer_inodes(&ctxt, NULL);
 	if (ret < 0) {
@@ -325,14 +325,7 @@
 
 	down_read(&OCFS_I(inode)->ip_alloc_sem);
 
-	/* ick.  seems to be our only way of toggling directio */
-	savedflags = filp->f_flags;
-	if (do_direct_io) 
-		filp->f_flags |= O_DIRECT;
-	else
-		filp->f_flags &= ~O_DIRECT;
 	ret = generic_file_read (filp, buf, count, ppos);
-	filp->f_flags = savedflags;
 
 	up_read(&OCFS_I(inode)->ip_alloc_sem);
 

Modified: trunk/fs/ocfs2/mmap.c
===================================================================
--- trunk/fs/ocfs2/mmap.c	2005-05-18 05:18:19 UTC (rev 2278)
+++ trunk/fs/ocfs2/mmap.c	2005-05-18 06:41:34 UTC (rev 2279)
@@ -447,13 +447,11 @@
 	struct dentry *dentry = filp->f_dentry;
 	struct inode *inode = dentry->d_inode;
 	int status;
-	int sector_size;
 	int level = filp->f_flags & O_APPEND;
 	loff_t saved_ppos;
 	u64 bytes_added = 0;
 
 	osb = OCFS2_SB(inode->i_sb);
-	sector_size = 1 << osb->s_sectsize_bits;
 
 	/* the target inode is different from the other inodes.  in o_direct it
 	 * doesn't get a data lock and when appending it gets a level 1 meta
@@ -512,11 +510,19 @@
 	if (filp->f_flags & O_APPEND) {
 		saved_ppos = i_size_read(inode);
 		mlog(0, "O_APPEND: inode->i_size=%llu\n", saved_ppos);
+
+#ifdef OCFS2_ORACORE_WORKAROUNDS
+		/* ugh, work around some applications which open
+		 * everything O_DIRECT + O_APPEND and really don't
+		 * mean to use O_DIRECT. */
+		filp->f_flags &= ~O_DIRECT;
+#endif
 	}
 
 	if (filp->f_flags & O_DIRECT) {
-		/* anything special for o_direct? */
-		mlog(0, "O_DIRECT\n");
+#ifdef OCFS2_ORACORE_WORKAROUNDS
+		int sector_size = 1 << osb->s_sectsize_bits;
+
 		if ((saved_ppos & (sector_size - 1)) || 
 		    (count & (sector_size - 1)) || 
 		    ((unsigned long)buf & (sector_size - 1))) {
@@ -525,7 +531,12 @@
 		} else {
 			info->wl_do_direct_io = 1;
 		}
+#else
+		info->wl_do_direct_io = 1;
+#endif
+		mlog(0, "O_DIRECT\n");
 	}
+
 	info->wl_target_binode->ba_lock_data = info->wl_do_direct_io ? 0 : 1;
 
 	info->wl_newsize = count + saved_ppos;



More information about the Ocfs2-commits mailing list