Re: Stack usage patch 2 of 2

John Hughes <[email protected]>
Newsgroups gmane.linux.cluster.ssic.devel
Message-ID <[email protected]>
Patch part 2 of 2

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword

_______________________________________________
ssic-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ssic-linux-devel
cfs-stack-usage-2.patch (text/x-patch, 5.7 KB)
Index: kernel/cluster/ssi/cfs/vfs.c
===================================================================
RCS file: /usr/local/lib/cvs-repo/sourceforge-openssi/kernel/cluster/ssi/cfs/vfs.c,v
retrieving revision 1.27
retrieving revision 1.27.4.3
diff -u -r1.27 -r1.27.4.3
--- kernel/cluster/ssi/cfs/vfs.c	10 Oct 2008 08:10:32 -0000	1.27
+++ kernel/cluster/ssi/cfs/vfs.c	15 Jan 2009 14:30:31 -0000	1.27.4.3
@@ -590,13 +590,18 @@
 {
 	mm_segment_t	oldfs;
 	int		err;
-	struct file	file;
+	struct file	*filp;
+
+	if (!(filp = kmalloc (sizeof *filp, GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto out_nomem;
+	}
 
-	err = cfsd_open(hp, S_IFREG, MAY_READ, &file);
+	err = cfsd_open(hp, S_IFREG, MAY_READ, filp);
 	if (err)
 		goto out;
 	err = -EPERM;
-	if (!file.f_op->read)
+	if (!filp->f_op->read)
 		goto out_close;
 
 #ifdef CFS_PARANOIA
@@ -606,20 +611,20 @@
 	/* SSI_XXX: We should send the pid and actually do this mandatory lock
 	 * check.
 	 */
-	ret = locks_verify_area(FLOCK_VERIFY_READ, file.f_dentry->d_inode,
-				&file, file.f_pos, *count);
+	ret = locks_verify_area(FLOCK_VERIFY_READ, filp->f_dentry->d_inode,
+				filp, filp->f_pos, *count);
 #endif
 
 #ifdef CFS_READAHEAD
 	/* Get readahead parameters */
 	if (hp->sct_ra.ra_pages)
-		file.f_ra = hp->sct_ra;
+		filp->f_ra = hp->sct_ra;
 #endif
 
 	oldfs = get_fs(); set_fs(KERNEL_DS);
 #ifdef CFS_PAGEVEC
-	if (file.f_op->readv)
-		err = file.f_op->readv(&file, (struct iovec __user *)vec, vlen, &offset);
+	if (filp->f_op->readv)
+		err = filp->f_op->readv(filp, (struct iovec __user *)vec, vlen, &offset);
 	else {
 		/* Do it by hand, with file-ops. Borrowed from do_readv_writev */
 		err = 0;
@@ -633,7 +638,7 @@
 			vec++;
 			vlen--;
 
-			nr = file.f_op->read(&file, base, len, &offset);
+			nr = filp->f_op->read(filp, base, len, &offset);
 
 			if (nr < 0) {
 				if (!err) err = nr;
@@ -645,26 +650,28 @@
 		}
 	}
 #else
-	file.f_pos = offset;
+	filp->f_pos = offset;
 
-	err = file.f_op->read(&file, buf, *count, &file.f_pos);
+	err = filp->f_op->read(filp, buf, *count, &filp->f_pos);
 #endif
 	set_fs(oldfs);
 
 #ifdef CFS_READAHEAD
 	/* Write back readahead params */
-	hp->sct_ra = file.f_ra;
+	hp->sct_ra = filp->f_ra;
 #endif
 
 	dprintk("cfsd: read complete err=%d\n", err);
 	if (err >= 0) {
 		*count = err;
 		err = 0;
-		dnotify_parent(file.f_dentry, DN_ACCESS);
+		dnotify_parent(filp->f_dentry, DN_ACCESS);
 	}
 out_close:
-	cfsd_close(&file);
+	cfsd_close(filp);
 out:
+	kfree (filp);
+out_nomem:
 	return err;
 }
 
@@ -681,7 +688,7 @@
 	int stable)
 #endif
 {
-	struct file		file;
+	struct file		*filp;
 	struct dentry		*dentry;
 	struct inode		*inode;
 	mm_segment_t		oldfs;
@@ -691,16 +698,21 @@
 	int gathered_writes = 1;
 #endif
 
-	err = cfsd_open(hp, S_IFREG, MAY_WRITE, &file);
+	if (!(filp = kmalloc (sizeof *filp, GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto out_nomem;
+	}
+
+	err = cfsd_open(hp, S_IFREG, MAY_WRITE, filp);
 	if (err)
 		goto out;
 	if (!cnt)
 		goto out_close;
 	err = -EPERM;
-	if (!file.f_op->write)
+	if (!filp->f_op->write)
 		goto out_close;
 
-	dentry = file.f_dentry;
+	dentry = filp->f_dentry;
 	inode = dentry->d_inode;
 
 	/*
@@ -710,7 +722,7 @@
 	 * When gathered writes have been configured for this volume,
 	 * flushing the data to disk is handled separately below.
 	 */
-	if (file.f_op->fsync == 0) {	/* COMMIT cannot work */
+	if (filp->f_op->fsync == 0) {	/* COMMIT cannot work */
 	       stable = 2;
 	}
 
@@ -721,7 +733,7 @@
 #ifdef CFS_GATHERWRITES
 		if (!gathered_writes)
 #endif
-			file.f_flags |= O_SYNC;
+			filp->f_flags |= O_SYNC;
 
 	/* Write the data. */
 	oldfs = get_fs(); set_fs(KERNEL_DS);
@@ -746,23 +758,23 @@
 	 *		...
 	 * ->i_sem	(generic_file_writev)
 	 */
-	if (file.f_op->writev == generic_file_writev && sem_owned(&inode->i_sem)) {
+	if (filp->f_op->writev == generic_file_writev && sem_owned(&inode->i_sem)) {
 		/* Prevent further generic_file_writev() recursion. */
 		current->balancing_dirty_pages = 1;
-		err = generic_file_write_nolock(&file,
+		err = generic_file_write_nolock(filp,
 						(struct iovec __user *)vec,
 						vlen, &offset);
 		current->balancing_dirty_pages = 0;
-	} else if (file.f_op->writev) {
-		err = file.f_op->writev(&file,
+	} else if (filp->f_op->writev) {
+		err = filp->f_op->writev(filp,
 					(struct iovec __user *)vec,
 					vlen, &offset);
 	} else {
-		WARN_ON(file.f_op->write == generic_file_write &&
+		WARN_ON(filp->f_op->write == generic_file_write &&
 				sem_owned(&inode->i_sem));
 #else
-	if (file.f_op->writev)
-		err = file.f_op->writev(&file, (struct iovec __user *)vec, vlen, &offset);
+	if (filp->f_op->writev)
+		err = filp->f_op->writev(filp, (struct iovec __user *)vec, vlen, &offset);
 	else {
 #endif
 		/* Do it by hand, with file-ops. Borrowed from do_readv_writev */
@@ -777,7 +789,7 @@
 			vec++;
 			vlen--;
 
-			nr = file.f_op->write(&file, base, len, &offset);
+			nr = filp->f_op->write(filp, base, len, &offset);
 
 			if (nr < 0) {
 				if (!err) err = nr;
@@ -789,14 +801,14 @@
 		}
 	}
 #else
-	file.f_pos = offset;		/* set write offset */
+	filp->f_pos = offset;		/* set write offset */
 
-	err = file.f_op->write(&file, buf, cnt, &file.f_pos);
+	err = filp->f_op->write(filp, buf, cnt, &filp->f_pos);
 #endif /* !CFS_PAGEVEC */
-	/* err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset); */
+	/* err = vfs_writev(filp, (struct iovec __user *)vec, vlen, &offset); */
 	set_fs(oldfs);
 	if (err > 0)
-		dnotify_parent(file.f_dentry, DN_MODIFY);
+		dnotify_parent(filp->f_dentry, DN_MODIFY);
 
 	/* clear setuid/setgid flag after write */
 	if (err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID))) {
@@ -851,8 +863,10 @@
 	if (err >= 0)
 		err = 0;
 out_close:
-	cfsd_close(&file);
+	cfsd_close(filp);
 out:
+	kfree (filp);
+out_nomem:
 	return err;
 }
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.