summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Scott <nathans@sgi.com>2006-03-14 13:30:48 +1100
committerNathan Scott <nathans@sgi.com>2006-03-14 13:30:48 +1100
commit1f6553f9f9b6e41375c605769a75bd1646685a1b (patch)
tree8fc48aaad9b58ebece96747d058b952e72866aa1
parent0293ce3a9fd1b34c933a96577a8ba737b681cf75 (diff)
[XFS] Dynamically allocate local kiocb structures in readv/writev routines
to reduce stack footprint. SGI-PV: 947312 SGI-Modid: xfs-linux-melb:xfs-kern:25358a Signed-off-by: Nathan Scott <nathans@sgi.com>
-rw-r--r--fs/xfs/linux-2.6/xfs_file.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
index ced4404339c..269995ddfbd 100644
--- a/fs/xfs/linux-2.6/xfs_file.c
+++ b/fs/xfs/linux-2.6/xfs_file.c
@@ -145,17 +145,22 @@ __linvfs_readv(
{
struct inode *inode = file->f_mapping->host;
vnode_t *vp = LINVFS_GET_VP(inode);
- struct kiocb kiocb;
+ struct kiocb *kiocb;
ssize_t rval;
- init_sync_kiocb(&kiocb, file);
- kiocb.ki_pos = *ppos;
+ kiocb = kmalloc(sizeof(*kiocb), GFP_KERNEL);
+ if (unlikely(!kiocb))
+ return -ENOMEM;
+
+ init_sync_kiocb(kiocb, file);
+ kiocb->ki_pos = *ppos;
if (unlikely(file->f_flags & O_DIRECT))
ioflags |= IO_ISDIRECT;
- VOP_READ(vp, &kiocb, iov, nr_segs, &kiocb.ki_pos, ioflags, NULL, rval);
+ VOP_READ(vp, kiocb, iov, nr_segs, &kiocb->ki_pos, ioflags, NULL, rval);
- *ppos = kiocb.ki_pos;
+ *ppos = kiocb->ki_pos;
+ kfree(kiocb);
return rval;
}
@@ -190,17 +195,22 @@ __linvfs_writev(
{
struct inode *inode = file->f_mapping->host;
vnode_t *vp = LINVFS_GET_VP(inode);
- struct kiocb kiocb;
+ struct kiocb *kiocb;
ssize_t rval;
- init_sync_kiocb(&kiocb, file);
- kiocb.ki_pos = *ppos;
+ kiocb = kmalloc(sizeof(*kiocb), GFP_KERNEL);
+ if (unlikely(!kiocb))
+ return -ENOMEM;
+
+ init_sync_kiocb(kiocb, file);
+ kiocb->ki_pos = *ppos;
if (unlikely(file->f_flags & O_DIRECT))
ioflags |= IO_ISDIRECT;
- VOP_WRITE(vp, &kiocb, iov, nr_segs, &kiocb.ki_pos, ioflags, NULL, rval);
+ VOP_WRITE(vp, kiocb, iov, nr_segs, &kiocb->ki_pos, ioflags, NULL, rval);
- *ppos = kiocb.ki_pos;
+ *ppos = kiocb->ki_pos;
+ kfree(kiocb);
return rval;
}
@@ -435,7 +445,7 @@ linvfs_ioctl(
unsigned long arg)
{
int error;
- struct inode *inode = filp->f_dentry->d_inode;
+ struct inode *inode = filp->f_dentry->d_inode;
vnode_t *vp = LINVFS_GET_VP(inode);
VOP_IOCTL(vp, inode, filp, 0, cmd, (void __user *)arg, error);
@@ -457,7 +467,7 @@ linvfs_ioctl_invis(
unsigned long arg)
{
int error;
- struct inode *inode = filp->f_dentry->d_inode;
+ struct inode *inode = filp->f_dentry->d_inode;
vnode_t *vp = LINVFS_GET_VP(inode);
ASSERT(vp);