[SSI] openssi/kernel/cluster/ssi/cfs cfs_ipcshm.c, 1.21, 1.22 cfs_mnthooks.c, 1.24, 1.25 cfs_server.c, 1.17, 1.18 cfs_subr.c, 1.28, 1.29 cfs_svc.c, 1.19, 1.20 cfsproc.c, 1.35, 1.36 cfstok.c, 1.22, 1.23 dir.c, 1.29, 1.30 file.c, 1.25, 1.26 inode.c, 1.62, 1.63 pagelist.c, 1.14, 1.15 proc.c, 1.22, 1.23 read.c, 1.22, 1.23 svrcfs.c, 1.26, 1.27 vfs.c, 1.32, 1.33 write.c, 1.39, 1.40

Roger Tsang <[email protected]>
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv1388/cluster/ssi/cfs

Modified Files:
      Tag: OPENSSI-FC
	cfs_ipcshm.c cfs_mnthooks.c cfs_server.c cfs_subr.c cfs_svc.c 
	cfsproc.c cfstok.c dir.c file.c inode.c pagelist.c proc.c 
	read.c svrcfs.c vfs.c write.c 
Log Message:
Multiple bug fixes. See ChangeLog.


Index: cfs_ipcshm.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_ipcshm.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- cfs_ipcshm.c	24 Feb 2009 01:51:47 -0000	1.21
+++ cfs_ipcshm.c	17 Dec 2009 06:43:50 -0000	1.22
@@ -271,8 +271,8 @@
 cfs_shm_mount(struct super_block *csb, struct cfsmountargs *argp, int silent)
 {
 	cfs_mntinfo_t *mip;
+	struct inode *inode;
 	struct dentry *root;
-	int error;
 
 	csb->s_op = &cfs_sops;
 	csb->s_mnt_op = &cfs_mnt_ops;
@@ -282,10 +282,12 @@
 	csb->s_dev = argp->dev;
 
 	/* Create the root cnode. */
-	root = d_alloc_root(cfs_fhget(csb, &(argp->root)));
-	error = -ENOMEM;
-	if (!root)
-		return error;
+	inode = cfs_fhget(csb, &(argp->root));
+	root = d_alloc_root(inode);
+	if (!root) {
+		iput(inode);
+		return -ENOMEM;
+	}
 
 	mip = sbtocmi(csb);
 	mip->mi_server = argp->server;

Index: cfs_server.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_server.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- cfs_server.c	27 Oct 2009 03:18:29 -0000	1.17
+++ cfs_server.c	17 Dec 2009 06:43:50 -0000	1.18
@@ -676,11 +676,14 @@
 	buf->error = -EINVAL;	/* only used if we fail.. */
 	if (reclen > buf->count)
 		return -EINVAL;
+
 	dirent = buf->previous;
 	if (dirent)
 		put_kernel(small_offset, &dirent->d_off);
+
 	dirent = buf->current_dir;
 	buf->previous = dirent;
+
 	put_kernel(ino, &dirent->d_ino);
 	put_kernel(reclen, &dirent->d_reclen);
 	memcpy(dirent->d_name, name, namlen);
@@ -694,16 +697,15 @@
 int
 cfs_rb_delayedunlinks(struct super_block *sb)
 {
-	struct svrcfstok *dhp = NULL;
 	cfhandle_t fh;
-	void    *dir_buf = NULL;
-	int error = 0;
-	char *buf;
+	struct getdents_callback buffer;
 	struct dentry *droot, *ddir = NULL;
 	struct inode *dir;
 	struct file *filp = NULL;
-	int file_opened = 0;
-	struct getdents_callback buffer;
+	struct svrcfstok *dhp = NULL;
+	int error = 0;
+	void *dir_buf = NULL;
+	char *buf;
 
 	SSI_ASSERT(sb != NULL);
 
@@ -731,19 +733,23 @@
 		ddir = NULL;
 		goto done;
 	}
+
 	up(&(droot->d_inode->i_sem));
+
 	dir = ddir->d_inode;
 
 	/* No directory means nothing to clean-up, no error */
 	if (dir == NULL)
 		goto done;
 
-	error = -ENOTDIR;
-	if (!S_ISDIR(dir->i_mode))
+	if (!S_ISDIR(dir->i_mode)) {
+		error = -ENOTDIR;
 		goto done;
-	error = -EINVAL;
-	if (!dir->i_fop)
+	}
+	if (!dir->i_fop) {
+		error = -EINVAL;
 		goto done;
+	}
 
 	/*
 	 * Open the directory ...
@@ -751,16 +757,17 @@
 	filp = dentry_open(dget(ddir), NULL, FMODE_READ);
 	if (IS_ERR(filp)) {
 		error = PTR_ERR(filp);
+		filp = NULL;
 		goto done;
 	}
-	file_opened = 1;
-	error = -EINVAL;
-	if (!filp->f_op->readdir)
+	if (!filp->f_op->readdir) {
+		error = -EINVAL;
 		goto done;
-
+	}
 
 	error = cfs_fh_compose(&fh, sb->s_ssidev, ddir);
 	SSI_ASSERT(error == 0);
+
 	dhp = svrtok_lookup(&fh, ddir, sb);
 	SSI_ASSERT(dhp);
 
@@ -771,11 +778,6 @@
 		goto done;
 	}
 
-	buffer.current_dir = (struct linux_dirent *) dir_buf;
-	buffer.previous = NULL;
-	buffer.count = DIRBLKS;
-	buffer.error = 0;
-
 	/*
 	 * Read the directory entries. This silly loop is necessary because
 	 * readdir() is not guaranteed to fill up the entire buffer, but
@@ -784,6 +786,11 @@
 	while (1) {
 		int len;
 
+		buffer.current_dir = (struct linux_dirent *) dir_buf;
+		buffer.previous = NULL;
+		buffer.count = DIRBLKS;
+		buffer.error = 0;
+
 		error = vfs_readdir(filp, kern_filldir, &buffer);
 		if (error < 0)
 			break;
@@ -813,22 +820,29 @@
 			 */
 			if (strcmp(dp->d_name, ".") == 0 ||
 					strcmp(dp->d_name, "..") == 0) {
-				buf += dp->d_reclen;
-				len -= dp->d_reclen;
-				continue;
+				goto skip;
 			}
 
 			down(&dir->i_sem);
+
 			pdp = lookup_one_len(dp->d_name, ddir, strlen(dp->d_name));
 			if (IS_ERR(pdp)) {
 				up(&dir->i_sem);
 				error = PTR_ERR((void *)pdp);
 				break;
 			}
+			up(&dir->i_sem);
 
 			error = cfs_fh_compose(&fh, sb->s_ssidev, pdp);
 			SSI_ASSERT(error == 0);
+
+#ifdef RCU_CFSTOK_TABLE
+			thp = hfind(&fh);
+#else
 			thp = svrtok_lookup(&fh, NULL, NULL);
+#endif
+
+			down(&dir->i_sem);
 
 			/*
 			 * Check link count, if a delay unlink file is found
@@ -836,7 +850,8 @@
 			 * This handles a case in which after a crash the
 			 * state of the filesystem is not what is expected.
 			 */
-			if ((pdp->d_inode->i_nlink > 1) && !S_ISDIR(pdp->d_inode->i_mode)) {
+			if (unlikely((pdp->d_inode->i_nlink > 1) &&
+					!S_ISDIR(pdp->d_inode->i_mode))) {
 				if (thp) {
 					HASH_RELE(thp);
 					thp = NULL;
@@ -885,24 +900,21 @@
 				}
 			}
 
+			dput(pdp);
+skip:
 			buf += dp->d_reclen;
 			len -= dp->d_reclen;
-			dput(pdp);
 		}
-		buffer.current_dir = (struct linux_dirent *) dir_buf;
-		buffer.previous = NULL;
-		buffer.count = DIRBLKS;
-		buffer.error = 0;
 	}
 done:
