[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