Index: src/journal.c =================================================================== --- src/journal.c (revision 1267) +++ src/journal.c (working copy) @@ -148,6 +148,8 @@ } spin_unlock(&journal->cmt_lock); + if (osb->needs_flush) + ocfs_sync_blockdev(osb->sb); osb->needs_flush = 0; list_for_each_safe(p, n, &commit->c_list) { Index: src/dlm.c =================================================================== --- src/dlm.c (revision 1267) +++ src/dlm.c (working copy) @@ -1038,9 +1038,7 @@ ocfs2_dinode *fe = NULL; struct buffer_head *tmpbh = NULL, **b = NULL; __s16 curr_master; - int lockflags = - (OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE) ? - 0 : OCFS_BH_CACHED; + int lockflags = OCFS_BH_CACHED; int clear_tmp = 0; ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode); @@ -1103,9 +1101,6 @@ if (ocfs_node_map_is_empty(&votemap)) goto finally; - if (!(flags & FLAG_FILE_UPDATE_OIN)) - goto finally; - status = -EAGAIN; while (status == -EAGAIN) { // remove dead nodes @@ -1234,11 +1229,11 @@ flags |= FLAG_RELEASE_LOCK; ocfs_acquire_lockres (lockres, 0); // ocfs_release_lock - + if ((lockres->lock_type == OCFS_LKM_EXMODE) && (lockres->master_node_num == osb->node_num) && - !(flags & FLAG_FILE_DELETE) && !(flags & FLAG_FILE_EXTEND) - && !(FLAG_FILE_TRUNCATE)) { + !(flags & FLAG_FILE_CREATE) && !(flags & FLAG_FILE_DELETE) && + !(flags & FLAG_FILE_EXTEND) && !(flags & FLAG_FILE_TRUNCATE)) { status = 0; goto finally; } Index: src/namei.c =================================================================== --- src/namei.c (revision 1267) +++ src/namei.c (working copy) @@ -722,6 +722,10 @@ goto leave; } + ocfs_handle_set_checkpoint(handle, 0); + ocfs_handle_set_sync(handle, 0); + + /* lock parent directory, yes we use FLAG_FILE_CREATE even * though we're deleting ;) */ status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, @@ -733,6 +737,10 @@ } got_parent = 1; + ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, + FLAG_FILE_CREATE | FLAG_DIR, NULL, parentInode, + 0); + /* this will re-read the directory now with the EXCLUSIVE */ /* lock already held; it will also return the blkno to us */ status = ocfs_find_files_on_disk(osb, dentry->d_name.name, @@ -764,6 +772,10 @@ } got_file = 1; + ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, + FLAG_FILE_CREATE | FLAG_DIR, fe_bh, inode, + 0); + if (S_ISDIR (inode->i_mode)) { if (!empty_dir(inode)) { status = -ENOTEMPTY; @@ -853,25 +865,6 @@ } } - /* need this to alert dentry-owners on other nodes */ - /* Release the file lock if we acquired it */ - if (got_file) { - tmpstat = ocfs_release_lock(osb, OCFS_LKM_EXMODE, - lockFlags, fe_bh, inode); - if (tmpstat < 0) - LOG_ERROR_STATUS(tmpstat); - - } - - if (got_parent) { - tmpstat = ocfs_release_lock(osb, OCFS_LKM_EXMODE, - FLAG_FILE_CREATE|FLAG_DIR, - NULL, parentInode); - if (tmpstat < 0) - LOG_ERROR_STATUS(tmpstat); - - } - up_write(&OCFS_I(inode)->ip_io_sem); up_write(&OCFS_I(dir)->ip_io_sem); bail: @@ -1226,7 +1219,6 @@ newfe->i_links_count = 0; else newfe->i_links_count--; - if (!newfe->i_links_count) { status = ocfs_orphan_add(osb, handle, new_inode, newfe); Index: src/inode.c =================================================================== --- src/inode.c (revision 1267) +++ src/inode.c (working copy) @@ -447,8 +447,6 @@ break; case S_IFDIR: if (inode->i_nlink < 2) { - LOG_ERROR_ARGS("inlink=%d for %llu\n", inode->i_nlink, - fe->i_blkno); inode->i_nlink = 2; } atomic_set(GET_INODE_CLEAN_SEQ(inode), atomic_read(&osb->clean_buffer_seq)); Index: src/ocfs.h =================================================================== --- src/ocfs.h (revision 1267) +++ src/ocfs.h (working copy) @@ -79,8 +79,8 @@ enum { INVALID_REQUEST, // reply with a NO vote UPDATE_OIN_INODE, // update both oin and inode - DELETE_ACQUIRE,// delete or rename acquire request - DELETE_RELEASE,// delete or rename release request + DELETE_ACQUIRE, // delete or rename acquire request + RELEASE, // release request RELEASE_CACHE, // release a cache lock I hold CHANGE_MASTER, // request to change master to requestor ADD_OIN_MAP, // add requestor into oin map Index: src/lockres.c =================================================================== --- src/lockres.c (revision 1267) +++ src/lockres.c (working copy) @@ -77,9 +77,7 @@ b = (bh == NULL) ? &tmpbh : bh; if (reread) { - flags = (inode && OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE) ? - 0 : lockres->master_node_num == osb->node_num ? - OCFS_BH_CACHED : 0; + flags = OCFS_BH_CACHED; status = ocfs_read_bh(osb, OCFS_I(inode)->ip_blkno << inode->i_sb->s_blocksize_bits, b, flags, inode); Index: src/nm.c =================================================================== --- src/nm.c (revision 1267) +++ src/nm.c (working copy) @@ -86,7 +86,7 @@ "INVALID_REQUEST", // reply with a NO vote "UPDATE_OIN_INODE", // update both oin and inode "DELETE_ACQUIRE",// delete or rename request - "DELETE_RELEASE",// delete or rename release request + "RELEASE", // release request "RELEASE_CACHE", // release a cache lock I hold "CHANGE_MASTER", // request to change master to requestor "ADD_OIN_MAP", // add requestor into oin map @@ -491,6 +491,13 @@ my_node_wins = (node_num < osb->node_num); } + if (flags & FLAG_RELEASE_LOCK && + flags & (FLAG_FILE_DELETE | FLAG_FILE_CREATE | + FLAG_FILE_TRUNCATE | FLAG_FILE_EXTEND)) { + vote_type = RELEASE; + goto done; + } + if (flags & (FLAG_RELEASE_DENTRY | FLAG_FILE_RENAME)) { vote_type = RELEASE_DENTRY; goto done; @@ -509,20 +516,14 @@ } if (flags & FLAG_FILE_DELETE) { - if (flags & FLAG_RELEASE_LOCK) - vote_type = DELETE_RELEASE; - else if (flags & FLAG_ACQUIRE_LOCK) + if (flags & FLAG_ACQUIRE_LOCK) vote_type = DELETE_ACQUIRE; else vote_type = INVALID_REQUEST; } else if (flags & FLAG_FILE_RELEASE_CACHE) vote_type = RELEASE_CACHE; else if (flags & FLAG_FILE_UPDATE_OIN) { - if ((flags & FLAG_FILE_TRUNCATE) && - (flags & FLAG_ACQUIRE_LOCK)) - vote_type = TRUNCATE_PAGES; - else - vote_type = UPDATE_OIN_INODE; + vote_type = UPDATE_OIN_INODE; } else if (flags & FLAG_TRUNCATE_PAGES) { vote_type = TRUNCATE_PAGES; } else if (lockres->master_node_num == osb->node_num) { @@ -544,7 +545,7 @@ } if (inode == NULL && - (vote_type != DELETE_RELEASE && vote_type != TRUNCATE_PAGES)) + (vote_type != RELEASE && vote_type != TRUNCATE_PAGES)) vote_type = INVALID_REQUEST; done: LOG_EXIT_STATUS(vote_type); @@ -813,8 +814,7 @@ } } - lockflags = (OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE) - ? 0 : OCFS_BH_CACHED; + lockflags = OCFS_BH_CACHED; no_inode_ok: /* fail here if no inode, unless this is a delete/rename release */ @@ -857,6 +857,19 @@ switch (vote_type) { case UPDATE_OIN_INODE: LOG_TRACE_STR("UPDATE_OIN_INODE"); + + if(flags&FLAG_FILE_TRUNCATE) { + status = ocfs_sync_inode(inode); + if (status < 0) { + LOG_ERROR_STATUS(status); + vote_response = FLAG_VOTE_UPDATE_RETRY; + break; + } + ocfs_truncate_inode_pages(inode, 0); + ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map); + ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map); + } + atomic_set(&OCFS_I(inode)->ip_needs_verification, 1); tmpstat = ocfs_verify_update_inode(osb, inode, 1); if (tmpstat < 0) @@ -892,9 +905,14 @@ "= %u\n", inode->i_ino, inode->i_nlink); break; - case DELETE_RELEASE: + case RELEASE: /* ACK and done */ vote_response = FLAG_VOTE_NODE; + if(inode) { + ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map); + ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map); + } + invalidate_bdev(osb->sb->s_bdev, 0); break; case DELETE_ACQUIRE: @@ -910,7 +928,7 @@ inode->i_nlink); /* verify_update_inode does a dirty read which * might set i_nlink to an old value. */ - if (inode->i_nlink) { + if ( !S_ISDIR(inode->i_mode) && inode->i_nlink) { LOG_ERROR_ARGS("Orphaned inode %lu has link " "count = %d!\n", inode->i_ino, inode->i_nlink); @@ -1209,7 +1227,6 @@ vote_response = FLAG_VOTE_UPDATE_RETRY; break; } - ocfs_truncate_inode_pages(inode, 0); ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map); ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map); Index: src/file.c =================================================================== --- src/file.c (revision 1267) +++ src/file.c (working copy) @@ -393,7 +393,6 @@ up(&recovery_list_sem); } up (&(OCFS_I(inode)->ip_sem)); - bail: if (dec) iput(inode); Index: src/buffer_head_io.c =================================================================== --- src/buffer_head_io.c (revision 1267) +++ src/buffer_head_io.c (working copy) @@ -217,13 +217,6 @@ !(OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE)) flags |= OCFS_BH_CACHED; - if (inode && (flags & OCFS_BH_CACHED) && - (OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE)) { - LOG_TRACE_STR("hey bozo you are trying to read " - "a system thingy cached!"); - flags &= ~OCFS_BH_CACHED; - } - sb = osb->sb; blocknum = off >> sb->s_blocksize_bits;