[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ocfs2-commits
Subject:    [Ocfs2-commits] mfasheh commits r861 - trunk/src
From:       svn-commits () oss ! oracle ! com (svn-commits () oss ! oracle ! com)
Date:       2004-04-21 20:35:26
Message-ID: 200404220135.i3M1ZNJp011232 () oss ! oracle ! com
[Download RAW message or body]

Author: mfasheh
Date: 2004-04-21 20:35:22 -0500 (Wed, 21 Apr 2004)
New Revision: 861

Modified:
   trunk/src/dlm.c
   trunk/src/file.c
   trunk/src/hash.c
   trunk/src/inode.c
   trunk/src/nm.c
   trunk/src/oin.c
Log:
* fix a potential null pointer error in ocfs_clear_inode

* fix process_vote to only take inode_extend_sem on behalf of other
  nodes if we in fact, have that file open (was doing it all the time
  before).

* fix ocfs_release_lock s


Modified: trunk/src/dlm.c
===================================================================
--- trunk/src/dlm.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/dlm.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -1355,7 +1355,8 @@
 	}
 
 	/* Send an update to all nodes alive, can be optimized later TODO */
-	if ((flags & FLAG_FILE_RENAME) || (flags & FLAG_FILE_DELETE))
+	if ((flags & FLAG_FILE_RENAME) || (flags & FLAG_FILE_DELETE)
+	    || (flags & FLAG_FILE_TRUNCATE) || (flags & FLAG_FILE_EXTEND))
 		votemap = (__u32) (osb->publ_map);
 
 	/* TODO: figure out how to properly handle inode updates w/no oin */

Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/file.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -27,6 +27,9 @@
 #include "inc/ocfs.h"
 #define OCFS_DEBUG_CONTEXT    OCFS_DEBUG_CONTEXT_FILE
 
+extern struct semaphore recovery_list_sem;
+extern spinlock_t oin_num_ext_lock;
+
 static int ocfs_change_file_attrib (ocfs_super * osb, __u64 parent_off, __u64 \
file_size, __u64 file_off, struct iattr *attr, struct inode *inode);  static int \
ocfs_truncate_file (ocfs_super * osb, __u64 file_off, __u64 file_size, struct inode \
*inode);  
@@ -362,6 +365,23 @@
 			ocfs_put_lockres(OCFS_I(inode)->lock_res);
 			OCFS_I(inode)->lock_res = NULL;
 		}
+
+		/* we might still be holding inode_extend_sem on
+		 * behalf of another node, so release it here. */
+		down(&recovery_list_sem);
+		spin_lock(&oin_num_ext_lock);
+		if (OCFS_I(inode)->num_extends) {
+			LOG_TRACE_ARGS("ocfs2: closing inode %lu -- had %u "
+				       "extends pending from another node!\n", 
+				       inode->i_ino, 
+				       OCFS_I(inode)->num_extends);
+			OCFS_I(inode)->num_extends = 0;
+			list_del(&OCFS_I(inode)->recovery_list);
+			INIT_LIST_HEAD(&OCFS_I(inode)->recovery_list);
+			up(&OCFS_I(inode)->inode_extend_sem);
+		}
+		spin_unlock(&oin_num_ext_lock);
+		up(&recovery_list_sem);
 	}
 	ocfs_up_sem (&(OCFS_I(inode)->main_res));
 	ocfs_sync_inode(inode);

Modified: trunk/src/hash.c
===================================================================
--- trunk/src/hash.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/hash.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -1421,6 +1421,36 @@
 	return(inode);
 }
 
