[Ocfs2-commits] mfasheh commits r1568 - trunk/src
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Wed Oct 13 18:51:49 CDT 2004
Author: mfasheh
Date: 2004-10-13 18:51:47 -0500 (Wed, 13 Oct 2004)
New Revision: 1568
Modified:
trunk/src/24io.c
trunk/src/alloc.c
trunk/src/alloc.h
trunk/src/aops.c
trunk/src/bitmap.c
trunk/src/bitmap.h
trunk/src/buffer_head_io.c
trunk/src/dir.c
trunk/src/dlm.c
trunk/src/extmap.c
trunk/src/extmap.h
trunk/src/file.c
trunk/src/inode.c
trunk/src/journal.c
trunk/src/localalloc.c
trunk/src/namei.c
trunk/src/nm.c
trunk/src/ocfs.h
trunk/src/ocfs_journal.h
trunk/src/suballoc.c
trunk/src/super.c
Log:
* massive local locking changes.
- get rid of ip_sem - everywhere we used to use it uses the ip_lock
spinlock now.
- turn the zillion identical extent_map_init/extent_map_destroy
calls into extent_map_trunc, which requires you hold ip_lock.
- ip_io_sem has now been relegated to protecting io in the read/write
function and journal_access.
- instead, we use i_sem to serialize changes on everything, including
system files.
- implement a proper local node alloc_sem, much like ext3's truncate_sem.
This protects read/write from looking up the allocation while
extend/truncate is changing it.
- rename ip_extend_sem -> ip_node_extend_sem. This is going away soon
anyway.
Modified: trunk/src/24io.c
===================================================================
--- trunk/src/24io.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/24io.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -42,7 +42,7 @@
vbo = (__s64) iblock << osb->s_sectsize_bits;
err = ocfs_lookup_file_allocation(osb, vbo, &lbo, len, NULL,
- inode, 1);
+ inode);
if (err < 0) {
LOG_ERROR_STATUS (err);
err = -1;
Modified: trunk/src/alloc.c
===================================================================
--- trunk/src/alloc.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/alloc.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -169,7 +169,7 @@
goto bail;
}
- status = ocfs_journal_access(handle, bitmap_bh,
+ status = ocfs_journal_access(handle, bitmap_inode, bitmap_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -177,7 +177,8 @@
}
fe = (ocfs2_dinode *) bitmap_bh->b_data;
- ocfs_clear_bits(osb->sb, handle, bitmap, start_cluster, num_clusters);
+ ocfs_clear_bits(osb->sb, handle, bitmap_inode, bitmap, start_cluster,
+ num_clusters);
fe->id1.bitmap1.i_used -= num_clusters;
status = ocfs_journal_dirty(handle, bitmap_bh);
@@ -275,7 +276,7 @@
set_buffer_uptodate(bhs[i]);
SET_BH_SEQNUM(inode, bhs[i]);
- status = ocfs_journal_access(handle, bhs[i],
+ status = ocfs_journal_access(handle, inode, bhs[i],
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -403,7 +404,7 @@
OCFS_ASSERT(IS_VALID_EXTENT_BLOCK(eb));
eb_el = &eb->h_list;
- status = ocfs_journal_access(handle, bh,
+ status = ocfs_journal_access(handle, inode, bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -434,20 +435,20 @@
* journal_dirty erroring as it won't unless we've aborted the
* handle (in which case we would never be here) so reserving
* the write with journal_access is all we need to do. */
- status = ocfs_journal_access(handle, last_eb_bh,
+ status = ocfs_journal_access(handle, inode, last_eb_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
}
- status = ocfs_journal_access(handle, fe_bh,
+ status = ocfs_journal_access(handle, inode, fe_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
}
if (eb_bh) {
- status = ocfs_journal_access(handle, eb_bh,
+ status = ocfs_journal_access(handle, inode, eb_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -531,7 +532,7 @@
fe = (ocfs2_dinode *) fe_bh->b_data;
fe_el = &fe->id2.i_list;
- status = ocfs_journal_access(handle, new_eb_bh,
+ status = ocfs_journal_access(handle, inode, new_eb_bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -553,7 +554,7 @@
goto bail;
}
- status = ocfs_journal_access(handle, fe_bh,
+ status = ocfs_journal_access(handle, inode, fe_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -617,7 +618,7 @@
LOG_ENTRY();
- status = ocfs_journal_access(handle, fe_bh,
+ status = ocfs_journal_access(handle, inode, fe_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -658,7 +659,7 @@
eb = (ocfs2_extent_block *) eb_bhs[i]->b_data;
OCFS_ASSERT_RO(IS_VALID_EXTENT_BLOCK(eb));
- status = ocfs_journal_access(handle, eb_bhs[i],
+ status = ocfs_journal_access(handle, inode, eb_bhs[i],
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -944,7 +945,7 @@
int ocfs_lookup_file_allocation(ocfs_super *osb, __s64 Vbo,
__s64 *Lbo, __u32 bytecount,
__s64 *contig_bytes,
- struct inode *inode, int locked)
+ struct inode *inode)
{
int status;
ocfs2_dinode *fe = NULL;
@@ -956,7 +957,6 @@
__s64 localVbo;
__u64 cnt;
__u32 NumIndex;
- int have_io_sem = 0;
LOG_ENTRY_ARGS("(vbo=%llu, bytecount=%u, inode=%llu)\n", Vbo, bytecount,
OCFS_I(inode)->ip_blkno);
@@ -964,40 +964,19 @@
OCFS_ASSERT (osb);
OCFS_ASSERT (inode);
- /* for direct io we want to skip all locking. If you're a
- * system file, ip_io_sem should already have been taken
- * before coming here. */
- if (((OCFS_I(inode)->ip_open_flags & OCFS_OIN_OPEN_FOR_DIRECTIO)
- || OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE)
- && (!locked))
- printk("ocfs2: inode %lu, locked = %d, open direct = %u, "
- "sysfile = %u\n", inode->i_ino, locked,
- (OCFS_I(inode)->ip_open_flags & OCFS_OIN_OPEN_FOR_DIRECTIO),
- (OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE));
-
- if (!locked)
- down(&(OCFS_I(inode)->ip_sem));
-
/* Make sure we're not trying to read past end of file --
* alloc_size should be up to date as any nodes changing it
* will have sent us an UPDATE_INODE message. */
if (Vbo >= OCFS_I(inode)->ip_alloc_size) {
- if (!locked)
- up(&(OCFS_I(inode)->ip_sem));
status = -EIO;
LOG_ERROR_STATUS(status);
goto finally;
}
-check_alloc_sz:
- status = 0;
-
status = ocfs_lookup_extent_map_entry(osb,
&(OCFS_I(inode)->ip_ext_map),
Vbo, Lbo, &cnt, &NumIndex);
- if (!locked)
- up(&(OCFS_I(inode)->ip_sem));
if (status &&
(cnt >= (u64)bytecount)) {
@@ -1008,19 +987,6 @@
/* Ok, we didn't find it in the extent map (or we need to
* refresh as alloc sizes don't match up. */
-
- if (!locked && !have_io_sem) {
- /* yay for lock ordering. We must take ip_io_sem
- * before ip_sem. */
- down_read(&OCFS_I(inode)->ip_io_sem);
- down(&OCFS_I(inode)->ip_sem);
- have_io_sem = 1;
-
- /* check one more time in case someone has updated the
- * extent map underneath us. */
- goto check_alloc_sz;
- }
-
remainingLength = (u64)bytecount;
localVbo = Vbo;
@@ -1054,13 +1020,9 @@
}
if (!fe->id2.i_list.l_tree_depth) {
- if (!locked)
- down(&(OCFS_I(inode)->ip_sem));
status = ocfs_update_extent_map(osb,
&OCFS_I(inode)->ip_ext_map, fe,
NULL, NULL, LOCAL_EXT);
- if (!locked)
- up(&(OCFS_I(inode)->ip_sem));
if (status < 0) {
LOG_ERROR_STATUS (status);
goto finally;
@@ -1078,15 +1040,11 @@
eb = (ocfs2_extent_block *) eb_bh->b_data;
while (1) {
- if (!locked)
- down(&(OCFS_I(inode)->ip_sem));
status = ocfs_update_extent_map(osb,
&OCFS_I(inode)->ip_ext_map,
eb, &localVbo,
&remainingLength,
NONLOCAL_EXT);
- if (!locked)
- up(&(OCFS_I(inode)->ip_sem));
if (status < 0) {
LOG_ERROR_STATUS(status);
goto finally;
@@ -1131,8 +1089,6 @@
}
}
- if (!locked)
- down(&(OCFS_I(inode)->ip_sem));
status = ocfs_lookup_extent_map_entry(osb,
&(OCFS_I(inode)->ip_ext_map),
Vbo, Lbo, &cnt, &NumIndex);
@@ -1147,8 +1103,6 @@
OCFS_I(inode)->ip_ext_map.count, inode->i_ino,
OCFS_I(inode)->ip_alloc_size, cnt);
}
- if (!locked)
- up(&(OCFS_I(inode)->ip_sem));
success:
/* want to return cnt only if asked for it */
@@ -1158,8 +1112,6 @@
LOG_TRACE_ARGS("returning contig_bytes=%lld, lbo=%lld\n", cnt, *Lbo);
finally:
- if (have_io_sem)
- up_read(&OCFS_I(inode)->ip_io_sem);
if (fe_bh)
brelse(fe_bh);
@@ -1387,7 +1339,8 @@
*num_bits = best_fit_bits;
/* cool, we've got some. set them now. */
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, bitmap_inode, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -1401,8 +1354,8 @@
goto bail;
}
- ocfs_set_bits(osb->sb, handle, &osb->cluster_bitmap, *bit_off,
- *num_bits);
+ ocfs_set_bits(osb->sb, handle, bitmap_inode, &osb->cluster_bitmap,
+ *bit_off, *num_bits);
atomic_inc(&osb->alloc_stats.bitmap_data);
#warning "implement this"
@@ -1504,6 +1457,7 @@
goto bail;
}
+ ocfs_handle_add_inode(handle, bitmap_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE,
0, &bh, bitmap_inode);
if (status < 0) {
@@ -1513,7 +1467,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, bitmap_inode);
- ocfs_handle_add_inode(handle, bitmap_inode);
fe = (ocfs2_dinode *) bh->b_data;
free_bits = le32_to_cpu(fe->id1.bitmap1.i_total) -
@@ -1657,17 +1610,18 @@
if (last_eb_bh)
last_eb = (ocfs2_extent_block *) last_eb_bh->b_data;
- status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
}
el = &(fe->id2.i_list);
- down (&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
OCFS_I(inode)->ip_alloc_size =
(u64)(fe->i_clusters - clusters_to_del) << osb->s_clustersize_bits;
- up (&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
fe->i_clusters -= clusters_to_del;
fe->i_mtime = OCFS_CURRENT_TIME;
@@ -1712,7 +1666,7 @@
/* If there will be a new last extent block, then by
* definition, there cannot be any leaves to the right of
* him. */
- status = ocfs_journal_access(handle, last_eb_bh,
+ status = ocfs_journal_access(handle, inode, last_eb_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1740,7 +1694,7 @@
OCFS_ASSERT(IS_VALID_EXTENT_BLOCK(eb));
el = &(eb->h_list);
- status = ocfs_journal_access(handle, eb_bh,
+ status = ocfs_journal_access(handle, inode, eb_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1844,6 +1798,8 @@
LOG_ENTRY();
+ down_write(&OCFS_I(inode)->ip_alloc_sem);
+
last_eb_bh = tc->tc_last_eb_bh;
tc->tc_last_eb_bh = NULL;
handle = tc->tc_handle;
@@ -1929,6 +1885,7 @@
if (fe->i_clusters > target_i_clusters)
goto start;
bail:
+ up_write(&OCFS_I(inode)->ip_alloc_sem);
ocfs_commit_trans(handle);
tc->tc_handle = NULL;
@@ -2018,6 +1975,7 @@
goto bail;
}
+ ocfs_handle_add_inode(handle, ext_alloc_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
&ext_alloc_bh, ext_alloc_inode);
if (status < 0) {
@@ -2027,7 +1985,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, ext_alloc_inode);
- ocfs_handle_add_inode(handle, ext_alloc_inode);
}
data_alloc_inode = ocfs_get_system_file_inode(osb, GLOBAL_BITMAP_SYSTEM_INODE, -1);
@@ -2037,6 +1994,7 @@
goto bail;
}
+ ocfs_handle_add_inode(handle, data_alloc_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE,
0, &data_alloc_bh, data_alloc_inode);
if (status < 0) {
@@ -2046,7 +2004,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, data_alloc_inode);
- ocfs_handle_add_inode(handle, data_alloc_inode);
(*tc)->tc_bitmap_inode = data_alloc_inode;
(*tc)->tc_bitmap_bh = data_alloc_bh;
Modified: trunk/src/alloc.h
===================================================================
--- trunk/src/alloc.h 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/alloc.h 2004-10-13 23:51:47 UTC (rev 1568)
@@ -42,8 +42,7 @@
int ocfs_lookup_file_allocation(ocfs_super *osb, __s64 Vbo,
__s64 *Lbo, __u32 blocks,
__s64 *contig_bytes,
- struct inode *inode,
- int locked);
+ struct inode *inode);
typedef struct _ocfs2_alloc_context {
struct inode *ac_inode; /* which bitmap are we allocating from? */
Modified: trunk/src/aops.c
===================================================================
--- trunk/src/aops.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/aops.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -144,32 +144,30 @@
if (S_ISLNK(inode->i_mode)) {
/* this always does I/O for some reason. */
- down_read(&OCFS_I(inode)->ip_io_sem);
err = ocfs_symlink_get_block (inode, iblock, bh_result,
create);
- up_read(&OCFS_I(inode)->ip_io_sem);
goto bail;
}
vbo = (__s64) iblock << inode->i_sb->s_blocksize_bits;
/* this can happen if another node truncs after our extend! */
- down(&OCFS_I(inode)->ip_sem);
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (vbo >= OCFS_I(inode)->ip_alloc_size) {
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
err = -EIO;
goto bail;
}
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
len = inode->i_sb->s_blocksize;
if (!open_direct)
- down_read(&OCFS_I(inode)->ip_extend_sem);
+ down_read(&OCFS_I(inode)->ip_node_extend_sem);
err = ocfs_lookup_file_allocation(OCFS2_SB(inode->i_sb),
vbo, &lbo, len, NULL,
- inode, open_direct);
+ inode);
if (!open_direct)
- up_read(&OCFS_I(inode)->ip_extend_sem);
+ up_read(&OCFS_I(inode)->ip_node_extend_sem);
if (err < 0) {
LOG_ERROR_ARGS("vbo=%lld lbo=%lld len=%u", vbo, lbo, len);
@@ -457,7 +455,7 @@
vbo = (__s64) block << inode->i_sb->s_blocksize_bits;
len = osb->sb->s_blocksize;
err = ocfs_lookup_file_allocation(osb, vbo, &lbo, len, NULL,
- inode, 1);
+ inode);
if (err < 0) {
LOG_ERROR_ARGS ("vbo=%lld lbo=%lld len=%u", vbo,
lbo, len);
@@ -547,7 +545,7 @@
* our logical offset */
/* TODO: Try our damndest to give sizes in multiples of PAGE_SIZE */
status = ocfs_lookup_file_allocation(osb, vbo, &lbo, max_blocks << blocksize_bits,
- &new_size, inode, 1);
+ &new_size, inode);
/* Do whatever we need to the buffer_head */
if (set_new) {
Modified: trunk/src/bitmap.c
===================================================================
--- trunk/src/bitmap.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/bitmap.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -349,8 +349,12 @@
* ocfs_set_bits()
*
*/
-void ocfs_set_bits(struct super_block *sb, ocfs_journal_handle *handle,
- ocfs_alloc_bm * bitmap, __u32 start, __u32 num)
+void ocfs_set_bits(struct super_block *sb,
+ ocfs_journal_handle *handle,
+ struct inode *inode,
+ ocfs_alloc_bm * bitmap,
+ u32 start,
+ u32 num)
{
struct buffer_head *currbh = NULL;
void *buff;
@@ -369,7 +373,8 @@
ocfs_bitmap_block_for_off(sb, start, &i, &local);
currbh = bitmap->chunk[i];
- status = ocfs_journal_access(handle, currbh, OCFS_JOURNAL_ACCESS_UNDO);
+ status = ocfs_journal_access(handle, inode, currbh,
+ OCFS_JOURNAL_ACCESS_UNDO);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -390,7 +395,7 @@
i++;
currbh = bitmap->chunk[i];
- status = ocfs_journal_access(handle, currbh,
+ status = ocfs_journal_access(handle, inode, currbh,
OCFS_JOURNAL_ACCESS_UNDO);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -416,8 +421,11 @@
*
*/
void ocfs_clear_bits(struct super_block *sb,
- ocfs_journal_handle *handle, ocfs_alloc_bm *bitmap,
- __u32 start, __u32 num)
+ ocfs_journal_handle *handle,
+ struct inode *inode,
+ ocfs_alloc_bm *bitmap,
+ u32 start,
+ u32 num)
{
struct buffer_head *currbh = NULL;
void *buff;
@@ -436,7 +444,8 @@
ocfs_bitmap_block_for_off(sb, start, &i, &local);
currbh = bitmap->chunk[i];
- status = ocfs_journal_access(handle, currbh, OCFS_JOURNAL_ACCESS_UNDO);
+ status = ocfs_journal_access(handle, inode, currbh,
+ OCFS_JOURNAL_ACCESS_UNDO);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -462,7 +471,7 @@
i++;
currbh = bitmap->chunk[i];
- status = ocfs_journal_access(handle, currbh,
+ status = ocfs_journal_access(handle, inode, currbh,
OCFS_JOURNAL_ACCESS_UNDO);
if (status < 0) {
LOG_ERROR_STATUS(status);
Modified: trunk/src/bitmap.h
===================================================================
--- trunk/src/bitmap.h 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/bitmap.h 2004-10-13 23:51:47 UTC (rev 1568)
@@ -28,8 +28,11 @@
int ocfs_count_bits(struct super_block *sb, ocfs_alloc_bm *bitmap);
void ocfs_clear_bits(struct super_block *sb,
- ocfs_journal_handle *handle, ocfs_alloc_bm *bitmap,
- __u32 start, __u32 num);
+ ocfs_journal_handle *handle,
+ struct inode *inode,
+ ocfs_alloc_bm *bitmap,
+ u32 start,
+ u32 num);
int ocfs_find_clear_bits(ocfs_super *osb, ocfs_alloc_bm * bitmap,
u32 numBits, u32 *bitoff, u32 *best_fit_bits);
void ocfs_initialize_bitmap(struct super_block *sb,
@@ -38,8 +41,12 @@
void ocfs_reinitialize_bitmap(struct super_block *sb,
ocfs_alloc_bm *bitmap, __u32 validbits,
__u32 allocbits);
-void ocfs_set_bits(struct super_block *sb, ocfs_journal_handle *handle,
- ocfs_alloc_bm *bitmap, __u32 start, __u32 num);
+void ocfs_set_bits(struct super_block *sb,
+ ocfs_journal_handle *handle,
+ struct inode *inode,
+ ocfs_alloc_bm * bitmap,
+ u32 start,
+ u32 num);
void ocfs_uninitialize_bitmap(ocfs_alloc_bm *bitmap);
#endif /* OCFS2_BITMAP_H */
Modified: trunk/src/buffer_head_io.c
===================================================================
--- trunk/src/buffer_head_io.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/buffer_head_io.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -92,9 +92,13 @@
sb = osb->sb;
+ if (inode)
+ down(&OCFS_I(inode)->ip_io_sem);
for (i = 0 ; i < nr ; i++) {
bh = bhs[i];
if (bh == NULL) {
+ if (inode)
+ up(&OCFS_I(inode)->ip_io_sem);
LOG_TRACE_STR("bh == NULL");
status = -EIO;
LOG_ERROR_STATUS(status);
@@ -158,7 +162,9 @@
else
CLEAR_BH_SEQNUM(bh);
}
-
+ if (inode)
+ up(&OCFS_I(inode)->ip_io_sem);
+
bail:
#ifdef OCFS_DBG_TIMING
@@ -214,10 +220,14 @@
sb = osb->sb;
+ if (inode)
+ down(&OCFS_I(inode)->ip_io_sem);
for (i = 0 ; i < nr ; i++) {
if (bhs[i] == NULL) {
bhs[i] = sb_getblk(sb, block++);
if (bhs[i] == NULL) {
+ if (inode)
+ up(&OCFS_I(inode)->ip_io_sem);
LOG_TRACE_STR("bh == NULL");
status = -EIO;
LOG_ERROR_STATUS(status);
@@ -296,6 +306,9 @@
else
CLEAR_BH_SEQNUM(bh);
}
+ if (inode)
+ up(&OCFS_I(inode)->ip_io_sem);
+
LOG_TRACE_ARGS("block=(%llu), nr=(%d), cached=%s\n", block, nr,
(!(flags & OCFS_BH_CACHED) || ignore_cache) ? "no" : "yes");
Modified: trunk/src/dir.c
===================================================================
--- trunk/src/dir.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/dir.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -85,7 +85,6 @@
struct super_block * sb = inode->i_sb;
int have_disk_lock = 0;
ocfs_super *osb = OCFS_SB(sb);
- int have_sem = 0;
LOG_SET_CONTEXT(READDIR);
@@ -103,8 +102,6 @@
goto bail;
}
have_disk_lock = 1;
- down_read(&OCFS_I(inode)->ip_io_sem);
- have_sem = 1;
offset = filp->f_pos & (sb->s_blocksize - 1);
@@ -203,9 +200,6 @@
stored = 0;
bail:
- if (have_sem)
- up_read(&OCFS_I(inode)->ip_io_sem);
-
if (have_disk_lock) {
error = ocfs_release_lock_ro (osb, inode);
if (error < 0)
@@ -219,7 +213,7 @@
/* ocfs_find_files_on_disk()
- * NOTE: this should always be called with parent dir ip_io_sem taken!
+ * NOTE: this should always be called with parent dir i_sem taken!
*/
/* parent off changed to file entry offset of parent! */
int ocfs_find_files_on_disk(ocfs_super *osb, const char *name,
@@ -244,7 +238,6 @@
LOG_ERROR_STATUS (status);
goto leave;
}
- down_read(&OCFS_I(inode)->ip_io_sem);
lock_acq = 1;
}
@@ -261,7 +254,6 @@
if (take_lock && lock_acq)
{
- up_read(&OCFS_I(inode)->ip_io_sem);
tmpstat = ocfs_release_lock_ro (osb, inode);
if (tmpstat < 0) {
LOG_ERROR_STATUS (tmpstat);
@@ -358,9 +350,9 @@
s64 vbo, lbo;
int extend;
- down(&OCFS_I(dir)->ip_sem);
+ spin_lock(&OCFS_I(dir)->ip_lock);
extend = (dir->i_size == OCFS_I(dir)->ip_alloc_size);
- up(&OCFS_I(dir)->ip_sem);
+ spin_unlock(&OCFS_I(dir)->ip_lock);
if (extend) {
status = ocfs_extend_allocation(OCFS_SB(sb), dir, 1,
@@ -377,7 +369,7 @@
lbo = 0;
status = ocfs_lookup_file_allocation(OCFS_SB(sb), vbo, &lbo,
- sb->s_blocksize, NULL, dir, 1);
+ sb->s_blocksize, NULL, dir);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -423,9 +415,9 @@
}
/* dir->i_size is always block aligned. */
- down(&OCFS_I(dir)->ip_sem);
+ spin_lock(&OCFS_I(dir)->ip_lock);
if (dir->i_size == OCFS_I(dir)->ip_alloc_size) {
- up(&OCFS_I(dir)->ip_sem);
+ spin_unlock(&OCFS_I(dir)->ip_lock);
num_free_extents = ocfs_num_free_extents(osb, dir, fe);
if (num_free_extents < 0) {
status = num_free_extents;
@@ -450,7 +442,7 @@
credits = ocfs_calc_extend_credits(sb, fe, 1);
} else {
- up(&OCFS_I(dir)->ip_sem);
+ spin_unlock(&OCFS_I(dir)->ip_lock);
credits = OCFS_SIMPLE_DIR_EXTEND_CREDITS;
}
@@ -469,7 +461,7 @@
set_buffer_uptodate(new_bh);
SET_BH_SEQNUM(dir, new_bh);
- status = ocfs_journal_access(handle, new_bh,
+ status = ocfs_journal_access(handle, dir, new_bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
Modified: trunk/src/dlm.c
===================================================================
--- trunk/src/dlm.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/dlm.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -232,9 +232,6 @@
updated = 0;
again:
- /* yay, lock ordering. at least we don't hold io sem across
- * the whole thing now. */
- down_read(&OCFS_I(inode)->ip_io_sem);
ocfs_acquire_lockres_write (inode);
LOG_TRACE_ARGS("attempting to get lock, pass: %d\n", ++k);
@@ -247,14 +244,12 @@
if (!updated) {
status = ocfs_update_lockres(osb, *bh, inode, 1);
if (status < 0) {
- up_read(&OCFS_I(inode)->ip_io_sem);
ocfs_release_lockres_write (inode);
LOG_ERROR_STATUS (status);
goto finally;
}
updated = 1;
}
- up_read(&OCFS_I(inode)->ip_io_sem);
reevaluate:
no_owner = (lockres->master_node_num == OCFS_INVALID_NODE_NUM);
Modified: trunk/src/extmap.c
===================================================================
--- trunk/src/extmap.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/extmap.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -70,17 +70,13 @@
return;
} /* ocfs_extent_map_init */
-
-/*
- * ocfs_extent_map_destroy()
- *
- */
-void ocfs_extent_map_destroy (ocfs_extent_map * map)
+/* expects you to hold ip_lock. */
+void ocfs_extent_map_trunc(ocfs_extent_map *map)
{
LOG_ENTRY ();
- OCFS_ASSERT (map != NULL);
- spin_lock(&EM_IP(map)->ip_lock);
+ OCFS_ASSERT(map);
+
if (map->initialized) {
struct list_head *tmp, *tmp2;
ocfs_extent *ext;
@@ -91,20 +87,18 @@
ext);
map->count--;
}
- if (map->count!=0) {
+ if (map->count)
LOG_ERROR_ARGS("count too high by %d!",
map->count);
- map->count = 0;
- }
- map->initialized = 0;
}
- spin_unlock(&EM_IP(map)->ip_lock);
+ map->count = 0;
+ map->initialized = 1;
+ INIT_LIST_HEAD(&map->head);
LOG_EXIT ();
return;
-} /* ocfs_extent_map_destroy */
+}
-
/*
* get_overlap_type()
*
Modified: trunk/src/extmap.h
===================================================================
--- trunk/src/extmap.h 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/extmap.h 2004-10-13 23:51:47 UTC (rev 1568)
@@ -31,8 +31,9 @@
ocfs2_extent_rec *rec);
int ocfs_add_extent_map_entry(ocfs_super *osb, ocfs_extent_map *Map,
__s64 Vbo, __s64 Lbo, __u64 ByteCount);
-void ocfs_extent_map_destroy(ocfs_extent_map *map);
void ocfs_extent_map_init(ocfs_extent_map *map);
+void ocfs_extent_map_trunc(ocfs_extent_map *map);
+
unsigned int ocfs_extent_map_get_count(ocfs_extent_map *map);
int ocfs_get_next_extent_map_entry(ocfs_super *osb,
ocfs_extent_map *Map, __u32 RunIndex,
Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/file.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -100,16 +100,16 @@
goto bail;
}
- down(&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (!(OCFS_I(inode)->ip_open_flags & OCFS_IN_FIRST_OPEN))
goto bail;
- up(&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
interruptible_sleep_on(&osb->open_event);
goto again;
bail:
- up(&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
ocfs_unblock_sigs(tmpsig);
return(status);
@@ -142,21 +142,21 @@
}
if (atomic_read(&oip->ip_needs_verification)) {
- down_read (&oip->ip_io_sem);
+ down(&inode->i_sem);
status = ocfs_verify_update_inode (osb, inode);
- up_read(&oip->ip_io_sem);
+ up(&inode->i_sem);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
}
- down(&oip->ip_sem);
+ spin_lock(&oip->ip_lock);
if (!oip->ip_open_cnt++) {
first_open = 1;
oip->ip_open_flags |= OCFS_IN_FIRST_OPEN;
}
- up(&oip->ip_sem);
+ spin_unlock(&oip->ip_lock);
if (!first_open)
status = ocfs_wait_on_first_open(osb, inode);
@@ -164,7 +164,7 @@
if (status < 0) {
if (status != -EINTR)
LOG_ERROR_STATUS(status);
- down(&oip->ip_sem);
+ spin_lock(&oip->ip_lock);
oip->ip_open_cnt--;
goto leave_unlock;
}
@@ -178,7 +178,7 @@
&& (first_open || (mode & (O_WRONLY|O_RDWR))))
status = ocfs_notify_on_open(osb, inode);
- down(&oip->ip_sem);
+ spin_lock(&oip->ip_lock);
if (first_open) {
oip->ip_open_flags &= ~OCFS_IN_FIRST_OPEN;
ocfs_notify_openers(osb);
@@ -225,7 +225,8 @@
}
leave_unlock:
- up(&oip->ip_sem);
+ spin_unlock(&oip->ip_lock);
+
leave:
if (status < 0) {
if (status != -ENOENT && status != -ENOMEM &&
@@ -254,10 +255,10 @@
file->f_dentry->d_name.len,
file->f_dentry->d_name.name);
- down(&oip->ip_sem);
+ spin_lock(&oip->ip_lock);
if (!--oip->ip_open_cnt)
oip->ip_open_flags &= ~OCFS_OIN_OPEN_FOR_DIRECTIO;
- up(&oip->ip_sem);
+ spin_unlock(&oip->ip_lock);
LOG_EXIT_INT(0);
LOG_CLEAR_CONTEXT();
@@ -437,7 +438,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_FILE_UPDATE_OIN,
inode);
- ocfs_handle_add_inode(handle, inode);
/* Start a transaction - need a minimal amount of block credits (1) */
handle = ocfs_start_trans(osb, handle, 1);
@@ -450,7 +450,8 @@
OCFS_ASSERT_RO(IS_VALID_FILE_ENTRY(fe));
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto leave;
@@ -600,9 +601,7 @@
}
if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
- down_read (&(OCFS_I(inode)->ip_io_sem));
status = ocfs_verify_update_inode (osb, inode);
- up_read (&(OCFS_I(inode)->ip_io_sem));
if (status < 0) {
LOG_TRACE_STR ("ocfs_verify_update_inode failed");
LOG_TRACE_STR ("TODO: disable volume");
@@ -638,6 +637,7 @@
}
}
+ down_read(&OCFS_I(inode)->ip_alloc_sem);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
/*
* On a 2.6 kernel, all a filesystem needs to do to support
@@ -663,6 +663,7 @@
else
ret = generic_file_write_nolock (filp, buf, count, ppos);
#endif
+ up_read(&OCFS_I(inode)->ip_alloc_sem);
if (writingAtEOF) {
LOG_TRACE_STR
("Generic_file_write ok, asking for OIN update now");
@@ -743,9 +744,9 @@
do_direct_io = 1;
}
if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
- down_read(&OCFS_I(inode)->ip_io_sem);
+ down(&inode->i_sem);
status = ocfs_verify_update_inode (osb, inode);
- up_read(&OCFS_I(inode)->ip_io_sem);
+ up(&inode->i_sem);
if (status < 0) {
LOG_TRACE_STR ("ocfs_verify_update_inode failed");
LOG_TRACE_STR ("TODO: disable volume");
@@ -754,6 +755,7 @@
}
}
+ down_read(&OCFS_I(inode)->ip_alloc_sem);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
/*
* On a 2.6 kernel, all a filesystem needs to do to support
@@ -777,6 +779,7 @@
else
ret = generic_file_read (filp, buf, count, ppos);
#endif
+ up_read(&OCFS_I(inode)->ip_alloc_sem);
if (ret == -EINVAL)
LOG_ERROR_STR ("Generic_file_read returned -EINVAL");
@@ -833,11 +836,10 @@
goto bail;
}
- down(&oip->ip_sem);
+ spin_lock(&oip->ip_lock);
oip->ip_mmu_private = inode->i_size;
- ocfs_extent_map_destroy(&oip->ip_ext_map);
- ocfs_extent_map_init (&oip->ip_ext_map);
- up(&oip->ip_sem);
+ ocfs_extent_map_trunc(&oip->ip_ext_map);
+ spin_unlock(&oip->ip_lock);
bail:
LOG_EXIT_STATUS(status);
return status;
@@ -907,7 +909,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
FLAG_FILE_TRUNCATE|FLAG_FILE_UPDATE_OIN, inode);
- ocfs_handle_add_inode(handle, inode);
fe = (ocfs2_dinode *) fe_bh->b_data;
OCFS_ASSERT(IS_VALID_FILE_ENTRY(fe));
@@ -1086,7 +1087,8 @@
OCFS_ASSERT(num_bits <= clusters_to_add);
/* reserve our write early -- insert_extent may update the inode */
- status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto leave;
@@ -1103,10 +1105,10 @@
}
fe->i_clusters += num_bits;
- down (&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
OCFS_I(inode)->ip_alloc_size =
(u64)fe->i_clusters << osb->s_clustersize_bits;
- up (&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
status = ocfs_journal_dirty(handle, fe_bh);
if (status < 0) {
@@ -1154,6 +1156,7 @@
int status = 0;
int restart_func = 0;
int skip_overalloc = 0;
+ int drop_alloc_sem = 0;
int credits, num_free_extents;
unsigned int overalloc_bits = 0;
u32 clusters_to_add;
@@ -1188,7 +1191,6 @@
OCFS_LKM_EXMODE,
FLAG_FILE_EXTEND|FLAG_FILE_UPDATE_OIN,
inode);
- ocfs_handle_add_inode(handle, inode);
fe = (ocfs2_dinode *) bh->b_data;
OCFS_ASSERT(IS_VALID_FILE_ENTRY(fe));
@@ -1250,6 +1252,12 @@
goto leave;
}
+ /* blocks peope in read/write from reading our allocation
+ * until we're done changing it. We depend on i_sem to block
+ * other extend/truncate calls while we're here. Ordering wrt
+ * start_trans is important here -- always do it before! */
+ down_write(&OCFS_I(inode)->ip_alloc_sem);
+ drop_alloc_sem = 1;
do_start_trans:
credits = ocfs_calc_extend_credits(osb->sb, fe, clusters_to_add);
handle = ocfs_start_trans(osb, handle, credits);
@@ -1262,7 +1270,8 @@
/* reserve a write to the file entry early on - that we if we
* run out of credits in the allocation path, we can still
* update i_size. */
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto leave;
@@ -1349,6 +1358,10 @@
}
leave:
+ if (drop_alloc_sem) {
+ up_write(&OCFS_I(inode)->ip_alloc_sem);
+ drop_alloc_sem = 0;
+ }
if (handle) {
ocfs_commit_trans(handle);
handle = NULL;
@@ -1430,19 +1443,6 @@
/* get the file and parent offsets, and the file oin if present */
if (attr->ia_valid & ATTR_SIZE) {
- if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
- LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
- down_read(&OCFS_I(inode)->ip_io_sem);
- status = ocfs_verify_update_inode (osb, inode);
- up_read(&OCFS_I(inode)->ip_io_sem);
- if (status < 0) {
- LOG_ERROR_STATUS (status);
- LOG_TRACE_STR ("TODO: disable volume");
- error = -EIO;
- goto bail;
- }
- }
-
if (inode->i_size > newsize) {
ocfs_truncate_inode_pages(inode, newsize);
status = ocfs_truncate_file(osb, newsize,
@@ -1457,7 +1457,7 @@
goto bail;
}
- down (&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
inode->i_size = newsize;
inode->i_blocks = (newsize + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
if (OCFS_I(inode)->ip_open_flags &
@@ -1465,7 +1465,7 @@
/* This is a total broken hack for O_DIRECT crack */
OCFS_I(inode)->ip_mmu_private = inode->i_size;
}
- up (&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
status = ocfs2_zero_extend(inode);
if (status < 0) {
LOG_ERROR_STATUS(status);
Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/inode.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -307,8 +307,7 @@
i->ip_flags = 0;
atomic_set(&i->ip_clean_buffer_seq, 0);
- init_MUTEX(&(i->ip_sem));
- init_rwsem(&(i->ip_extend_sem));
+ init_rwsem(&(i->ip_node_extend_sem));
i->ip_open_cnt = 0;
spin_lock_init(&i->ip_lock);
ocfs_extent_map_init (&i->ip_ext_map);
@@ -317,8 +316,8 @@
i->ip_handle = NULL;
i->ip_next_orphan = NULL;
- init_rwsem(&i->ip_io_sem);
-
+ init_rwsem(&i->ip_alloc_sem);
+ init_MUTEX(&(i->ip_io_sem));
atomic_set(&i->ip_needs_verification, 0);
INIT_LIST_HEAD(&i->ip_pending_locks);
INIT_LIST_HEAD(&i->ip_j_inode);
@@ -686,6 +685,7 @@
LOG_ERROR_STATUS(status);
goto bail;
}
+ ocfs_handle_add_inode(handle, orphan_dir_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
&orphan_dir_bh, orphan_dir_inode);
if (status < 0) {
@@ -694,7 +694,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0,
orphan_dir_inode);
- ocfs_handle_add_inode(handle, orphan_dir_inode);
/* we do this while holding the orphan dir lock because we
* don't want recovery being run from another node to vote for
@@ -712,6 +711,7 @@
LOG_ERROR_STATUS(status);
goto bail;
}
+ ocfs_handle_add_inode(handle, inode_alloc_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
&inode_alloc_bh, inode_alloc_inode);
if (status < 0) {
@@ -720,7 +720,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0,
inode_alloc_inode);
- ocfs_handle_add_inode(handle, inode_alloc_inode);
handle = ocfs_start_trans(osb, handle, OCFS_FILE_DELETE_CREDITS);
if (handle == NULL) {
@@ -737,7 +736,8 @@
}
/* set the inodes dtime */
- status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -818,8 +818,7 @@
goto bail;
}
- ocfs_extent_map_destroy (&OCFS_I(inode)->ip_ext_map);
- ocfs_extent_map_init (&OCFS_I(inode)->ip_ext_map);
+ ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
down(&recovery_list_sem);
list_del(&OCFS_I(inode)->ip_recovery_list);
@@ -878,7 +877,7 @@
*/
tmperr = ocfs_lookup_file_allocation(osb, vbo, &lbo,
osb->sb->s_blocksize, NULL,
- inode, 1);
+ inode);
if (tmperr < 0)
goto fail;
@@ -923,20 +922,19 @@
if (!inode) {
LOG_TRACE_STR("eep, no inode!\n");
status = -ENOENT;
- goto no_inode;
+ goto bail;
}
osb = OCFS_SB(inode->i_sb);
- down_read (&(OCFS_I(inode)->ip_io_sem));
- down (&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (INODE_DELETED(inode)) {
- up (&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
LOG_TRACE_STR("inode deleted!\n");
status = -ENOENT;
goto bail;
}
- up (&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
if (ocfs_node_map_is_only(osb, &osb->publ_map, osb->node_num)) {
LOG_TRACE_STR ("Only node alive.");
@@ -961,9 +959,6 @@
}
bail:
- up_read (&(OCFS_I(inode)->ip_io_sem));
-
-no_inode:
LOG_EXIT_STATUS(status);
LOG_CLEAR_CONTEXT();
@@ -975,7 +970,7 @@
*
* Updates a disk inode from a
* struct inode.
- * Only takes ip_sem.
+ * Only takes ip_lock.
*/
int ocfs_mark_inode_dirty(ocfs_journal_handle *handle,
struct inode *inode,
@@ -988,13 +983,14 @@
#warning "need to check the casts and the endian-ness in this function"
LOG_ENTRY_ARGS("(inode %llu)\n", OCFS_I(inode)->ip_blkno);
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto leave;
}
- down(&OCFS_I(inode)->ip_sem);
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (le32_to_cpu(fe->i_flags) & OCFS2_BITMAP_FL) {
fe->id1.bitmap1.i_used =
cpu_to_le32(OCFS_I(inode)->u.ip_bitinfo.used_bits);
@@ -1004,7 +1000,7 @@
fe->i_clusters =
(u32)OCFS_I(inode)->ip_alloc_size >> osb->s_clustersize_bits;
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
fe->i_size = (u64)inode->i_size;
fe->i_links_count = inode->i_nlink;
@@ -1035,23 +1031,21 @@
* ocfs_refresh_inode
*
* Updates a struct inode from a disk inode.
- * does no i/o, only takes ip_sem.
+ * does no i/o, only takes ip_lock.
*/
int ocfs_refresh_inode(struct inode *inode,
ocfs2_dinode *fe)
{
- ocfs2_extent_list *fel;
int status = 0;
- u32 j;
ocfs_super *osb = OCFS2_SB(inode->i_sb);
- down(&OCFS_I(inode)->ip_sem);
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (INODE_DELETED(inode)) {
LOG_TRACE_ARGS("Inode %llu was marked as deleted!",
OCFS_I(inode)->ip_blkno);
status = -ENOENT;
- goto leave;
+ goto bail;
}
/* Add checks as needed */
@@ -1063,7 +1057,7 @@
LOG_TRACE_STR ("File Entry is invalid");
status = -ENOENT;
- goto leave;
+ goto bail;
}
if (inode->i_generation != le32_to_cpu(fe->i_generation)) {
@@ -1073,7 +1067,7 @@
le32_to_cpu(fe->i_generation));
SET_INODE_DELETED(inode);
status = -ENOENT;
- goto leave;
+ goto bail;
}
if ((OCFS_I(inode)->ip_alloc_size !=
@@ -1091,8 +1085,7 @@
OCFS_I(inode)->ip_blkno,
OCFS_I(inode)->ip_alloc_size,
fe->i_clusters);
- ocfs_extent_map_destroy (&OCFS_I(inode)->ip_ext_map);
- ocfs_extent_map_init (&OCFS_I(inode)->ip_ext_map);
+ ocfs_extent_map_trunc (&OCFS_I(inode)->ip_ext_map);
}
if (le32_to_cpu(fe->i_flags) & OCFS2_BITMAP_FL) {
@@ -1133,23 +1126,12 @@
init_special_inode(inode, inode->i_mode,
huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev)));
}
-
- fel = &fe->id2.i_list;
- if (!fel->l_tree_depth) {
- for (j = 0; j < fel->l_next_free_rec; j++) {
- if (!ocfs_add_extent_map_entry_from_rec(osb->sb,
- &OCFS_I(inode)->ip_ext_map,
- &fel->l_recs[j]))
- goto leave;
- }
- }
}
-leave:
- if (status == 0)
- atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
+ atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
+bail:
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
return(status);
} /* ocfs_refresh_inode */
@@ -1174,15 +1156,15 @@
goto leave;
}
- down(&OCFS_I(inode)->ip_sem);
+ spin_lock(&OCFS_I(inode)->ip_lock);
if (INODE_DELETED(inode)) {
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
LOG_TRACE_ARGS("Inode %llu was marked as deleted!",
OCFS_I(inode)->ip_blkno);
status = -ENOENT;
goto leave;
}
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
status = ocfs_read_block(osb, OCFS_I(inode)->ip_blkno, &fe_bh,
OCFS_BH_CACHED, inode);
Modified: trunk/src/journal.c
===================================================================
--- trunk/src/journal.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/journal.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -474,7 +474,7 @@
atomic_inc(&inode->i_count);
/* we're obviously changing it... */
- down_write(&OCFS_I(inode)->ip_io_sem);
+ down(&inode->i_sem);
/* sanity check */
OCFS_ASSERT(!OCFS_I(inode)->ip_handle);
@@ -500,7 +500,7 @@
OCFS_I(inode)->ip_handle = NULL;
list_del_init(&OCFS_I(inode)->ip_handle_list);
- up_write(&OCFS_I(inode)->ip_io_sem);
+ up(&inode->i_sem);
iput(inode);
}
return;
@@ -658,10 +658,14 @@
/*
* ocfs_journal_access
*/
-int ocfs_journal_access(ocfs_journal_handle *handle, struct buffer_head *bh, int type)
+int ocfs_journal_access(ocfs_journal_handle *handle,
+ struct inode *inode,
+ struct buffer_head *bh,
+ int type)
{
int status;
+ OCFS_ASSERT(inode);
OCFS_ASSERT(handle);
OCFS_ASSERT(bh);
OCFS_ASSERT((handle->flags & OCFS_HANDLE_STARTED));
@@ -681,6 +685,7 @@
BUG();
}
+ down(&OCFS_I(inode)->ip_io_sem);
switch (type) {
case OCFS_JOURNAL_ACCESS_CREATE:
case OCFS_JOURNAL_ACCESS_WRITE:
@@ -694,16 +699,12 @@
default:
status = -EINVAL;
LOG_ERROR_STR("Uknown access type!");
- goto done;
}
+ up(&OCFS_I(inode)->ip_io_sem);
- if (status < 0) {
+ if (status < 0)
LOG_ERROR_ARGS("Error %d getting %d access to buffer!\n",
status, type);
- goto done;
- }
-
-done:
LOG_EXIT_STATUS(status);
return(status);
} /* ocfs_journal_access */
@@ -1095,7 +1096,7 @@
LOG_TRACE_ARGS("Force reading %u blocks\n", totalblks);
status = ocfs_lookup_file_allocation(osb, vbo, &lbo, size, NULL,
- inode, 1);
+ inode);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -1426,8 +1427,10 @@
goto bail;
}
+ down(&orphan_dir_inode->i_sem);
status = ocfs_acquire_lock_ro(osb, orphan_dir_inode);
if (status < 0) {
+ up(&orphan_dir_inode->i_sem);
LOG_ERROR_STATUS(status);
goto bail;
}
@@ -1435,7 +1438,6 @@
offset = 0;
iter = NULL;
- down_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
while(offset < orphan_dir_inode->i_size) {
blk = offset >> sb->s_blocksize_bits;
@@ -1443,7 +1445,7 @@
if (!bh)
status = -EINVAL;
if (status < 0) {
- up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+ up(&orphan_dir_inode->i_sem);
if (bh)
brelse(bh);
LOG_ERROR_STATUS(status);
@@ -1457,7 +1459,7 @@
if (!ocfs_check_dir_entry(orphan_dir_inode,
de, bh, local)) {
- up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+ up(&orphan_dir_inode->i_sem);
status = -EINVAL;
LOG_ERROR_STATUS(status);
brelse (bh);
@@ -1498,7 +1500,7 @@
}
brelse(bh);
}
- up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+ up(&orphan_dir_inode->i_sem);
status = ocfs_release_lock_ro(osb, orphan_dir_inode);
have_disk_lock = 0;
@@ -1525,7 +1527,7 @@
LOG_ERROR_STATUS(tmpstat);
}
- if (orphan_dir_inode)
+ if (orphan_dir_inode)
iput(orphan_dir_inode);
return(status);
Modified: trunk/src/localalloc.c
===================================================================
--- trunk/src/localalloc.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/localalloc.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -240,13 +240,13 @@
/* Take io_sem here to turn off local alloc before another guy
* can come in and start using him. */
- down_write(&oip->ip_io_sem);
+ down(&local_alloc_inode->i_sem);
if (!osb->have_local_alloc) {
- up_write(&oip->ip_io_sem);
+ up(&local_alloc_inode->i_sem);
goto bail;
}
osb->have_local_alloc = 0;
- up_write(&oip->ip_io_sem);
+ up(&local_alloc_inode->i_sem);
handle = ocfs_alloc_handle(osb);
if (!handle) {
@@ -264,6 +264,7 @@
goto bail;
}
+ ocfs_handle_add_inode(handle, main_bm_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE,
0, &main_bm_bh, main_bm_inode);
if (status < 0) {
@@ -273,7 +274,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, main_bm_inode);
- ocfs_handle_add_inode(handle, main_bm_inode);
/* WINDOW_MOVE_CREDITS is a bit heavy... */
handle = ocfs_start_trans(osb, handle, OCFS_WINDOW_MOVE_CREDITS);
@@ -292,7 +292,8 @@
}
memcpy(alloc_copy, alloc, bh->b_size);
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, local_alloc_inode, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -433,6 +434,7 @@
goto bail;
}
+ ocfs_handle_add_inode(handle, main_bm_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE,
0, &main_bm_bh, main_bm_inode);
if (status < 0) {
@@ -442,7 +444,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, main_bm_inode);
- ocfs_handle_add_inode(handle, main_bm_inode);
handle = ocfs_start_trans(osb, handle, OCFS_WINDOW_MOVE_CREDITS);
if (!handle) {
@@ -476,7 +477,7 @@
* ocfs_reserve_local_alloc_bits
*
* make sure we've got at least bitswanted contiguous bits in the
- * local alloc. You lose them when you drop ip_io_sem.
+ * local alloc. You lose them when you drop i_sem.
*
* We will add ourselves to the transaction passed in, but may start
* our own in order to shift windows.
@@ -591,7 +592,8 @@
* delete bits from it! */
*num_bits = bits_wanted;
- status = ocfs_journal_access(handle, osb->local_alloc_bh,
+ status = ocfs_journal_access(handle, local_alloc_inode,
+ osb->local_alloc_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -771,7 +773,7 @@
}
bm_fe = (ocfs2_dinode *) main_bm_bh->b_data;
- status = ocfs_journal_access(handle, main_bm_bh,
+ status = ocfs_journal_access(handle, main_bm_inode, main_bm_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -801,7 +803,8 @@
LOG_TRACE_ARGS("Clearing bit %u in main bitmap\n",
bit_off + LOCAL_ALLOC(alloc)->la_bm_off);
- ocfs_clear_bits(osb->sb, handle, &osb->cluster_bitmap,
+ ocfs_clear_bits(osb->sb, handle, main_bm_inode,
+ &osb->cluster_bitmap,
bit_off + LOCAL_ALLOC(alloc)->la_bm_off,
1);
bm_fe->id1.bitmap1.i_used--;
@@ -980,7 +983,8 @@
}
memcpy(alloc_copy, alloc, osb->local_alloc_bh->b_size);
- status = ocfs_journal_access(handle, osb->local_alloc_bh,
+ status = ocfs_journal_access(handle, local_alloc_inode,
+ osb->local_alloc_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/namei.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -213,7 +213,7 @@
set_buffer_uptodate(new_bh);
SET_BH_SEQNUM(inode, new_bh);
- status = ocfs_journal_access(handle, new_bh,
+ status = ocfs_journal_access(handle, inode, new_bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -329,7 +329,6 @@
goto leave;
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
- ocfs_handle_add_inode(handle, dir);
dirfe = (ocfs2_dinode *) parent_fe_bh->b_data;
if (!dirfe->i_links_count) {
@@ -404,7 +403,7 @@
goto leave;
}
- status = ocfs_journal_access(handle, parent_fe_bh,
+ status = ocfs_journal_access(handle, dir, parent_fe_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -504,7 +503,7 @@
set_buffer_uptodate(*new_fe_bh);
SET_BH_SEQNUM(inode, *new_fe_bh);
- status = ocfs_journal_access(handle, *new_fe_bh,
+ status = ocfs_journal_access(handle, inode, *new_fe_bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -668,7 +667,6 @@
goto bail;
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
- ocfs_handle_add_inode(handle, dir);
err = ocfs_prepare_dir_for_insert(osb, dir, parent_fe_bh,
dentry->d_name.name,
@@ -686,7 +684,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_FILE_UPDATE_OIN,
inode);
- ocfs_handle_add_inode(handle, inode);
fe = (ocfs2_dinode *) fe_bh->b_data;
if (fe->i_links_count >= OCFS2_LINK_MAX) {
@@ -701,7 +698,8 @@
goto bail;
}
- err = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ err = ocfs_journal_access(handle, inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (err < 0) {
LOG_ERROR_STATUS(err);
goto bail;
@@ -797,7 +795,6 @@
goto leave;
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
- ocfs_handle_add_inode(handle, dir);
/* this will re-read the directory now with the EXCLUSIVE */
/* lock already held; it will also return the blkno to us */
@@ -822,7 +819,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_RELEASE_DENTRY,
inode);
- ocfs_handle_add_inode(handle, inode);
if (S_ISDIR (inode->i_mode)) {
if (!ocfs_empty_dir(inode)) {
@@ -850,7 +846,8 @@
goto leave;
}
- status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
@@ -893,7 +890,7 @@
if (S_ISDIR (inode->i_mode)) {
ocfs2_dinode *dirfe;
- status = ocfs_journal_access(handle, parent_node_bh,
+ status = ocfs_journal_access(handle, dir, parent_node_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1014,7 +1011,6 @@
goto bail;
}
ocfs_handle_add_lock(handle, type2, flags2, inode2);
- ocfs_handle_add_inode(handle, inode2);
}
/* lock id1 */
status = ocfs_acquire_lock(osb, type1, flags1,
@@ -1024,7 +1020,6 @@
goto bail;
}
ocfs_handle_add_lock(handle, type1, flags1, inode1);
- ocfs_handle_add_inode(handle, inode1);
bail:
LOG_EXIT_STATUS(status);
return(status);
@@ -1134,7 +1129,6 @@
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
FLAG_RELEASE_DENTRY|FLAG_FILE_RENAME,
old_inode);
- ocfs_handle_add_inode(handle, old_inode);
status = -EIO;
old_inode_de_bh = ocfs_bread (old_inode, 0, &status, 0);
@@ -1212,7 +1206,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
FLAG_RELEASE_DENTRY, new_inode);
- ocfs_handle_add_inode(handle, new_inode);
newfe = (ocfs2_dinode *) newfe_bh->b_data;
@@ -1256,7 +1249,7 @@
goto bail;
}
}
- status = ocfs_journal_access(handle, newfe_bh,
+ status = ocfs_journal_access(handle, new_inode, newfe_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -1274,7 +1267,7 @@
}
/* change the dirent to point to the correct inode */
- status = ocfs_journal_access(handle, new_de_bh,
+ status = ocfs_journal_access(handle, new_dir, new_de_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -1323,7 +1316,8 @@
}
old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
if (old_inode_de_bh) {
- status = ocfs_journal_access(handle, old_inode_de_bh,
+ status = ocfs_journal_access(handle, old_inode,
+ old_inode_de_bh,
OCFS_JOURNAL_ACCESS_WRITE);
PARENT_INO(old_inode_de_bh->b_data) =
le64_to_cpu(OCFS_I(new_dir)->ip_blkno);
@@ -1348,7 +1342,10 @@
(int)new_dir_nlink, new_dir->i_nlink);
} else {
ocfs2_dinode *fe;
- status = ocfs_journal_access(handle, new_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle,
+ new_dir,
+ new_dir_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
fe = (ocfs2_dinode *) new_dir_bh->b_data;
fe->i_links_count = new_dir->i_nlink;
status = ocfs_journal_dirty(handle, new_dir_bh);
@@ -1362,7 +1359,8 @@
(int)old_dir_nlink, old_dir->i_nlink);
} else {
ocfs2_dinode *fe;
- status = ocfs_journal_access(handle, old_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, old_dir,
+ old_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
fe = (ocfs2_dinode *) old_dir_bh->b_data;
fe->i_links_count = old_dir->i_nlink;
status = ocfs_journal_dirty(handle, old_dir_bh);
@@ -1446,7 +1444,7 @@
memset(bhs, 0, sizeof(struct buffer_head *) * blocks);
status = ocfs_lookup_file_allocation(osb, 0, &logical, sb->s_blocksize, &contig,
- inode, 1);
+ inode);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -1479,7 +1477,7 @@
set_buffer_uptodate(bhs[virtual]);
SET_BH_SEQNUM(inode, bhs[virtual]);
- status = ocfs_journal_access(handle, bhs[virtual],
+ status = ocfs_journal_access(handle, inode, bhs[virtual],
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1583,7 +1581,6 @@
goto bail;
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
- ocfs_handle_add_inode(handle, dir);
dirfe = (ocfs2_dinode *) parent_fe_bh->b_data;
if (!dirfe->i_links_count) {
@@ -1773,7 +1770,7 @@
(le16_to_cpu(de->rec_len) >= rec_len)) ||
(le16_to_cpu(de->rec_len) >=
(OCFS2_DIR_REC_LEN(de->name_len) + rec_len))) {
- status = ocfs_journal_access(handle, insert_bh,
+ status = ocfs_journal_access(handle, dir, insert_bh,
OCFS_JOURNAL_ACCESS_WRITE);
/* By now the buffer is marked for journaling */
offset += le16_to_cpu(de->rec_len);
@@ -1835,7 +1832,8 @@
goto bail;
}
if (de == de_del) {
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, dir, bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
status = -EIO;
goto bail;
@@ -2072,7 +2070,7 @@
goto leave;
}
- /* disk lock orphan dir here. */
+ ocfs_handle_add_inode(handle, orphan_dir_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
&orphan_dir_bh, orphan_dir_inode);
if (status < 0) {
@@ -2081,7 +2079,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0,
orphan_dir_inode);
- ocfs_handle_add_inode(handle, orphan_dir_inode);
status = ocfs_prepare_dir_for_insert(osb, orphan_dir_inode,
orphan_dir_bh, name, namelen,
@@ -2141,7 +2138,7 @@
goto leave;
}
- status = ocfs_journal_access(handle, orphan_dir_bh,
+ status = ocfs_journal_access(handle, orphan_dir_inode, orphan_dir_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -2233,7 +2230,7 @@
goto leave;
}
- status = ocfs_journal_access(handle, orphan_dir_bh,
+ status = ocfs_journal_access(handle,orphan_dir_inode, orphan_dir_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/nm.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -299,8 +299,8 @@
}
/* ok, we're going to have to take the extend sem. We can't do
- * this holding ip_sem so we drop it and recheck after we've
- * got it. */
+ * this holding ip_node_extend_sem so we drop it and recheck after
+ * we've got it. */
spin_unlock(&oin_num_ext_lock);
/* take the extend_sem on behalf of
@@ -310,7 +310,7 @@
* effect of locking out
* lookup_file_allocation on this
* inode. */
- down_write(&OCFS_I(inode)->ip_extend_sem);
+ down_write(&OCFS_I(inode)->ip_node_extend_sem);
atomic_inc(&inode->i_count);
@@ -366,7 +366,7 @@
list_del(&OCFS_I(inode)->ip_recovery_list);
INIT_LIST_HEAD(&OCFS_I(inode)->ip_recovery_list);
- up_write(&OCFS_I(inode)->ip_extend_sem);
+ up_write(&OCFS_I(inode)->ip_node_extend_sem);
dec = 1;
}
@@ -393,16 +393,16 @@
/* force this as ours may be out of date. */
inode->i_nlink = 0;
- down (&(OCFS_I(inode)->ip_sem));
+ spin_lock(&OCFS_I(inode)->ip_lock);
/* vote no if the file is still open. */
if (OCFS_I(inode)->ip_open_cnt > 0) {
LOG_TRACE_PROCESS_VOTE("open count = %u\n",
OCFS_I(inode)->ip_open_cnt);
- up(&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
status = 0;
goto done;
}
- up(&(OCFS_I(inode)->ip_sem));
+ spin_unlock(&OCFS_I(inode)->ip_lock);
/* vote no if someone's extending it. */
spin_lock(&oin_num_ext_lock);
@@ -441,10 +441,9 @@
d_prune_aliases (inode);
sync_mapping_buffers(inode->i_mapping);
ocfs_truncate_inode_pages(inode, 0);
- down(&OCFS_I(inode)->ip_sem);
- ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map);
- ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map);
- up(&OCFS_I(inode)->ip_sem);
+ spin_lock(&OCFS_I(inode)->ip_lock);
+ ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
}
@@ -694,13 +693,13 @@
BUG();
}
ocfs_truncate_inode_pages(inode, 0);
- down(&OCFS_I(inode)->ip_sem);
- ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map);
- ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map);
+ spin_lock(&OCFS_I(inode)->ip_lock);
+ ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
+
/* truncate may send this */
if (flags & FLAG_FILE_UPDATE_OIN)
atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
- up(&OCFS_I(inode)->ip_sem);
+ spin_unlock(&OCFS_I(inode)->ip_lock);
}
return 0;
}
@@ -992,7 +991,7 @@
OCFS_I(inode)->ip_num_extends = 0;
list_del(&OCFS_I(inode)->ip_recovery_list);
INIT_LIST_HEAD(&OCFS_I(inode)->ip_recovery_list);
- up_write(&OCFS_I(inode)->ip_extend_sem);
+ up_write(&OCFS_I(inode)->ip_node_extend_sem);
spin_unlock(&oin_num_ext_lock);
up (&recovery_list_sem);
Modified: trunk/src/ocfs.h
===================================================================
--- trunk/src/ocfs.h 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/ocfs.h 2004-10-13 23:51:47 UTC (rev 1568)
@@ -333,7 +333,6 @@
typedef struct _ocfs_extent_map
{
- spinlock_t lock;
__u32 count;
int initialized;
struct list_head head;
@@ -377,22 +376,20 @@
u64 ip_blkno;
- /* These fields are protected by ip_sem */
- struct semaphore ip_sem;
+ /* protects allocation changes on this inode. */
+ struct rw_semaphore ip_alloc_sem;
+
+ /* These fields are protected by ip_lock */
+ spinlock_t ip_lock;
__u32 ip_open_cnt;
__s64 ip_alloc_size;
__s64 ip_mmu_private;
__u32 ip_open_flags;
-
- spinlock_t ip_lock;
ocfs_extent_map ip_ext_map;
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. */
- struct rw_semaphore ip_io_sem;
+ struct semaphore ip_io_sem;
/* Used by the journalling code to attach an inode to a
* handle. These are protected by ip_io_sem in order to lock
@@ -401,8 +398,8 @@
struct list_head ip_handle_list;
struct _ocfs_journal_handle *ip_handle;
- /* ip_extend_sem locks out extends on behalf of other nodes. */
- struct rw_semaphore ip_extend_sem;
+ /* ip_node_extend_sem locks out extends on behalf of other nodes. */
+ struct rw_semaphore ip_node_extend_sem;
struct list_head ip_recovery_list;/* protected by recovery_list_sem */
__s32 ip_num_extends; /* protected by oin_num_ext_lock */
Modified: trunk/src/ocfs_journal.h
===================================================================
--- trunk/src/ocfs_journal.h 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/ocfs_journal.h 2004-10-13 23:51:47 UTC (rev 1568)
@@ -269,7 +269,9 @@
#define OCFS_JOURNAL_ACCESS_WRITE 1
#define OCFS_JOURNAL_ACCESS_UNDO 2
int ocfs_journal_access(ocfs_journal_handle *handle,
- struct buffer_head *bh, int type);
+ struct inode *inode,
+ struct buffer_head *bh,
+ int type);
/*
* A word about the journal_access/journal_dirty "dance". It is
* entirely legal to journal_access a buffer more than once (as long
@@ -292,7 +294,8 @@
int ocfs_journal_dirty(ocfs_journal_handle *handle,
struct buffer_head *bh);
void ocfs_handle_add_lock(ocfs_journal_handle *handle,
- __u32 type, __u32 flags,
+ __u32 type,
+ __u32 flags,
struct inode *inode);
/*
* Use this to protect from other processes reading buffer state while
Modified: trunk/src/suballoc.c
===================================================================
--- trunk/src/suballoc.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/suballoc.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -74,11 +74,13 @@
u16 *bit_off,
u16 *bits_found);
static inline int ocfs_block_group_set_bits(ocfs_journal_handle *handle,
+ struct inode *alloc_inode,
ocfs2_group_desc *bg,
struct buffer_head *group_bh,
unsigned int bit_off,
unsigned int num_bits);
static int ocfs_relink_block_group(ocfs_journal_handle *handle,
+ struct inode *alloc_inode,
struct buffer_head *fe_bh,
struct buffer_head *bg_bh,
struct buffer_head *prev_bg_bh,
@@ -104,6 +106,7 @@
set_buffer_uptodate(bg_bh);
SET_BH_SEQNUM(alloc_inode, bg_bh);
status = ocfs_journal_access(handle,
+ alloc_inode,
bg_bh,
OCFS_JOURNAL_ACCESS_CREATE);
if (status < 0) {
@@ -303,7 +306,8 @@
bg = (ocfs2_group_desc *) bg_bh->b_data;
- status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, alloc_inode,
+ bh, OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -320,18 +324,18 @@
fe->i_clusters += cl->cl_cpg;
status = ocfs_journal_dirty(handle, bh);
- if (status < 0) {
+ if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
}
- down (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_lock(&OCFS_I(alloc_inode)->ip_lock);
OCFS_I(alloc_inode)->ip_alloc_size =
(u64)fe->i_clusters << osb->s_clustersize_bits;
fe->i_size = OCFS_I(alloc_inode)->ip_alloc_size;
OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
OCFS_I(alloc_inode)->u.ip_bitinfo.total_bits = fe->id1.bitmap1.i_total;
- up (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
alloc_inode->i_size = fe->i_size;
alloc_inode->i_blocks = (alloc_inode->i_size + osb->sb->s_blocksize - 1) >> osb->sb->s_blocksize_bits;
@@ -368,6 +372,7 @@
OCFS_ASSERT(!(handle->flags & OCFS_HANDLE_STARTED));
+ ocfs_handle_add_inode(handle, alloc_inode);
status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE,
0, &bh, alloc_inode);
if (status < 0) {
@@ -377,7 +382,6 @@
}
ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE,
0, alloc_inode);
- ocfs_handle_add_inode(handle, alloc_inode);
fe = (ocfs2_dinode *) bh->b_data;
OCFS_ASSERT_RO(IS_VALID_FILE_ENTRY(fe));
@@ -562,6 +566,7 @@
}
static inline int ocfs_block_group_set_bits(ocfs_journal_handle *handle,
+ struct inode *alloc_inode,
ocfs2_group_desc *bg,
struct buffer_head *group_bh,
unsigned int bit_off,
@@ -578,7 +583,8 @@
LOG_TRACE_ARGS("block_group_set_bits: off = %u, num = %u\n", bit_off,
num_bits);
- status = ocfs_journal_access(handle,
+ status = ocfs_journal_access(handle,
+ alloc_inode,
group_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
@@ -622,6 +628,7 @@
}
static int ocfs_relink_block_group(ocfs_journal_handle *handle,
+ struct inode *alloc_inode,
struct buffer_head *fe_bh,
struct buffer_head *bg_bh,
struct buffer_head *prev_bg_bh,
@@ -647,7 +654,7 @@
bg_ptr = bg->bg_next_group;
prev_bg_ptr = prev_bg->bg_next_group;
- status = ocfs_journal_access(handle, prev_bg_bh,
+ status = ocfs_journal_access(handle, alloc_inode, prev_bg_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -662,7 +669,8 @@
goto bail;
}
- status = ocfs_journal_access(handle, bg_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, alloc_inode, bg_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -676,7 +684,8 @@
goto bail;
}
- status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+ status = ocfs_journal_access(handle, alloc_inode, fe_bh,
+ OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -802,7 +811,8 @@
if ((prev_group_bh)
&& (groups_read > OCFS2_BG_RELINK_TRIGGER)
&& (ocfs_block_group_reasonably_empty(bg))) {
- status = ocfs_relink_block_group(handle, ac->ac_bh, group_bh,
+ status = ocfs_relink_block_group(handle, alloc_inode,
+ ac->ac_bh, group_bh,
prev_group_bh, chain);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -826,7 +836,8 @@
/* we found some. set the info on dinode, chainlist and then
* the group */
status = ocfs_journal_access(handle,
- ac->ac_bh,
+ alloc_inode,
+ ac->ac_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -844,6 +855,7 @@
}
status = ocfs_block_group_set_bits(handle,
+ alloc_inode,
bg,
group_bh,
*bit_off,
@@ -856,9 +868,10 @@
LOG_TRACE_ARGS("Allocated %u bits from suballocator %llu\n",
*num_bits, fe->i_blkno);
- down (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_lock(&OCFS_I(alloc_inode)->ip_lock);
OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
- up (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
+
*bg_blkno = bg->bg_blkno;
bail:
if (group_bh)
@@ -992,7 +1005,7 @@
group = (ocfs2_group_desc *) group_bh->b_data;
OCFS_ASSERT_RO(IS_VALID_GROUP_DESC(group));
- status = ocfs_journal_access(handle, group_bh,
+ status = ocfs_journal_access(handle, alloc_inode, group_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1010,7 +1023,7 @@
goto bail;
}
- status = ocfs_journal_access(handle, alloc_bh,
+ status = ocfs_journal_access(handle, alloc_inode, alloc_bh,
OCFS_JOURNAL_ACCESS_WRITE);
if (status < 0) {
LOG_ERROR_STATUS(status);
@@ -1026,9 +1039,9 @@
goto bail;
}
- down (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_lock(&OCFS_I(alloc_inode)->ip_lock);
OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
- up (&(OCFS_I(alloc_inode)->ip_sem));
+ spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
bail:
if (group_bh)
brelse(group_bh);
Modified: trunk/src/super.c
===================================================================
--- trunk/src/super.c 2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/super.c 2004-10-13 23:51:47 UTC (rev 1568)
@@ -750,10 +750,8 @@
goto bail;
}
- down_read(&OCFS_I(inode)->ip_io_sem);
status = ocfs_read_block(osb, OCFS_I(inode)->ip_blkno, &bh,
OCFS_BH_CACHED, inode);
- up_read(&OCFS_I(inode)->ip_io_sem);
if (status < 0) {
LOG_ERROR_STR("failed to read bitmap data");
ret = -EIO;
@@ -1548,7 +1546,7 @@
}
/* We're in the mount path, pretend locked=1 */
status = ocfs_lookup_file_allocation(osb, 0ULL, &ret, osb->sb->s_blocksize, NULL,
- inode, 1);
+ inode);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
@@ -1612,9 +1610,9 @@
LOG_ERROR_STATUS(status = -EINVAL);
goto bail;
}
- /* We're in the mount path, pretend locked=1 */
+
status = ocfs_lookup_file_allocation(osb, 0ULL, &ret, osb->sb->s_blocksize, NULL,
- inode, 1);
+ inode);
if (status < 0) {
LOG_ERROR_STATUS(status);
goto bail;
More information about the Ocfs2-commits
mailing list