-	if (file_opened)
-		fput(filp);
 	if (dir_buf)
 		kfree(dir_buf);
-	if (ddir)
-		dput(ddir);
 	if (dhp)
 		HASH_RELE(dhp);
+	if (filp)
+		fput(filp);
+	if (ddir)
+		dput(ddir);
 	return error;
 }
 
@@ -914,7 +926,6 @@
 	char *buf;
 	struct inode *dir;
 	struct file *filp = NULL;
-	int file_opened = 0;
 	struct getdents_callback buffer;
 
 	SSI_ASSERT(ddir != NULL);
@@ -924,9 +935,10 @@
 
 	dir = ddir->d_inode;
 
-	error = -EINVAL;
-	if (!dir->i_fop)
+	if (!dir->i_fop) {
+		error = -EINVAL;
 		goto done;
+	}
 
 	/*
 	 * Open the directory ...
@@ -934,12 +946,13 @@
 	filp = dentry_open(dget(ddir), NULL, FMODE_READ);
 	if (IS_ERR(filp)) {
 		error = PTR_ERR(filp);
+		filp = NULL;
 		goto done;
 	}
-	file_opened = 1;
-	error = -EINVAL;
-	if (!filp->f_op->readdir)
+	if (!filp->f_op->readdir) {
+		error = -EINVAL;
 		goto done;
+	}
 
 	/* allocate buffer for block of dirent entries */
 	dir_buf = kmalloc(DIRBLKS, GFP_KERNEL);
@@ -948,11 +961,6 @@
 		goto done;
 	}
 
-	buffer.current_dir = (struct linux_dirent *) dir_buf;
-	buffer.previous = NULL;
-	buffer.count = DIRBLKS;
-	buffer.error = 0;
-
 	/*
 	 * Read the directory entries. This silly loop is necessary because
 	 * readdir() is not guaranteed to fill up the entire buffer, but
@@ -961,6 +969,11 @@
 	while (1) {
 		int len;
 
+		buffer.current_dir = (struct linux_dirent *) dir_buf;
+		buffer.previous = NULL;
+		buffer.count = DIRBLKS;
+		buffer.error = 0;
+
 		error = vfs_readdir(filp, kern_filldir, &buffer);
 		if (error < 0)
 			break;
@@ -994,16 +1007,12 @@
 			buf += dp->d_reclen;
 			len -= dp->d_reclen;
 		}
-		buffer.current_dir = (struct linux_dirent *) dir_buf;
-		buffer.previous = NULL;
-		buffer.count = DIRBLKS;
-		buffer.error = 0;
 	}
 done:
-	if (file_opened)
-		fput(filp);
 	if (dir_buf)
 		kfree(dir_buf);
+	if (filp)
+		fput(filp);
 	if (error) {
 #ifdef DEBUG
 		printf("cfs_isdirempty: VOP_READDIR failed errno %d\n",error);

Index: inode.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/inode.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -d -r1.62 -r1.63
--- inode.c	2 Nov 2009 03:44:37 -0000	1.62
+++ inode.c	17 Dec 2009 06:43:50 -0000	1.63
@@ -276,21 +276,10 @@
 		put_rpccred(cred);
 #endif /* SSI_CFS_EXNFS */
 
-	/* SSI_CFS_XXX: livelock over I_LOCK
-	 * Bug ? very hard to reproduce if ever.
-	 *
-	 * icssvr_daemon:
-	 * ...
-	 *  cfs_tokmsg (for RETURN)
-	 *    clifhtoip
-	 *      ilookup
-	 *        ifind_fast
-	 *          find_inode_fast
-	 *            __wait_on_freeing_inode
-	 */
-
 	/* Send tokens back since inode is going away */
-	/* SSI_XXX: Fake i_count because inode is going away */
+	/*
+	 * process_msgs() needs positive i_count.
+	 */
 	atomic_inc(&inode->i_count);
 	error = cfstok_giveback(inode);
 	atomic_dec(&inode->i_count);

