> (gdb) ####################################
> (gdb) # c0169503, stack size:  408 bytes #
> (gdb) ####################################
> (gdb) 0xc0169503 is in blkdev_get (fs/block_dev.c:663).

----
this patch reduces the stack footprint of blkdev_get() from 408 bytes to 
28 bytes. Build and boot-tested.

Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>

Index: linux/fs/block_dev.c
===================================================================
--- linux.orig/fs/block_dev.c
+++ linux/fs/block_dev.c
@@ -667,14 +667,32 @@ int blkdev_get(struct block_device *bdev
         * For now, block device ->open() routine must _not_
         * examine anything in 'inode' argument except ->i_rdev.
         */
-       struct file fake_file = {};
-       struct dentry fake_dentry = {};
-       fake_file.f_mode = mode;
-       fake_file.f_flags = flags;
-       fake_file.f_dentry = &fake_dentry;
-       fake_dentry.d_inode = bdev->bd_inode;
-
-       return do_open(bdev, &fake_file);
+       struct file *fake_file;
+       struct dentry *fake_dentry;
+       int err = -ENOMEM;
+
+       fake_file = kmalloc(sizeof(*fake_file), GFP_KERNEL);
+       if (!fake_file)
+               goto out;
+       memset(fake_file, 0, sizeof(*fake_file));
+
+       fake_dentry = kmalloc(sizeof(*fake_dentry), GFP_KERNEL);
+       if (!fake_dentry)
+               goto out_free_file;
+       memset(fake_dentry, 0, sizeof(*fake_dentry));
+
+       fake_file->f_mode = mode;
+       fake_file->f_flags = flags;
+       fake_file->f_dentry = fake_dentry;
+       fake_dentry->d_inode = bdev->bd_inode;
+
+       err = do_open(bdev, fake_file);
+
+       kfree(fake_dentry);
+out_free_file:
+       kfree(fake_file);
+out:
+       return err;
 }
 
 EXPORT_SYMBOL(blkdev_get);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to