+static inline void ocfs_debug_print_inum(ocfs_inode_num *inum, 
+					 struct inode * inode)
+{
+
+	if (inum) {
+		printk("ocfs2: inum info\n");
+		printk("       i_state   = %s\n", (inum->i_state == INUM_BOUND)
+		       ? "INUM_BOUND" : "INUM_UNBOUND");
+		printk("       i_ino     = %lu\n", inum->i_ino);
+		printk("       i_voteoff = %u.%u\n", HILO(inum->i_voteoff));
+		printk("       i_feoff   = %u.%u\n", HILO(inum->i_feoff));
+		printk("       i_inode   = 0x%p\n", inum->i_inode);
+	}
+
+	if (!inode)
+		return;
+
+	if (inum && inode != inum->i_inode)
+		printk("ocfs: Inode pointer (0x%p) is different from inum!\n", 
+		       inode);
+	printk("ocfs: inode info\n");
+	printk("       inode     = 0x%p\n", inode);
+	printk("       i_ino     = %lu\n", inode->i_ino);
+	printk("       voteoff   = %u.%u\n", HILO(OCFS_I(inode)->voteoff));
+	printk("       feoff     = %u.%u\n", HILO(OCFS_I(inode)->feoff));
+	printk("       i_count   = %u\n", atomic_read(&inode->i_count));
+	printk("       deleted   = %s\n", INODE_DELETED(inode) ? "yes" : "no");
+	return;
+}
+
 /*
  * ocfs_inode_hash_insert()
  *
@@ -1526,9 +1556,9 @@
 	inum = __ocfs_inode_hash_lookup(h, voteoff);
 
 	if (!inum) {
-		printk("ocfs2: lost inum, offset = %u.%u, inode->i_ino= %lu\n",
-		       HILO(voteoff), inode->i_ino);
-
+		printk("ocfs2: lost inum (voteoff = %u.%u)! AIEEEE!\n", 
+		       HILO(voteoff));
+		ocfs_debug_print_inum(inum, inode);
 		BUG();
 	}
 
@@ -1567,6 +1597,7 @@
 			       HILO(voteoff), inode->i_ino, 
 			       inum->i_inode->i_ino, 
 			       INODE_DELETED(inum->i_inode));
+		ocfs_debug_print_inum(inum, inode);
 		BUG();
 	}
 
@@ -1615,7 +1646,7 @@
 
 	spin_unlock(&h->lock);
 
-	if (!inum->i_inode)
+	if (!inum->i_inode || inum->i_state == INUM_UNBOUND)
 		LOG_ERROR_ARGS("deleting inum in unbound state! (state = %d, "
 			       "voteoff = %u.%u, feoff = %u.%u, i_ino = %u\n",
 			       inum->i_state, HILO(inum->i_voteoff),

Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/inode.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -755,6 +755,11 @@
 	/* we should not really be using osb in this context. */
 	osb = (ocfs_super *) OCFS_GENERIC_SB_P(inode->i_sb);
 
+	if (!inode->u.generic_ip) {
+		LOG_ERROR_ARGS("inode %lu has no generic_ip!\n", inode->i_ino);
+		goto bail;
+	}
+
 	offset = GET_INODE_VOTEOFF(inode);
 	if (offset == -1)
 		BUG();

Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/nm.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -845,7 +845,7 @@
 		inode = NULL;
 	else
 		inode = ocfs_get_inode_from_offset(osb, lock_id, fe_off, NULL);
