[Ocfs2-commits] mfasheh commits r1108 - in trunk/src: . inc
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Tue Jun 15 20:06:10 CDT 2004
Author: mfasheh
Date: 2004-06-15 19:06:08 -0500 (Tue, 15 Jun 2004)
New Revision: 1108
Modified:
trunk/src/dcache.c
trunk/src/file.c
trunk/src/inc/ocfs.h
trunk/src/inode.c
trunk/src/namei.c
trunk/src/nm.c
Log:
* Turn needs_verification into an atomic int,
ip_needs_verification. This avoids some potential races setting /
reading that value.
* Fix up ocfs_verify_update_inode() to do locking with priv_sem only
when it's necessary -- not during the I/O. This should reduce
contention on that lock and get us within a step or two of just making
it a spinlock.
Modified: trunk/src/dcache.c
===================================================================
--- trunk/src/dcache.c 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/dcache.c 2004-06-16 00:06:08 UTC (rev 1108)
@@ -88,7 +88,7 @@
ret = 1;
/* TODO: Is this really necessary? */
- OCFS_I(inode)->needs_verification = 1;
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
bail:
Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/file.c 2004-06-16 00:06:08 UTC (rev 1108)
@@ -176,8 +176,18 @@
goto leave;
}
- /* kch - for an open request we are already given the
- * inode, and therefore we are given the oin too */
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
+ down_read (&(OCFS_I(inode)->ip_io_sem));
+ status = ocfs_verify_update_inode (osb, inode, &truncate_pages,
+ 0);
+ up_read (&(OCFS_I(inode)->ip_io_sem));
+ if (status < 0) {
+ up_write(&OCFS_I(inode)->ip_io_sem);
+ LOG_ERROR_STATUS (status);
+ goto leave;
+ }
+ }
+
down_write (&(OCFS_I(inode)->ip_io_sem));
down (&(OCFS_I(inode)->priv_sem));
have_oin_sem = 1;
@@ -214,16 +224,6 @@
}
}
- if (OCFS_I(inode)->needs_verification) {
- status = ocfs_verify_update_inode (osb, inode, &truncate_pages,
- 0);
- if (status < 0) {
- up_write(&OCFS_I(inode)->ip_io_sem);
- LOG_ERROR_STATUS (status);
- goto leave;
- }
- }
-
up_write(&OCFS_I(inode)->ip_io_sem);
/* yes, hold onto priv_sem. */
@@ -756,13 +756,11 @@
}
}
- if (OCFS_I(inode)->needs_verification) {
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
down_read (&(OCFS_I(inode)->ip_io_sem));
- down (&(OCFS_I(inode)->priv_sem));
status = ocfs_verify_update_inode (osb, inode, &needs_trunc,
0);
- up (&(OCFS_I(inode)->priv_sem));
up_read (&(OCFS_I(inode)->ip_io_sem));
if (needs_trunc)
ocfs_truncate_inode_pages(inode, 0);
@@ -887,13 +885,10 @@
}
}
- if (OCFS_I(inode)->needs_verification) {
- /* yay, locking hell! */
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
down_read(&OCFS_I(inode)->ip_io_sem);
- down (&(OCFS_I(inode)->priv_sem));
status = ocfs_verify_update_inode (osb, inode, &needs_trunc,
0);
- up (&(OCFS_I(inode)->priv_sem));
up_read(&OCFS_I(inode)->ip_io_sem);
if (needs_trunc)
ocfs_truncate_inode_pages(inode, 0);
@@ -1385,20 +1380,17 @@
fileOff = GET_INODE_FEOFF(inode);
if (attr->ia_valid & ATTR_SIZE) {
- down (&(OCFS_I(inode)->priv_sem));
- if (OCFS_I(inode)->needs_verification) {
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
status = ocfs_verify_update_inode (osb, inode,
&needs_trunc, 0);
if (status < 0) {
LOG_ERROR_STATUS (status);
LOG_TRACE_STR ("TODO: disable volume");
- up (&(OCFS_I(inode)->priv_sem));
error = -EIO;
goto bail;
}
}
- up (&(OCFS_I(inode)->priv_sem));
if (needs_trunc)
ocfs_truncate_inode_pages(inode, 0);
Modified: trunk/src/inc/ocfs.h
===================================================================
--- trunk/src/inc/ocfs.h 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/inc/ocfs.h 2004-06-16 00:06:08 UTC (rev 1108)
@@ -1107,12 +1107,13 @@
/* These fields are protected by priv_sem */
struct semaphore priv_sem;
__u32 open_hndl_cnt;
- int needs_verification;
__u64 chng_seq_num;
ocfs_extent_map map;
__s64 alloc_size;
__u32 oin_flags;
+ atomic_t ip_needs_verification;
+
/* This protects io on the metadata buffers related to this
* inode. We also consider an "abort_trans" an I/O as it will
* revert the buffer back to a previous state. */
Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/inode.c 2004-06-16 00:06:08 UTC (rev 1108)
@@ -323,6 +323,8 @@
init_rwsem(&i->ip_io_sem);
+ atomic_set(&i->ip_needs_verification, 0);
+
/* These should be set in read_inode2. */
i->alloc_size = 0ULL;
i->feoff = 0ULL;
@@ -1374,7 +1376,7 @@
osb = inode->i_sb->s_fs_info;
blocksize_bits = inode->i_sb->s_blocksize_bits;
/* make sure we're up to date... */
- if (OCFS_I(inode)->needs_verification) {
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
LOG_TRACE_STR ("ocfs_direct_IO_get_blocks: verify oin.");
status = ocfs_verify_update_inode (osb, inode, &needs_trunc,
0);
@@ -1894,12 +1896,13 @@
down_read (&(OCFS_I(inode)->ip_io_sem));
down (&(OCFS_I(inode)->priv_sem));
-
if (INODE_DELETED(inode)) {
+ up (&(OCFS_I(inode)->priv_sem));
LOG_TRACE_STR("inode deleted!\n");
status = -ENOENT;
goto bail;
}
+ up (&(OCFS_I(inode)->priv_sem));
if (osb->publ_map == (1 << osb->node_num)) {
LOG_TRACE_STR ("Only node alive.");
@@ -1907,12 +1910,15 @@
}
/* if I hold cache lock, no revalidate needed */
+ ocfs_acquire_lockres(GET_INODE_LOCKRES(inode), 0);
if (ocfs_is_local_cache_lock(osb, inode)) {
+ ocfs_release_lockres(GET_INODE_LOCKRES(inode));
LOG_TRACE_STR("local cache lock\n");
goto bail;
}
+ ocfs_release_lockres(GET_INODE_LOCKRES(inode));
- OCFS_I(inode)->needs_verification = 1;
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
status = ocfs_verify_update_inode(osb, inode, &needs_trunc, 0);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -1920,7 +1926,6 @@
}
bail:
- up (&(OCFS_I(inode)->priv_sem));
up_read (&(OCFS_I(inode)->ip_io_sem));
if (needs_trunc)
@@ -1930,7 +1935,7 @@
LOG_EXIT_STATUS(status);
return(status);
-}
+} /* ocfs_inode_revalidate */
/*
* ocfs_verify_update_inode()
@@ -1941,6 +1946,7 @@
struct buffer_head *fe_bh = NULL;
ocfs_file_entry *fe = NULL;
__u64 offset;
+ int drop_priv_sem = 0;
/* We are setting the oin Updated flag in the end. */
LOG_ENTRY ();
@@ -1959,18 +1965,25 @@
goto leave;
}
+ down(&OCFS_I(inode)->priv_sem);
if (INODE_DELETED(inode)) {
+ up(&OCFS_I(inode)->priv_sem);
LOG_TRACE_ARGS("Inode %llu was marked as deleted!",
GET_INODE_FEOFF(inode));
status = -ENOENT;
goto leave;
}
+ up(&OCFS_I(inode)->priv_sem);
status = ocfs_read_bh(osb, offset, &fe_bh, OCFS_BH_COND_CACHED, inode);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
+
+ down(&OCFS_I(inode)->priv_sem);
+ drop_priv_sem = 1;
+
fe = OCFS_BH_GET_DATA_READ(fe_bh);
/* Make sure that what we found is not a directory. */
@@ -2081,14 +2094,20 @@
OCFS_BH_PUT_DATA(fe_bh);
fe = NULL;
+ up(&OCFS_I(inode)->priv_sem);
+ drop_priv_sem = 0;
+
status = ocfs_update_lockres (osb, GET_INODE_FEOFF(inode), &fe_bh,
NULL, 0, inode, 0, lockres_locked);
status = 0;
leave:
if (status == 0)
- OCFS_I(inode)->needs_verification = 0;
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
+ if (drop_priv_sem)
+ up(&OCFS_I(inode)->priv_sem);
+
if (fe_bh) {
if (fe)
OCFS_BH_PUT_DATA(fe_bh);
Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/namei.c 2004-06-16 00:06:08 UTC (rev 1108)
@@ -1044,10 +1044,8 @@
/* if our caching is working right, then after the
* verify_update_inode, newfe->i_nlink ==
* new_inode->i_nlink */
- down (&(OCFS_I(new_inode)->priv_sem));
status = ocfs_verify_update_inode (osb, new_inode,
&needs_trunc, 0);
- up (&(OCFS_I(new_inode)->priv_sem));
if (needs_trunc)
ocfs_truncate_inode_pages(new_inode, 0);
Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c 2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/nm.c 2004-06-16 00:06:08 UTC (rev 1108)
@@ -874,13 +874,11 @@
switch (vote_type) {
case UPDATE_OIN_INODE:
LOG_TRACE_STR("UPDATE_OIN_INODE");
- down (&(OCFS_I(inode)->priv_sem));
- OCFS_I(inode)->needs_verification = 1;
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
tmpstat = ocfs_verify_update_inode(osb, inode,
&needs_trunc, 1);
if (tmpstat < 0)
LOG_ERROR_STATUS (tmpstat);
- up (&(OCFS_I(inode)->priv_sem));
if (needs_trunc) {
if (inode)
ocfs_truncate_inode_pages(inode, 0);
@@ -925,8 +923,7 @@
case DELETE_ACQUIRE:
LOG_TRACE_STR("DELETE_ACQUIRE");
- down (&(OCFS_I(inode)->priv_sem));
- OCFS_I(inode)->needs_verification = 1;
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
tmpstat = ocfs_verify_update_inode(osb, inode,
&needs_trunc,
1);
@@ -948,6 +945,7 @@
inode->i_nlink = 0;
}
+ down (&(OCFS_I(inode)->priv_sem));
/* vote no if the file is still open. */
if (OCFS_I(inode)->open_hndl_cnt > 0) {
vote_response = FLAG_VOTE_OIN_ALREADY_INUSE;
More information about the Ocfs2-commits
mailing list