Index: cfs_svc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_svc.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- cfs_svc.c	27 Oct 2009 03:18:29 -0000	1.19
+++ cfs_svc.c	17 Dec 2009 06:43:50 -0000	1.20
@@ -76,24 +76,28 @@
 void
 cfs_nodedown_thread(void *arg)
 {
-	extern clusternode_t root_fs_node, clms_master_node;
 	clusternode_t node = (clusternode_t)arg;
 	struct super_block *sb;
+	struct vfsmount *rootmnt;
 	cfs_mntinfo_t *mip;	/* CFS mount information. */
 
+	extern clusternode_t root_fs_node, clms_master_node;
+
 	INCR_MEMPRIO(); /* avoid blocking for memory */
 
-	sb = current->fs->rootmnt->mnt_sb;
+	read_lock(&current->fs->lock);
+	rootmnt = mntget(current->fs->rootmnt);
+	read_unlock(&current->fs->lock);
+
+	sb = rootmnt->mnt_sb;
 	mip = sbtocmi(sb);
 
-	if (!CFS_SB_HARD_MIP(mip)) {
+	if (!CFS_SB_HARD_MIP(mip))
 		goto out;
-	}
 
 	/* We only remount down mounts */
-	if (CFS_SB_UP_MIP(mip)) {
+	if (CFS_SB_UP_MIP(mip))
 		goto out;
-	}
 
 	/* See if we need to do a root failover. */
 	if (node == root_fs_node && clms_master_node == this_node) {
@@ -106,9 +110,7 @@
 		root_fs_node = this_node;
 
 		/* Failover root here */
-		lock_kernel();
 		cfs_root_failover(sb);
-		unlock_kernel();
 
 #ifdef NOTYET_DISABLED
 		clms_set_key_service_ready(CLUSTER_ROOT_SERVICE);
@@ -132,6 +134,7 @@
 #endif
 
 out:
+	mntput(rootmnt);
 	exit_daemon_thread();
 }
 
@@ -383,25 +386,47 @@
 void
 cfs_root_failover(struct super_block *cfssb)
 {
+	exec_userproc_arg_t *euap;
+	cfs_mntinfo_t *mip;
+	struct super_block *sb;
 	struct vfsmount *root;
+	const char *arg1 = "failover";
 	int err;
-	const char *arg1 = NULL;
+
+	extern struct semaphore root_fs_sem;
 	extern char *root_dev_name, *root_fs;
-	cfs_mntinfo_t *mip;
-	struct super_block *sb;
-	exec_userproc_arg_t *euap;
+	extern struct file_system_type *root_fs_type;
+	extern struct block_device *root_bdev;
+
+	down(&root_fs_sem);
 
 	if (root_fs == NULL)
 		panic("cfs_root_failover: no cfs_setroot performed");
 
-	/* SSI_XXX: Mount the PFS, must get fstype and dev pre-loaded into the
-	 * kernel from the ramdisk.
-	 * Pass MS_REMOUNT, so that get_sb_bdev() doesn't insert this
+	BUG_ON(root_fs_type == NULL);
+	BUG_ON(root_dev_name == NULL);
+	BUG_ON(root_bdev == NULL);
+
+	/* Pass MS_REMOUNT, so that get_sb_bdev() doesn't insert this
 	 * super-block onto the global list.
 	 */
-	root = do_kern_mount(root_fs, MS_RDONLY|MS_REMOUNT, NULL, cfssb->s_mnt_info);
+	/* Root failover remount without traversing the device name */
+	/*
+	 * ->get_sb needs lock_kernel().
+	 */
+	lock_kernel();
+#if 0
+	root = do_kern_mount(root_fs, MS_RDONLY | MS_REMOUNT,
+				NULL, cfssb->s_mnt_info);
+#else
+	SSI_ASSERT(!(cfssb->s_flags & MS_CFS));
+	root = do_kern_mount(root_fs, cfssb->s_flags | MS_RDONLY | MS_REMOUNT,
+			     NULL, cfssb->s_mnt_info);
+#endif
+	unlock_kernel();
 	if (IS_ERR(root)) {
 		err = PTR_ERR(root);
+		up(&root_fs_sem);
 		goto out;
 	}
 
@@ -419,44 +444,71 @@
 #endif
 	if (IS_ERR(euap)) {
 		err = PTR_ERR(euap);
+		up(&root_fs_sem);
 		goto out;
 	}
 
 	err = sys_wait4(-1, NULL, __WALL, NULL);
 	kfree(euap); /* clean up spawn_failover_user_proc() */
-	if (err < 0)
+	if (err < 0) {
+		up(&root_fs_sem);
 		goto out;
+	}
 	/* err = 0; */ /* clear pid */
 
-	/* Remount PFS from RDONLY to read/write */
+	/*
+	 * Remount PFS from RDONLY to read/write
+	 */
 	sb = root->mnt_sb;
 
 	down_write(&sb->s_umount);
+	/*
+	 * ->remount_fs needs lock_kernel().
+	 */
+	lock_kernel();
+#if 0
 	err = do_remount_sb(sb, 0, NULL, 0);
-	up_write(&sb->s_umount);
-	if (err < 0)
+#else
+	err = do_remount_sb(sb, cfssb->s_flags, cfssb->s_mnt_info, 0);
+#endif
+	unlock_kernel();
+	if (err < 0) {
+		up_write(&sb->s_umount);
+		up(&root_fs_sem);
 		goto out;
+	}
 
-	mip = sbtocmi(cfssb);
 	/* Don't need vfsmount anymore */
 	atomic_inc(&sb->s_active);
 	mntput(root);
 
+	/* vfsp->vfs_dev = vfs_dev */
+
+	/* Should we copy final PFS flags to the CFS SB? */
+	if (cfssb->s_flags != (sb->s_flags & ~(MS_REMOUNT|MS_CFS))) {
+		printk(KERN_NOTICE "%s: csb flags: %#lx sb flags: %#lx\n",
+			__FUNCTION__, cfssb->s_flags, sb->s_flags);
+#ifdef SSI_NOTYET
+		lock_super(cfssb);
+		cfssb->s_flags = (sb->s_flags & ~(MS_REMOUNT|MS_CFS));
+		unlock_super(cfssb);
+#endif
+	}
+	sb->s_flags |= MS_CFS;		/* Mark as CFS stacked */
+	up_write(&sb->s_umount);
+
 	/* do_kern_mount() didn't set device */
 	mnt_fix_devname(cfssb, root_dev_name);
+	up(&root_fs_sem);
 
 	/* Now we have the Physical super-block set-up, lets really link
 	 * this guy up and set the CFS mount(s) back to UP.
 	 */
-	/* SSI_XXX */
+	mip = sbtocmi(cfssb);
 	/* mip->mi_mount_flags = mnt_flags */
 	mip->mi_server = this_node;
-	/* vfsp->vfs_dev = vfs_dev */
-	sb->s_flags |= MS_CFS;		/* Mark as CFS stacked */
 	mip->mi_pfs_sb = sb;
 
-	/* SSI_XXX: Should we copy final PFS flags to the CFS SB? */
-
 	err = cfs_send_rb(this_node, cfssb->s_ssidev);
 
 	/* SSI_XXX: Attach orphans here? */
@@ -464,7 +516,6 @@
 	if (!err)
 		err = cfs_send_rb_up(this_node, cfssb->s_ssidev);
 
-	/* SSI_XXX: Don't need this? */
 	/* up_write(&sb->s_umount); */
 
 	if (err)

Index: write.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/write.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- write.c	2 Nov 2009 03:44:37 -0000	1.39
+++ write.c	17 Dec 2009 06:43:50 -0000	1.40
@@ -160,6 +160,7 @@
 	if (p && (p->pagevec != &p->page_array[0]))
 		kfree(p->pagevec);
 #endif
+	iput(p->inode);
 	mempool_free(p, cfs_wdata_mempool);
 }
 
@@ -176,6 +177,7 @@
 
 static __inline__ void cfs_commit_free(struct cfs_write_data *p)
 {
+	iput(p->inode);
 	mempool_free(p, cfs_commit_mempool);
 }
 
@@ -248,10 +250,11 @@
 	if (!wdata)
 		return -ENOMEM;
 
+	atomic_inc(&inode->i_count);
 	wdata->inode = inode;
-	wdata->count = (loff_t) wsize;
-	wdata->pagevec = &page;
 	wdata->stable = CFS_FILE_SYNC;
+	wdata->pagevec = &page; /* override existing ->pagevec */
+	wdata->count = (loff_t) wsize;
 	wdata->pgbase = offset;
 #endif /* CFS_PAGEVEC */
 
@@ -352,6 +355,7 @@
 #ifdef KERNEL2616_53
 	end_page_writeback(page);
 #endif
+	wdata->pagevec = NULL; /* don't kfree page */
 	cfs_writedata_free(wdata);
 #endif /* CFS_PAGEVEC */
 
@@ -1431,7 +1435,10 @@
 	if (offset)
 		BUG();
 
-	data->inode = inode = req->wb_inode;
+	inode = req->wb_inode;
+
+	atomic_inc(&inode->i_count);
+	data->inode = inode;
 #ifdef CFS_PAGEVEC
 #ifdef CFS_ASYNC_LOCAL_SYNC
 	/* Set the initial flags for the task.  */
@@ -1974,6 +1981,7 @@
 		len = 0;
 #endif
 
+	atomic_inc(&inode->i_count);
 	data->inode	  = inode;
 #ifdef CFS_COMMIT_FILE_RANGE
 	data->offset	  = start;

Index: file.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/file.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- file.c	2 Nov 2009 03:44:37 -0000	1.25
+++ file.c	17 Dec 2009 06:43:50 -0000	1.26
@@ -956,6 +956,8 @@
 #endif
 #ifdef CFS_MIRROR_LOCK_WAIT
 #ifdef CFS_FLOCK
+#ifdef SKIP
+	/* SSI: this is status of do_vfs_lock() server-side. */
 	if (!status ||
 	    status == -EINTR || status == -ERESTARTSYS) {
 		/* If we were signalled we still need to ensure that
@@ -964,14 +966,14 @@
 		 * ensure that locks_remove_posix() cleans it out when
 		 * the process exits.
 		 */
+#endif /* SKIP */
+	if (!status) {
 		sigset_t old_blocked;
 
-		if (!status)
-			ssi_block_signals(current, &old_blocked);
+		ssi_block_signals(current, &old_blocked);
 
 		(void) do_vfs_lock(filp, fl);
-		if (!status)
-			ssi_unblock_signals(current, &old_blocked);
+		ssi_unblock_signals(current, &old_blocked);
 	}
 #else
 	if (!status && posix_lock_file_wait(filp, fl) < 0)

Index: pagelist.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/pagelist.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- pagelist.c	27 Oct 2009 03:18:29 -0000	1.14
+++ pagelist.c	17 Dec 2009 06:43:50 -0000	1.15
@@ -50,6 +50,7 @@
 static inline void
 cfs_page_free(struct cfs_page *p)
 {
+	iput(p->wb_inode);
 	kmem_cache_free(cfs_page_cachep, p);
 }
 
@@ -97,6 +98,9 @@
 #ifdef CFS_NO_INTR_SKIP
 		if (signalled() && (server->flags & CFS_MOUNT_INTR))
 			return ERR_PTR(-ERESTARTSYS);
+#else
+		if (signalled() && (itocmi(inode)->mi_flags & MI_INTR))
+			return ERR_PTR(-ERESTARTSYS);
 #endif
 		yield();
 	}
@@ -104,6 +108,8 @@
 	/* Initialize the request struct. Initially, we assume a
 	 * long write-back delay. This will be adjusted in
 	 * update_cfs_request below if the region is not locked. */
+	atomic_inc(&inode->i_count);
+	req->wb_inode   = inode;
 	req->wb_page    = page;
 	atomic_set(&req->wb_complete, 0);
 	req->wb_index	= page->index;
@@ -111,7 +117,6 @@
 	req->wb_offset  = offset;
 	req->wb_pgbase	= offset;
 	req->wb_bytes   = count;
-	req->wb_inode   = inode;
 	atomic_set(&req->wb_count, 1);
 
 	return req;

Index: dir.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/dir.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- dir.c	2 Nov 2009 03:44:37 -0000	1.29
+++ dir.c	17 Dec 2009 06:43:50 -0000	1.30
@@ -950,17 +950,19 @@
 	dfprintk(VFS, "CFS: lookup(%s/%s)\n",
 		dentry->d_parent->d_name.name, dentry->d_name.name);
 
-	res = ERR_PTR(-ENAMETOOLONG);
-	if (dentry->d_name.len > (CFS_MAXPATHLEN -1))
+	if (dentry->d_name.len > (CFS_MAXPATHLEN -1)) {
+		res = ERR_PTR(-ENAMETOOLONG);
 		goto out;
+	}
 
-	res = ERR_PTR(-ENOMEM);
 	dentry->d_op = &cfs_dentry_operations;
 
 	/* TODO: allocate from kmem_cache */
 	dcd = (cfs_dcached_t *) kzmalloc(sizeof(cfs_dcached_t), GFP_KERNEL);
-	if (!dcd)
+	if (!dcd) {
+		res = ERR_PTR(-ENOMEM);
 		goto out;
+	}
 
 	result = cfstok_req(dir, CFSTOK_ATTR, CFSTOK_READ,
 		CFSTOK_HOLD|CFSTOK_BLOCK, NON_RANGE, NULL);

Index: cfstok.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfstok.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- cfstok.c	27 Oct 2009 03:18:29 -0000	1.22
+++ cfstok.c	17 Dec 2009 06:43:50 -0000	1.23
@@ -236,6 +236,7 @@
 	obj.word1 = (long)ip;
 	obj.word2 = CFSTOK_MHOLD;
 	obj.obj_pp = &cliparam;
+
 	mhtok_init(&obj, &(itoc(ip)->c_mhold));
 
 	for(which = 1; which <= CFSTOK_NTOKS; which++) {
@@ -270,6 +271,7 @@
 	obj.word1 = (long)ip;
 	obj.word2 = CFSTOK_MHOLD;
 	obj.obj_pp = &cliparam;
+
 	mhtok_destroy(&obj, &(itoc(ip)->c_mhold));
 
 	for (which = 1; which <= CFSTOK_NTOKS; which++) {
@@ -1197,11 +1199,12 @@
 		reqfail_count = 0;
 	}
 #endif
-	CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
 	agent = this_node;
 	obj.word1 = (long)ip;
 	obj.word2 = (long)which;
 	obj.obj_pp = &cliparam;
+
+	CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
 #ifdef SSI_RANGE_TOKENS
 	if (BITVAL(which) & CFSTOK_RANGE) {
 		tok_reqfail_range(&obj, ITORTCB(ip, which), oldmode, newmode, agent,
@@ -1257,11 +1260,12 @@
 {
 	object_t obj;
 
-	if (lock)
-		CFSTOK_XLOCK( itoc(ip));
 	obj.word1 = (long)ip;
 	obj.word2 = type;
 	obj.obj_pp = &cliparam;
+
+	if (lock)
+		CFSTOK_XLOCK( itoc(ip));
 #ifdef SSI_RANGE_TOKENS
 	if (BITVAL(type) & CFSTOK_RANGE) {
 		tok_install_range(&obj, ITORTCB(ip, type),
@@ -1297,6 +1301,10 @@
 {
 	object_t obj;
 
+	obj.word1 = (long)ip;
+	obj.word2 = (long)which;
+	obj.obj_pp = &cliparam;
+
 	/*
 	 * SSI_XXX:
 	 * you have to check for HOLDREQ's made before and
@@ -1304,9 +1312,6 @@
 	 */
 	CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
 
-	obj.word1 = (long)ip;
-	obj.word2 = (long)which;
-	obj.obj_pp = &cliparam;
 #ifdef SSI_RANGE_TOKENS
 	if (BITVAL(which) & CFSTOK_RANGE) {
 		tok_grant_range(&obj, ITORTCB(ip, which), oldmode, newmode,
@@ -1332,7 +1337,7 @@
 	struct	inode	*ip)
 {
 	hold_list_t *list;
-	agent_t agent;
+	/* agent_t agent; */
 	int which;
 	int ret;
 	object_t obj;
@@ -1380,6 +1385,9 @@
 		goto done;
 #endif /* SSI_XXX */
 
+	obj.word1 = (long)ip;
+	obj.obj_pp = &cliparam;
+
 	/* Send back tokens in reverse order so MTIME is kept until
 	 * all the pages have been flushed
 	 */
@@ -1392,10 +1400,9 @@
 		SSI_ASSERT(*list == NULL);
 #endif
 
-		agent = this_node;
-		obj.word1 = (long)ip;
+		/* agent = this_node; */
 		obj.word2 = (long)which;
-		obj.obj_pp = &cliparam;
+
 #ifdef SSI_RANGE_TOKENS
 		if (BITVAL(which) & CFSTOK_RANGE)
 			ret = tok_giveback_range(&obj, ITORTCB(ip, which),
@@ -1452,10 +1459,9 @@
 void
 cfstok_hold_obj(object_t *objp)
 {
-	struct inode *ip;
+	struct inode *ip = (struct inode *)objp->word1;
 
-	ip = (struct inode *)objp->word1;
-	SSI_ASSERT(atomic_read(&ip->i_count));
+	/* BUG_ON(!atomic_read(&ip->i_count)); */
 	atomic_inc(&ip->i_count);
 }
 
@@ -1497,11 +1503,13 @@
 
 	/* Get needed stuff out of object_t */
 	ip = (struct inode *)objp->word1;
+	type = (int)objp->word2;
+
 	cp = itoc(ip);
-	mip = ctomi(cp);
-	server = mip->mi_server;
 	fhp = ctofh(cp);
-	type = (int)objp->word2;
+
+	mip = itocmi(ip);
+	server = mip->mi_server;
 
 #ifdef SSI_CFS_FULLTIMES
 	size = NOSIZE;
@@ -1610,7 +1618,7 @@
 
 	}
 #ifdef CFS_EXPORT_OPS
-	memcpy(&ctargs.cta_fhandle, fhp, CFS_FH_LEN(fhp));
+	COPY_CFS_FH(&ctargs.cta_fhandle, fhp);
 #else
 	ctargs.cta_fhandle = *fhp;
 #endif
@@ -1662,7 +1670,7 @@
 		printk(KERN_WARNING "cfstok_send: nsc_rcall error %d\n", error);
 #endif
 
-	iput(ip);
+	iput(ip); /* undo HOLDOBJ() */
 	return error;
 }
 
@@ -2012,6 +2020,9 @@
 	count = hlist_count(hlistp);
 #endif
 
+	obj.word1 = (long)ip;
+	obj.obj_pp = &cliparam;
+
 	CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
 
 #ifdef SVRHOLD_LIST_LINUX_LIST
@@ -2027,9 +2038,7 @@
 		SSI_ASSERT(item->hl_op == INSTALL);
 		SSI_ASSERT(item->hl_type != CFSTOK_MHOLD);
 
-		obj.word1 = (long)ip;
 		obj.word2 = item->hl_type;
-		obj.obj_pp = &cliparam;
 
 #ifdef SSI_RANGE_TOKENS
 		if (BITVAL(item->hl_type) & CFSTOK_RANGE) {
@@ -2063,13 +2072,14 @@
 	int	which;
 	object_t obj;
 
+	obj.word1 = (long)ip;
+	obj.obj_pp = &cliparam;
+
 	CFSTOK_XLOCK(itoc(ip));
 
 	/* Skip MHOLD token for since it is never waited for */
 	for (which = 1; which <= CFSTOK_NTOKS; which++) {
-		obj.word1 = (long)ip;
 		obj.word2 = (long)which;
-		obj.obj_pp = &cliparam;
 
 #ifdef SSI_RANGE_TOKENS
 		if (BITVAL(which) & CFSTOK_RANGE) {
@@ -2381,10 +2391,12 @@
 		return 0;
 #endif
 
-	CFSTOK_XLOCK(ct);
 	obj.word1 = (long)ctoi(ct);
 	obj.word2 = (long)TOK_BAD;
 	obj.obj_pp = &cliparam;
+
+	CFSTOK_XLOCK(ct);
+
 #ifdef CFS_FASTPATH
 	/* Do fast path rebuild processing. */
 	if (do_haves)
@@ -2439,6 +2451,7 @@
 	obj.word1 = (long)ip;
 	obj.word2 = (long)which;
 	obj.obj_pp = &cliparam;
+
 	CFSTOK_XLOCK(cp);
 	tok_svrquery(&obj, ITOTCB(ip, which), oldmode, newmode, node);
 	CFSTOK_XRELE(cp);
@@ -2450,13 +2463,16 @@
 	range_off_t start, range_off_t len)
 {
 	struct inode *ip;
-	int type;
+	int mode, type, ret;
 	object_t obj;
-	int ret;
 
 	ip = (struct inode *)objp->word1;
 	type = (int)objp->word2;
 
+	obj.word1 = (long)ip;
+	obj.word2 = (long)type;
+	obj.obj_pp = &cliparam;
+
 	switch (type) {
 	case CFSTOK_MTIME:
 		SSI_ASSERT(oldmode == CFSTOK_RDWR || oldmode == CFSTOK_SU);
@@ -2476,16 +2492,11 @@
 		if ((itoc(ip)->c_wmapcnt + itoc(ip)->c_wopncnt) == 0 &&
 		    itoc(ip)->c_fastpath.fast_hold_count == 0 &&
 		    itoc(ip)->c_resv == itoc(ip)->c_resv_ret) {
-			int mode;
-
-
 			if (oldmode == CFSTOK_RDWR)
 				mode = CFSTOK_SR;
 			else
 				mode = TOK_NOMODE;
-			obj.word1 = (long)ip;
-			obj.word2 = (long)type;
-			obj.obj_pp = &cliparam;
+
 			ret = tok_giveback(&obj, ITOTCB(ip, type), mode,
 					this_node);
 			if (ret) {
@@ -2512,15 +2523,11 @@
 		if ( S_ISREG(ip->i_mode) &&
 		    (itoc(ip)->c_rmapcnt + itoc(ip)->c_ropncnt) == 0 &&
 		    itoc(ip)->c_fastpath.fast_hold_count == 0) {
-			int mode;
-
 			if (oldmode == CFSTOK_RDWR)
 				mode = CFSTOK_SR;
 			else
 				mode = TOK_NOMODE;
-			obj.word1 = (long)ip;
-			obj.word2 = (long)type;
-			obj.obj_pp = &cliparam;
+
 			ret = tok_giveback(&obj, ITOTCB(ip, type), mode,
 					this_node);
 			if (ret) {
@@ -2541,10 +2548,6 @@
 		 * fast_hold_count before sending it back.
 		 */
 		if ((itoc(ip)->c_wmapcnt + itoc(ip)->c_rmapcnt) == 0) {
-
-			obj.word1 = (long)ip;
-			obj.word2 = (long)type;
-			obj.obj_pp = &cliparam;
 			ret = tok_giveback(&obj, ITOTCB(ip, type), TOK_NOMODE,
 					this_node);
 			SSI_ASSERT(ret);
@@ -2589,9 +2592,10 @@
 
 	SSI_ASSERT(ip != NULL);
 
-	CFSTOK_XLOCK(cp);
 	obj.word1 = (long)ip;
 	obj.obj_pp = &cliparam;
+
+	CFSTOK_XLOCK(cp);
 	for (which = 1 ; which <= CFSTOK_NTOKS; which++) {
 		/* Count token waits. */
 		obj.word2 = (long)which;

Index: cfsproc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfsproc.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- cfsproc.c	18 Nov 2009 06:15:56 -0000	1.35
+++ cfsproc.c	17 Dec 2009 06:43:50 -0000	1.36
@@ -1550,7 +1550,10 @@
 	struct vfsmount *mnt;
 	int ret;
 
+	read_lock(&current->fs->lock);
 	mnt = mntget(current->fs->rootmnt);
+	read_unlock(&current->fs->lock);
+
 	ret = __cfs_root_is_ready(mnt->mnt_sb);
 	mntput(mnt);
 
@@ -1584,8 +1587,8 @@
 	 */
 	if (!__cfs_root_is_ready(sb)) {
 		res->rmi_status = -ECFS_TRYAGAIN;
-		mntput(mnt);
 		dput(root_dentry);
+		mntput(mnt);
 		return;
 	}
 
@@ -1637,8 +1640,8 @@
 	    &res->rmi_mntargs.root.cdrok_res_toks);
 
 	res->rmi_status = 0;
-	mntput(mnt);
 	dput(root_dentry);
+	mntput(mnt);
 }
 
 void

Index: cfs_mnthooks.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_mnthooks.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- cfs_mnthooks.c	24 Mar 2009 04:26:28 -0000	1.24
+++ cfs_mnthooks.c	17 Dec 2009 06:43:50 -0000	1.25
@@ -179,6 +179,7 @@
 		  int silent)
 {
 	cfs_mntinfo_t *mip;
+	struct inode *inode;
 	struct dentry *root;
 	int error = 0;
 	int mhold;
@@ -201,8 +202,10 @@
 		memcpy(csb->s_mnt_info, argp->pfs_data.pfs_data_val, PAGE_SIZE);
 	}
 	/* Create the root cnode. */
-	root = d_alloc_root(cfs_fhget(csb, &(argp->root)));
+	inode = cfs_fhget(csb, &(argp->root));
+	root = d_alloc_root(inode);
 	if (!root) {
+		iput(inode);
 		free_page(((unsigned long)csb->s_mnt_info));
 		csb->s_mnt_info = NULL;
 		error = -ENOMEM;
@@ -677,17 +680,21 @@
 cfs_mount_root(char *path, clusternode_t server)
 {
 	struct cfsrootinfo rmi;
-	struct cfs_mount_data *data_page;
-	long status;
-	int my_node = this_node;
+	struct cfs_mount_data *data_page = NULL;
 	nsc_handle_t *th;
+	int status = -ENOMEM;
+	int my_node = this_node;
 	char ssidev_buffer[9];
 
+#if 0
 	rmi.rmi_mntargs.dir_name = NULL;
 	rmi.rmi_mntargs.root.cdrok_res_toks = NULL;
 	rmi.rmi_mntargs.pfs_data.pfs_data_val = NULL;
 	data_page = NULL;
 	status = -ENOMEM;
+#else
+	memset(&rmi, 0, sizeof(rmi));
+#endif
 
 	if (!(rmi.rmi_mntargs.dir_name = kmalloc(CFS_MAXPATHLEN + 1, GFP_KERNEL)))
 		goto out;
@@ -765,6 +772,7 @@
 	struct cfsmountargs *cmap;
 	int p_len;
 
+	*type = NULL;
 	*payload = NULL;
 
 	/* Ignore local only vfsmount */
@@ -791,6 +799,7 @@
 	*payload = kmalloc(*payload_len, GFP_KERNEL);
 	if (*payload == NULL) {
 		kfree(*type);
+		*type = NULL;
 		return -ENOMEM;
 	}
 

Index: proc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/proc.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- proc.c	2 Nov 2009 03:44:37 -0000	1.22
+++ proc.c	17 Dec 2009 06:43:50 -0000	1.23
@@ -504,7 +504,7 @@
 #error no longer supported
 #endif
 	if (CFS_AT_SERVER(data->inode)) {
-		struct kvec *vec; /* SSI_XXX: belongs in cfs_read_data struct? */
+		struct kvec *vec;
 
 		MAP_CFS_PAGEVEC(data, vec, vlen);
 		status = cfsd_read(itoc(data->inode)->c_hp, data->offset,
@@ -652,7 +652,7 @@
 #error no longer supported
 #endif
 	if (CFS_AT_SERVER(data->inode)) {
-		struct kvec *vec; /* SSI_XXX: belongs in cfs_write_data struct? */
+		struct kvec *vec;
 
 		MAP_CFS_PAGEVEC(data, vec, vlen);
 		status = cfsd_write(itoc(data->inode)->c_hp, data->offset,
@@ -739,6 +739,7 @@
 		}
 	} else {
 		struct cfswriteres *res_p = NULL;
+		struct cfswriteargs args;
 		int rval;
 
 		args.cwa_fhandle = *itocfh(inode);

Index: svrcfs.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/svrcfs.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- svrcfs.c	17 Dec 2009 05:39:28 -0000	1.26
+++ svrcfs.c	17 Dec 2009 06:43:50 -0000	1.27
@@ -100,6 +100,13 @@
 
 extern tok_param_t svrparam;
 
+#define DEFINE_SVROBJ(name, type)	\
+	object_t name = {		\
+		.word1 = (long)hp,	\
+		.word2 = type,		\
+		.obj_pp = &svrparam,	\
+	}
+
 #if	defined(DEBUG)
 char *
 svrcfstok_dspfile(object_t *objp, char *buffer)
@@ -246,6 +253,7 @@
 	return hp;
 }
 
+#ifdef DEBUG
 static int
 hash_hold_and_check(svrcfstok_t *hp)
 {
@@ -262,6 +270,7 @@
 
 	return (h != NULL);
 }
+#endif /* DEBUG */
 #endif
 
 /*
@@ -829,7 +838,11 @@
 		 * can not fail.
 		 */
 		/* Find existing hash structure */
+#ifdef RCU_CFSTOK_TABLE
+		hp = hfind(fhp);
+#else
 		hp = svrtok_lookup(fhp, NULL, NULL);
+#endif
 		/* SSI_XXX: At the moment, it is possible
 		   for this to fail if it is a GIVEBACK on
 		   a down filesystem. */
@@ -934,13 +947,10 @@
 			cfspol_server(hp, agent, hints, mask, NULL);
 		if (op == HINT) {
 			int seq;
-			object_t obj;
+			DEFINE_SVROBJ(obj, 0);
 
 			seq = tokseq_getseq(cfs_tsp, agent, "cfs_tokmsg",
 				"HINTDONE");
-			obj.word1 = (long)hp;
-			obj.word2 = 0;
-			obj.obj_pp = &svrparam;
 
 			svrcfstok_hold_obj(&obj);
 			dprintk("SVR S hintdone %s %d id 0x%x seq 0x%x\n",
@@ -1034,19 +1044,23 @@
 	object_t *objp,
 	agent_t agent)
 {
+	(void) objp;
+
 	return agent;
 }
 
 void
 svrcfstok_hold_obj(object_t *objp)
 {
-	struct svrcfstok *hp = (struct svrcfstok *)objp->word1;
-
+#ifdef DEBUG
 #ifdef RCU_CFSTOK_TABLE
-	BUG_ON(!hash_hold_and_check(hp));
+	BUG_ON(!hash_hold_and_check((struct svrcfstok *) objp->word1));
 #else
-	HASH_HOLD(hp);
+#error not supported
 #endif
+#else
+	HASH_HOLD((struct svrcfstok *) objp->word1);
+#endif /* !DEBUG */
 }
 
 /*
@@ -1094,7 +1108,7 @@
 				start, len,
 				cfspol_getsvrflgs(hp), 0, 0,
 				0, this_node, &fattr);
-		HASH_RELE(hp);
+		HASH_RELE(hp); /* undo HOLDOBJ() */
 		return 0;
 	}
 #ifdef CFS_EXPORT_OPS
@@ -1137,7 +1151,7 @@
 		printk(KERN_WARNING "svrcfstok_send: nsc_rcall error %d\n", error);
 #endif
 
-	HASH_RELE(hp);
+	HASH_RELE(hp); /* undo HOLDOBJ() */
 	return 0;
 }
 #endif /* __KERNEL__ */
@@ -1156,13 +1170,10 @@
 	range_off_t len)
 {
 	int ret;
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	LOCK_LOCK(&hp->sct_tcblock);
 
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
 	if (type == CFSTOK_MHOLD) {
 		 mhsvrtok_getinstall(&obj, &hp->sct_mhold, agent);
 		 ret = TRUE;	/* Can't fail */
@@ -1208,14 +1219,10 @@
 	range_off_t start,
 	range_off_t len)
 {
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	LOCK_LOCK(&hp->sct_tcblock);
 
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
-
 #ifdef CFSTOK_RANGE
 	if (BITVAL(type) & CFSTOK_RANGE)
 		svrtok_sendinstall_range(&obj, SCTTORTCB(hp, type), mode,
@@ -1249,12 +1256,10 @@
 	range_off_t start,
 	range_off_t len)
 {
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	LOCK_LOCK(&hp->sct_tcblock);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
+
 #ifdef CFSTOK_RANGE
 	if (BITVAL(type) & CFSTOK_RANGE)
 		svrtok_request_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1288,13 +1293,10 @@
 	range_off_t len)
 {
 	int ret;
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	LOCK_LOCK(&hp->sct_tcblock);
 
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
 #ifdef CFSTOK_RANGE
 	if (BITVAL(type) & CFSTOK_RANGE)
 		ret = svrtok_return_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1331,13 +1333,10 @@
 	range_off_t len)
 {
 	int ret;
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	LOCK_LOCK(&hp->sct_tcblock);
 
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
 #ifdef CFSTOK_RANGE
 	if (BITVAL(type) & CFSTOK_RANGE)
 		ret = svrtok_giveback_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1383,7 +1382,7 @@
 	range_off_t len)
 {
 	int ret;
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 #ifdef DEBUG
 	if (revfail_find && ++revfail_count == revfail_find) {
@@ -1391,10 +1390,9 @@
 		revfail_count = 0;
 	}
 #endif
+
 	LOCK_LOCK(&hp->sct_tcblock);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
+
 #ifdef CFSTOK_RANGE
 	if (BITVAL(type) & CFSTOK_RANGE)
 		ret = svrtok_revfail_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1426,17 +1424,14 @@
 	agent_t agent)
 {
 	int ret;
-	object_t obj;
 	void *cookie;
+	DEFINE_SVROBJ(obj, type);
 
 #ifdef CFSTOK_RANGE
 	SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
 #endif
 
 	LOCK_LOCK(&hp->sct_tcblock);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
 
 	ret = svrtok_queryreq(&obj, SCTTOTCB(hp, type), mode, agent, &cookie);
 
@@ -1898,15 +1893,12 @@
 	void *query_cookie;
 	struct svrqret info;
 	struct nodeent nodeent;
-	object_t obj;
+	DEFINE_SVROBJ(obj, type);
 
 	SSI_ASSERT(LOCK_LOCKOWNED(&hp->sct_tcblock));
 	SSI_ASSERT(!(modep && type == CFSTOK_MHOLD));
 
 	NSC_NODELIST_INIT(nodelist);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
 
 	if (modep)
 		*modep = TOK_BAD;
@@ -2385,15 +2377,17 @@
 		rcu_read_unlock();
 	} /* end of for (hash = 0; hash <  HASHSIZ ; hash++) */
 
+	obj.obj_pp = &svrparam;
 	count = 0;
 	while ((hpp = (struct svrcfstok **)ics_chunk_get_entry(icp, count))) {
 		int ret;
 
 		hp = *hpp;
+#else
+			obj.obj_pp = &svrparam;
 #endif
 			obj.word1 = (long)hp;
 			obj.word2 = CFSTOK_MHOLD;
-			obj.obj_pp = &svrparam;
 
 			LOCK_LOCK(&hp->sct_tcblock);
 
@@ -2709,17 +2703,15 @@
 	int newmode,
 	agent_t node)
 {
-	object_t obj;
 	int ret;
+	DEFINE_SVROBJ(obj, type);
 
 #ifdef CFSTOK_RANGE
 	SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
 #endif
 
 	LOCK_LOCK(&hp->sct_tcblock);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
+
 	ret = svrtok_queryret(&obj, SCTTOTCB(hp, type),
 		oldmode, newmode, node);
 
@@ -2745,17 +2737,15 @@
 	int newmode,
 	agent_t node)
 {
-	object_t obj;
 	int ret;
+	DEFINE_SVROBJ(obj, type);
 
 #ifdef CFSTOK_RANGE
 	SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
 #endif
 
 	LOCK_LOCK(&hp->sct_tcblock);
-	obj.word1 = (long)hp;
-	obj.word2 = type;
-	obj.obj_pp = &svrparam;
+
 	ret = svrtok_queryfail(&obj, SCTTOTCB(hp, type),
 		oldmode, newmode, node);
 
@@ -2910,15 +2900,12 @@
 svrtok_dorelse(struct svrcfstok *hp, int forced)
 {
 	int i;
-	object_t obj;
+	DEFINE_SVROBJ(obj, CFSTOK_MHOLD);
 #ifdef RCU_CFSTOK_TABLE
 	extern void svrtok_dorelse_dealloc(struct rcu_head *);
 #endif
 
 	/* Tell token code to free any auxillary data structures */
-	obj.word1 = (long)hp;
-	obj.word2 = CFSTOK_MHOLD;
-	obj.obj_pp = &svrparam;
 	mhsvrtok_destroy(&obj, &(hp->sct_mhold), forced);
 
 	for (i = 1; i <= CFSTOK_NTOKS; i++) {

Index: read.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/read.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- read.c	2 Nov 2009 03:44:37 -0000	1.22
+++ read.c	17 Dec 2009 06:43:50 -0000	1.23
@@ -111,6 +111,7 @@
 	if (p && (p->pagevec != &p->page_array[0]))
 		kfree(p->pagevec);
 #endif
+	iput(p->inode);
 	mempool_free(p, cfs_rdata_mempool);
 }
 
@@ -160,9 +161,10 @@
 	if (!rdata)
 		return -ENOMEM;
 
-	rdata->flags = (IS_SWAPFILE(inode)? CFS_RPC_SWAPFLAGS : 0);
+	atomic_inc(&inode->i_count);
 	rdata->inode = inode;
-	rdata->pagevec = &page;
+	rdata->flags = (IS_SWAPFILE(inode)? CFS_RPC_SWAPFLAGS : 0);
+	rdata->pagevec = &page; /* override existing ->pagevec */
 	rdata->pgbase = 0UL;
 	rdata->count = rsize;
 #endif /* CFS_PAGEVEC */
@@ -279,7 +281,10 @@
 	kunmap(page);
 #endif
 	unlock_page(page);
+#ifdef CFS_PAGEVEC
+	rdata->pagevec = NULL; /* don't kfree page */
 	cfs_readdata_free(rdata);
+#endif
 	return result;
 }
 
@@ -341,6 +346,7 @@
 	if (offset || req->wb_offset)
 		BUG();
 #endif
+	atomic_inc(&req->wb_inode->i_count);
 	data->inode	  = req->wb_inode;
 	data->count	  = count;	/* nbytes */
 	/* Don't delete this keep for reference */

Index: cfs_subr.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_subr.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- cfs_subr.c	2 Nov 2009 03:44:37 -0000	1.28
+++ cfs_subr.c	17 Dec 2009 06:43:50 -0000	1.29
@@ -1124,101 +1124,102 @@
 		 int sleep_flag)
 #endif
 {
+#ifdef SKIP
 	int error = 0;			/* Error code. */
+#endif
 	cfs_mntinfo_t *mip;	/* Pointer to allocated SB info. */
 
 	SSI_ASSERT(sb != NULL);
 	SSI_ASSERT(sb->s_fs_info == NULL);
-	/* Allocate memory. */
+
 	mip = kzmalloc(sizeof(struct cfs_sb_info), GFP_KERNEL);
 	if (mip == NULL)
-		error = -ENOMEM;
-	else {
-		/* Back pointer to SB. */
-		mip->mi_sb = sb;
-		/* Filesystem state. */
-		mip->mi_sb_state = MI_SB_STATE_UP;
-		/* Initialize kernel data structures. */
+		return -ENOMEM;
+
+	/*
+	 * Initialize kernel data structures.
+	 */
+	mip->mi_sb = sb;
 #ifdef SKIP
-		INIT_ATOMIC_INT(&mip->mi_refct, 0);
-		INIT_ATOMIC_INT(&mip->mi_cnodect, 0);
+	strncpy(mip->mi_pfs_fsname,
+		(fsnamep != NULL ? fsnamep : ""),
+		sizeof(mip->mi_pfs_fsname));
 #endif
-		INIT_COND_LOCK(&mip->mi_cond_lock);
-		INIT_ATOMIC_INT(&mip->mi_sb_fsop_threads, 0);
-		INIT_INTR_CONDITION(&mip->mi_sb_state_cond);
-		INIT_INTR_CONDITION(&mip->mi_sb_down_cond);
-#ifdef SSI_CFS_SKIP
-		INIT_ATOMIC_INT(&mip->mi_svrcfstoks, 0);
+#ifdef THESE_NOT_HERE_ANYMORE
+	/* Fire up the writeback cache */
+	mip->mi_flags
+		= cfs_sb_convert_mount_flags(mount_flags);
+	mip->mi_mount_flags = mount_flags;
 #endif
-#ifdef SSI_NOTUSED
-		INIT_LIST_HEAD(&mip->lru_read);
-		INIT_LIST_HEAD(&mip->lru_dirty);
-		INIT_LIST_HEAD(&mip->lru_commit);
-		INIT_LIST_HEAD(&mip->lru_busy);
+#ifdef SKIP
+	INIT_ATOMIC_INT(&mip->mi_refct, 0);
+	INIT_ATOMIC_INT(&mip->mi_cnodect, 0);
+	/* Get mountpoint pathname. */
+	error = cfs_sb_path_alloc(&mip->mi_mntpt, mntptp,
+				   mntpt_user, sleep_flag);
 #endif
-		INIT_LIST_HEAD(&mip->dirty_down);
-#ifdef CFS_COMMIT_DOWN
-		INIT_LIST_HEAD(&mip->commit_down);
+	INIT_COND_LOCK(&mip->mi_cond_lock);
+	/* Filesystem state. */
+	mip->mi_sb_state = MI_SB_STATE_UP;
+	INIT_ATOMIC_INT(&mip->mi_sb_fsop_threads, 0);
+	INIT_INTR_CONDITION(&mip->mi_sb_state_cond);
+	INIT_INTR_CONDITION(&mip->mi_sb_down_cond);
+#ifdef SSI_CFS_SKIP
+	INIT_ATOMIC_INT(&mip->mi_svrcfstoks, 0);
+#endif
+#ifdef CFS_BDI
+	mip->backing_dev_info.ra_pages = mip->rpages * CFS_MAX_READAHEAD;
 #endif
-		INIT_LIST_HEAD(&mip->read_down);
 #ifdef KERNEL2616_53
-		mip->rsize = CFS_MAX_FILE_IO_SIZE;
-		mip->rpages = (mip->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
-		mip->wsize = CFS_MAX_FILE_IO_SIZE;
-		mip->wpages = (mip->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+	mip->rsize = CFS_MAX_FILE_IO_SIZE;
+	mip->rpages = (mip->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+	mip->wsize = CFS_MAX_FILE_IO_SIZE;
+	mip->wpages = (mip->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
 #else
-		mip->rpages = CFS_READ_MAXIOV;
-		mip->rsize = mip->rpages << PAGE_CACHE_SHIFT;
-		mip->wpages = CFS_WRITE_MAXIOV;
-                mip->wsize = mip->wpages << PAGE_CACHE_SHIFT;
-#endif
-#ifdef CFS_BDI
-		mip->backing_dev_info.ra_pages = mip->rpages * CFS_MAX_READAHEAD;
+	mip->rpages = CFS_READ_MAXIOV;
+	mip->rsize = mip->rpages << PAGE_CACHE_SHIFT;
+	mip->wpages = CFS_WRITE_MAXIOV;
+	mip->wsize = mip->wpages << PAGE_CACHE_SHIFT;
 #endif
 #if defined(CFS_ZAP_CACHES) && defined(CFS_FILE_RW_NOLOCK)
 #ifdef SKIP
-		if (sb->s_flags & MS_NOATTRCACHE) {
-			mip->acregmin = mip->acregmax = 0;
-			mip->acdirmin = mip->acdirmax = 0;
-			sb->s_flags |= MS_SYNCHRONOUS;
-		} else {
+	if (sb->s_flags & MS_NOATTRCACHE) {
+		mip->acregmin = mip->acregmax = 0;
+		mip->acdirmin = mip->acdirmax = 0;
+		sb->s_flags |= MS_SYNCHRONOUS;
+	} else {
 #endif
-			mip->acregmin = 3*HZ;
-			mip->acregmax = 60*HZ;
-			mip->acdirmin = 30*HZ;
-			mip->acdirmax = 60*HZ;
+		mip->acregmin = 3*HZ;
+		mip->acregmax = 60*HZ;
+		mip->acdirmin = 30*HZ;
+		mip->acdirmax = 60*HZ;
 #ifdef SKIP
-		}
+	}
 #endif
 #endif /* CFS_ZAP_CACHES && CFS_FILE_RW_NOLOCK */
-#ifdef THESE_NOT_HERE_ANYMORE
-		/* Fire up the writeback cache */
-		mip->mi_mount_flags = mount_flags;
-		mip->mi_flags
-			= cfs_sb_convert_mount_flags(mount_flags);
+	INIT_LIST_HEAD(&mip->dirty_down);
+#ifdef CFS_COMMIT_DOWN
+	INIT_LIST_HEAD(&mip->commit_down);
 #endif
-#ifdef SKIP
-		strncpy(mip->mi_pfs_fsname,
-			(fsnamep != NULL ? fsnamep : ""),
-			sizeof(mip->mi_pfs_fsname));
+	INIT_LIST_HEAD(&mip->read_down);
+#ifdef SSI_NOTUSED
+	INIT_LIST_HEAD(&mip->lru_read);
+	INIT_LIST_HEAD(&mip->lru_dirty);
+	INIT_LIST_HEAD(&mip->lru_commit);
+	INIT_LIST_HEAD(&mip->lru_busy);
 #endif
-	}
 #ifdef SKIP
-	/* Get mountpoint pathname. */
-	if (!error)
-		error = cfs_sb_path_alloc(&mip->mi_mntpt, mntptp,
-					   mntpt_user, sleep_flag);
-#endif
 	/* Free memory on error. */
 	if (error && mip != NULL) {
 		sb->s_fs_info = mip;
 		cfs_sb_mi_free(sb);
-		mip = NULL;
+		return error;
 	}
+#endif
 	/* Return pointer to caller. */
 	sb->s_fs_info = mip;
 
-	return error;
+	return 0;
 } /* end cfs_sb_mi_alloc() */
 
 void
@@ -1621,10 +1622,8 @@
 	if (retval < 0)
 		goto out2;
 
-	lock_kernel();	/* for fill_super() in get_sb() */
 	retval = cfs_do_remount((char*)dev_page, sb, (char*)type_page,
 			  flags, (void*)sb->s_mnt_info);
-	unlock_kernel();
 	if (retval == 0)
 		mnt_fix_devname(sb, (char*)dev_page);
 
@@ -1679,24 +1678,31 @@
 
 	/* This shouldn't be set, but I'm clearing anyway just in case */
 	flags &= ~MS_CFS;
+	/*
+	 * ->get_sb needs lock_kernel().
+	 */
+	lock_kernel();
 #if 0
 	sb = get_sb_bdev**DIFFERENT**(fstype, flags | MS_REMOUNT, name, data);
 #else 
 	sb = fstype->get_sb(fstype, flags | MS_REMOUNT, name, data);
 #endif
+	unlock_kernel();
 	if (IS_ERR(sb)) {
 		err = PTR_ERR(sb);
 		goto fs_out;
 	}
 
+	/* sb->s_dev = sb_dev */
+	sb->s_flags |= MS_CFS;		/* Mark as CFS stacked */
+	up_write(&sb->s_umount);
+
 	/* Now we have the Physical super-block set-up, lets really link
 	 * this guy up and set the CFS mount(s) back to UP.
 	 */
 	/* SSI_XXX */
 	/* mip->mi_mount_flags = mnt_flags */
 	mip->mi_server = this_node;
-	/* sb->s_dev = sb_dev */
-	sb->s_flags |= MS_CFS;		/* Mark as CFS stacked */
 	mip->mi_pfs_sb = sb;
 
 	/* SSI_XXX: Should we copy final PFS flags to the CFS SB? */
@@ -1708,12 +1714,12 @@
 	if (!err)
 		err = cfs_send_rb_up(this_node, cfssb->s_ssidev);
 
-	up_write(&sb->s_umount);
+	/* up_write(&sb->s_umount); */
 
 	if (err)
 		cfs_remount_cleanup(cfssb, sb);
-fs_out:
 
+fs_out:
 	put_filesystem(fstype);
 	return err;
 }

Index: vfs.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/vfs.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- vfs.c	27 Oct 2009 03:18:29 -0000	1.32
+++ vfs.c	17 Dec 2009 06:43:50 -0000	1.33
@@ -96,10 +96,12 @@
 	}
 
 	down(&(dparent->d_inode->i_sem));
+
 	/* Lookup the name, but don't follow links */
 	dentry = lookup_hash(name, dparent);
 	if (IS_ERR(dentry)) {
 		err = PTR_ERR(dentry);
+		dentry = NULL;
 		goto out;
 	}
 	/*
@@ -120,7 +122,7 @@
 	err = 0;
 
 out:
-	if (!IS_ERR(dentry))
+	if (dentry)
 		dput(dentry);
 	up(&(dparent->d_inode->i_sem));
 nolockout:
@@ -153,9 +155,11 @@
 		down(&(dparent->d_inode->i_sem));
 		locked = TRUE;
 	}
+
 	dentry = lookup_hash(name, dparent);
 	if (IS_ERR(dentry)) {
 		err = PTR_ERR(dentry);
+		dentry = NULL;
 		goto out;
 	}
 	/*
@@ -178,7 +182,7 @@
 	*hpp = makehp(dhp->sct_sb, dev, dentry);
 
 out:
-	if (!IS_ERR(dentry))
+	if (dentry)
 		dput(dentry);
 	if (locked)
 		up(&(dparent->d_inode->i_sem));


------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.