-
+skip_inode:
 	if (inode) {
 		/* we only need i_sem for some of the operations
 		 * below, but due to lock ordering, we want to take it
@@ -1299,7 +1299,7 @@
 			break;
 	}
 
-	if (flags & (FLAG_FILE_EXTEND|FLAG_FILE_TRUNCATE) && 
+	if (inode && (flags & (FLAG_FILE_EXTEND|FLAG_FILE_TRUNCATE)) && 
 	    ((flags & FLAG_ACQUIRE_LOCK && vote_response==FLAG_VOTE_NODE) ||
 	    (flags & FLAG_RELEASE_LOCK))) {
 
@@ -1307,7 +1307,9 @@
 				      "extend" : "truncate", flags & FLAG_RELEASE_LOCK ? 
 				      "release" : "acquire", inode, node_num);
 
-		if (inode && (flags & FLAG_ACQUIRE_LOCK)) {
+		ocfs_down_sem(&OCFS_I(inode)->main_res, true);
+		if (OCFS_I(inode)->open_hndl_cnt 
+		    && (flags & FLAG_ACQUIRE_LOCK)) {
 			spin_lock(&oin_num_ext_lock);
 
 			if (OCFS_I(inode)->num_extends < 0)
@@ -1335,9 +1337,11 @@
 				spin_unlock(&oin_num_ext_lock);
 				up(&recovery_list_sem);
 			}
-		} else if (inode && (flags & FLAG_RELEASE_LOCK)) {
+		} else if (OCFS_I(inode)->open_hndl_cnt 
+			   && (flags & FLAG_RELEASE_LOCK)) {
 			down(&recovery_list_sem);
 			spin_lock(&oin_num_ext_lock);
+
 			OCFS_I(inode)->num_extends--;
 			
 			if (OCFS_I(inode)->num_extends < 0)
@@ -1345,6 +1349,7 @@
 			
 			if (!OCFS_I(inode)->num_extends) {
 				list_del(&OCFS_I(inode)->recovery_list);
+				INIT_LIST_HEAD(&OCFS_I(inode)->recovery_list);
 
 				up(&OCFS_I(inode)->inode_extend_sem);
 			}
@@ -1352,6 +1357,7 @@
 
 			up(&recovery_list_sem);
 		}
+		ocfs_up_sem(&OCFS_I(inode)->main_res);
 	}
 
 	if (disk_vote) {
@@ -1367,9 +1373,9 @@
 		status = ocfs_send_vote_reply(osb, dlm_msg, vote_response, open_handle);
 	}
 
-	LOG_TRACE_ARGS("vote: lockid=%u.%u, node=%d, seqnum=%u.%u, response=%d, \
                open_handle=%s\n",
-		       HILO(lock_id), node_num, HILO(seq_num), vote_response, 
-		       open_handle?"yes":"no");
+#ifdef VERBOSE_PROCESS_VOTE
+	printk("(%u) vote: lockid=%u.%u, node=%d, seqnum=%u.%u, response=%d, \
open_handle=%s\n",ocfs_getpid(), HILO(lock_id), node_num, HILO(seq_num), \
vote_response, open_handle?"yes":"no"); +#endif
 		       
 	if (status < 0)
 		LOG_ERROR_STATUS (status);

Modified: trunk/src/oin.c
===================================================================
--- trunk/src/oin.c	2004-04-20 19:35:10 UTC (rev 860)
+++ trunk/src/oin.c	2004-04-22 01:35:22 UTC (rev 861)
@@ -56,7 +56,19 @@
 	 * make sure that unlink or rename can't be change it while we're
 	 * in here! */
 	offset = GET_INODE_FEOFF(inode);
+	if (offset == 0) {
+		LOG_ERROR_ARGS("inode %lu has zero offset\n", inode->i_ino);
+		status = -EINVAL;
+		goto leave;
+	}
 
+	if (INODE_DELETED(inode)) {
+		LOG_TRACE_ARGS("Inode %lu was marked as deleted!", 
+			       inode->i_ino);
+		status = -ENOENT;
+		goto leave;
+	}
+
 	status = ocfs_read_bh(osb, offset, &fe_bh, OCFS_BH_COND_CACHED, inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
@@ -65,175 +77,173 @@
 	fe = (ocfs_file_entry *) OCFS_BH_GET_DATA_READ(fe_bh); /* read */
 
 	/* Make sure that what we found is not a directory. */
-	if (!(OCFS_I(inode)->oin_flags & OCFS_OIN_DIRECTORY)) {
-		/* Add checks as needed */
-		if ((fe->sync_flags & OCFS_SYNC_FLAG_MARK_FOR_DELETION) ||
-		    (!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
-			if (fe->sync_flags & OCFS_SYNC_FLAG_MARK_FOR_DELETION) {
-				LOG_TRACE_STR
-				    ("File Entry is marked for deletion");
-			} else {
-				LOG_TRACE_STR ("File Entry is invalid");
-			}
+	if ((OCFS_I(inode)->oin_flags & OCFS_OIN_DIRECTORY))
+		goto leave;
 
-			OCFS_SET_FLAG (OCFS_I(inode)->oin_flags, OCFS_OIN_INVALID);
-			/* ?? I think we should remove the oin here from the oin list */
-			status = -ENOENT;
-			goto leave;
+	/* Add checks as needed */
+	if ((fe->sync_flags & OCFS_SYNC_FLAG_MARK_FOR_DELETION) ||
+	    (!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
+		if (fe->sync_flags & OCFS_SYNC_FLAG_MARK_FOR_DELETION) {
+			LOG_TRACE_STR
+				("File Entry is marked for deletion");
+		} else {
+			LOG_TRACE_STR ("File Entry is invalid");
 		}
 
-                disk_len = strlen(fe->filename);
+		OCFS_SET_FLAG (OCFS_I(inode)->oin_flags, OCFS_OIN_INVALID);
+		/* ?? I think we should remove the oin here from the oin list */
+		status = -ENOENT;
+		goto leave;
+	}
 
-                status = -ENOENT;
-                list_for_each_safe (iter, temp_iter, &(inode->i_dentry)) {
-                        struct dentry *dentry = list_entry (iter, struct dentry, \
                d_alias);
-                        if (dentry->d_name.len == disk_len &&
-                            strncmp(dentry->d_name.name, fe->filename, disk_len)==0)
-                        {
-                                status = 0;
-                        }
-                }
-		if (status < 0) {
-			LOG_TRACE_STR ("file entry name did not match inode");
-			OCFS_SET_FLAG (OCFS_I(inode)->oin_flags, OCFS_OIN_INVALID);
-			goto leave;
-		}
+	disk_len = strlen(fe->filename);
 
+	status = -ENOENT;
+	list_for_each_safe (iter, temp_iter, &(inode->i_dentry)) {
+		struct dentry *dentry = list_entry (iter, struct dentry, d_alias);
+		if (dentry->d_name.len == disk_len &&
+		    strncmp(dentry->d_name.name, fe->filename, disk_len)==0)
+				status = 0;
+	}
 
-		if ((OCFS_I(inode)->alloc_size != (__s64) fe->alloc_size) ||
-		    (inode->i_size != (__s64) fe->file_size) ||
-		    (OCFS_I(inode)->chng_seq_num != DISK_LOCK_SEQNUM (fe)) ||
-		    inode->i_uid != fe->uid ||
-		    inode->i_gid != fe->gid || inode->i_mode != fe->prot_bits){
+	/* isn't it OK for an inode to have no dentry yet? */
+	if (list_empty(&inode->i_dentry))
+		status = 0;
 
-			if (OCFS_I(inode)->alloc_size > (__s64)fe->alloc_size){
-				ocfs_extent_map_destroy (&OCFS_I(inode)->map);
-				ocfs_extent_map_init (&OCFS_I(inode)->map);
-			}
+	if (status < 0) {
+		LOG_TRACE_STR ("file entry name did not match inode");
+		OCFS_SET_FLAG (OCFS_I(inode)->oin_flags, OCFS_OIN_INVALID);
+		goto leave;
+	}
 
-			LOG_TRACE_STR
-			    ("Allocsize, filesize or seq no did not match");
-			OCFS_I(inode)->alloc_size = fe->alloc_size;
-			inode->i_size = fe->file_size;
-			OCFS_I(inode)->chng_seq_num = DISK_LOCK_SEQNUM (fe);
+	if ((OCFS_I(inode)->alloc_size != (__s64) fe->alloc_size) ||
+	    (inode->i_size != (__s64) fe->file_size) ||
+	    (OCFS_I(inode)->chng_seq_num != DISK_LOCK_SEQNUM (fe)) ||
+	    inode->i_uid != fe->uid ||
+	    inode->i_gid != fe->gid || inode->i_mode != fe->prot_bits){
 
+		if (OCFS_I(inode)->alloc_size > (__s64)fe->alloc_size){
+			ocfs_extent_map_destroy (&OCFS_I(inode)->map);
+			ocfs_extent_map_init (&OCFS_I(inode)->map);
+		}
+
+		LOG_TRACE_STR("Allocsize, filesize or seq no did not match");
+		OCFS_I(inode)->alloc_size = fe->alloc_size;
+		inode->i_size = fe->file_size;
+		OCFS_I(inode)->chng_seq_num = DISK_LOCK_SEQNUM (fe);
+
+		inode->i_blocks = (inode->i_size + 512) >> 9;
+		inode->i_uid = fe->uid;
+		inode->i_gid = fe->gid;
+		inode->i_mode = fe->prot_bits;
+		inode->i_blksize = (__u32) osb->vol_layout.cluster_size;
+		OCFS_SET_INODE_TIME(inode, i_ctime, fe->create_time);
+		OCFS_SET_INODE_TIME(inode, i_atime, fe->modify_time);
+		OCFS_SET_INODE_TIME(inode, i_mtime, fe->modify_time);
+		if (!S_ISDIR (inode->i_mode) &&
+		    (OCFS_I(inode)->alloc_size != (__s64) fe->alloc_size ||
+		     inode->i_size != (__s64) fe->file_size ||
+		     OCFS_I(inode)->chng_seq_num != DISK_LOCK_SEQNUM (fe))) {
+			*needs_trunc = 1;
+		}
+
+		switch (fe->attribs) {
+		case OCFS_ATTRIB_DIRECTORY:
+			inode->i_size = OCFS_DEFAULT_DIR_NODE_SIZE;
 			inode->i_blocks = (inode->i_size + 512) >> 9;
-			inode->i_uid = fe->uid;
-			inode->i_gid = fe->gid;
-			inode->i_mode = fe->prot_bits;
-			inode->i_blksize = (__u32) osb->vol_layout.cluster_size;
-			OCFS_SET_INODE_TIME(inode, i_ctime, fe->create_time);
-			OCFS_SET_INODE_TIME(inode, i_atime, fe->modify_time);
-			OCFS_SET_INODE_TIME(inode, i_mtime, fe->modify_time);
-			if (!S_ISDIR (inode->i_mode) &&
-			    (OCFS_I(inode)->alloc_size != (__s64) fe->alloc_size ||
-			     inode->i_size != (__s64) fe->file_size ||
-			     OCFS_I(inode)->chng_seq_num != DISK_LOCK_SEQNUM (fe))) {
-				*needs_trunc = 1;
-			}
-
-			switch (fe->attribs) {
-			    case OCFS_ATTRIB_DIRECTORY:
-				    inode->i_size = OCFS_DEFAULT_DIR_NODE_SIZE;
-				    inode->i_blocks = (inode->i_size + 512) >> 9;
-				    inode->i_mode |= S_IFDIR;
-				    break;
-			    case OCFS_ATTRIB_SYMLINK:
-				    inode->i_mode |= S_IFLNK;
-				    break;
-			    case OCFS_ATTRIB_REG:
-				    inode->i_mode |= S_IFREG;
-				    break;
-			    case OCFS_ATTRIB_CHAR:
-			    case OCFS_ATTRIB_BLOCK:
-			    case OCFS_ATTRIB_FIFO:
-			    case OCFS_ATTRIB_SOCKET:
-			    {
+			inode->i_mode |= S_IFDIR;
+			break;
+		case OCFS_ATTRIB_SYMLINK:
+			inode->i_mode |= S_IFLNK;
+			break;
+		case OCFS_ATTRIB_REG:
+			inode->i_mode |= S_IFREG;
+			break;
+		case OCFS_ATTRIB_CHAR:
+		case OCFS_ATTRIB_BLOCK:
+		case OCFS_ATTRIB_FIFO:
+		case OCFS_ATTRIB_SOCKET:
+		{
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-				    dev_t dev;
+			dev_t dev;
 #else
-				    kdev_t kdev;
+			kdev_t kdev;
 #endif
-				    if (fe->attribs == OCFS_ATTRIB_CHAR)
-					    inode->i_mode |= S_IFCHR;
-				    else if (fe->attribs == OCFS_ATTRIB_BLOCK)
-					    inode->i_mode |= S_IFBLK;
-				    else if (fe->attribs == OCFS_ATTRIB_FIFO)
-					    inode->i_mode |= S_IFIFO;
-				    else if (fe->attribs == OCFS_ATTRIB_SOCKET)
-					    inode->i_mode |= S_IFSOCK;
+			if (fe->attribs == OCFS_ATTRIB_CHAR)
+				inode->i_mode |= S_IFCHR;
+			else if (fe->attribs == OCFS_ATTRIB_BLOCK)
+				inode->i_mode |= S_IFBLK;
+			else if (fe->attribs == OCFS_ATTRIB_FIFO)
+				inode->i_mode |= S_IFIFO;
+			else if (fe->attribs == OCFS_ATTRIB_SOCKET)
+				inode->i_mode |= S_IFSOCK;
 
-				    inode->i_rdev = OCFS_NODEV;
+			inode->i_rdev = OCFS_NODEV;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-				    dev = MKDEV (fe->dev_major, fe->dev_minor);
+			dev = MKDEV (fe->dev_major, fe->dev_minor);
 #else
-				    kdev = MKDEV (fe->dev_major, fe->dev_minor);
+			kdev = MKDEV (fe->dev_major, fe->dev_minor);
 #endif
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-				    init_special_inode (inode, inode->i_mode,
-							dev);
+			init_special_inode (inode, inode->i_mode, dev);
 #else
-				    init_special_inode (inode, inode->i_mode,
-							kdev_t_to_nr(kdev));
+			init_special_inode (inode, inode->i_mode, 
+					    kdev_t_to_nr(kdev));
 #endif
-				    break;
-			    }
-			    default:
-			    	    LOG_ERROR_ARGS ("attribs=%d", fe->attribs);
-				    inode->i_mode |= S_IFREG;
-				    break;
-			}
+			break;
+		}
+		default:
+			LOG_ERROR_ARGS ("attribs=%d", fe->attribs);
+			inode->i_mode |= S_IFREG;
+			break;
+		}
 
-			if (fe->local_ext) {
-				__s64 tempVbo;
-				__s64 tempLbo;
-				__u64 tempSize;
-				__u32 j;
+		if (fe->local_ext) {
+			__s64 tempVbo;
+			__s64 tempLbo;
+			__u64 tempSize;
+			__u32 j;
 
-				/* Add the Extents to extent map */
-				for (j = 0; j < fe->next_free_ext; j++) {
-					tempVbo = fe->extents[j].file_off;
-					tempLbo = fe->extents[j].disk_off;
-					tempSize = fe->extents[j].num_bytes;
+			/* Add the Extents to extent map */
+			for (j = 0; j < fe->next_free_ext; j++) {
+				tempVbo = fe->extents[j].file_off;
+				tempLbo = fe->extents[j].disk_off;
+				tempSize = fe->extents[j].num_bytes;
 
-					if (!ocfs_add_extent_map_entry (osb, 
-									&OCFS_I(inode)->map,
-							       tempVbo, tempLbo,
-							       tempSize))
-						goto leave;
-				}
+				if (!ocfs_add_extent_map_entry (osb, 
+								&OCFS_I(inode)->map,
+								tempVbo, tempLbo,
+								tempSize))
+					goto leave;
 			}
 		}
+	}
 
-		/* ??? we need to the lock resource before updating it */
-		if (OCFS_I(inode)->lock_res) {
-			/* cannot hold bhsem while taking lockres... baaad */
-			memcpy(&dlock, (ocfs_disk_lock *)fe, sizeof(ocfs_disk_lock));
-			OCFS_BH_PUT_DATA(fe_bh);
-			fe = NULL;
-			lockres = OCFS_I(inode)->lock_res;
-			ocfs_acquire_lockres(lockres);
-			lockres->lock_type = DISK_LOCK_FILE_LOCK (&dlock);
-			lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (&dlock);
-			lockres->oin_openmap = DISK_LOCK_OIN_MAP (&dlock);
+	/* ??? we need to the lock resource before updating it */
+	if (OCFS_I(inode)->lock_res) {
+		/* cannot hold bhsem while taking lockres... baaad */
+		memcpy(&dlock, (ocfs_disk_lock *)fe, sizeof(ocfs_disk_lock));
+		OCFS_BH_PUT_DATA(fe_bh);
+		fe = NULL;
+		lockres = OCFS_I(inode)->lock_res;
+		ocfs_acquire_lockres(lockres);
+		lockres->lock_type = DISK_LOCK_FILE_LOCK (&dlock);
+		lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (&dlock);
+		lockres->oin_openmap = DISK_LOCK_OIN_MAP (&dlock);
 
-			if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
-    	    		    lockres->readonly_node != lockres->master_node_num) {
-				LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%u.%u\n",
-					lockres->readonly_node, lockres->master_node_num,
-					lockres->sector_num);
-				lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-			}
-
-			ocfs_release_lockres(lockres);
+		if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
+		    lockres->readonly_node != lockres->master_node_num) {
+			LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%u.%u\n",
+				       lockres->readonly_node, lockres->master_node_num,
+				       lockres->sector_num);
+			lockres->readonly_node = OCFS_INVALID_NODE_NUM;
 		}
 
-		status = 0;
-	} else {
-		/* Update for the DIRECTORY */
+		ocfs_release_lockres(lockres);
 	}
 
+	status = 0;
 leave:
 	if (status == 0)
 		OCFS_I(inode)->needs_verification = false;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic