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;
}