[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