lkml.org 
[lkml]   [2008]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/2] udf: reduce stack usage of udf_get_filename
    Allocate strings with kmalloc.

    Checkstack output:
    Before: udf_get_filename: 600
    After: udf_get_filename: 136

    Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
    Cc: Jan Kara <jack@suse.cz>
    ---
    fs/udf/unicode.c | 41 +++++++++++++++++++++++++----------------
    1 files changed, 25 insertions(+), 16 deletions(-)

    diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
    index 9fdf8c9..a3bbdbd 100644
    --- a/fs/udf/unicode.c
    +++ b/fs/udf/unicode.c
    @@ -324,34 +324,43 @@ try_again:
    int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname,
    int flen)
    {
    - struct ustr filename, unifilename;
    - int len;
    + struct ustr *filename, *unifilename;
    + int len = 0;

    - if (udf_build_ustr_exact(&unifilename, sname, flen))
    + filename = kmalloc(sizeof(struct ustr), GFP_NOFS);
    + if (!filename)
    return 0;

    + unifilename = kmalloc(sizeof(struct ustr), GFP_NOFS);
    + if (!unifilename)
    + goto out1;
    +
    + if (udf_build_ustr_exact(unifilename, sname, flen))
    + goto out2;
    +
    if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) {
    - if (!udf_CS0toUTF8(&filename, &unifilename)) {
    + if (!udf_CS0toUTF8(filename, unifilename)) {
    udf_debug("Failed in udf_get_filename: sname = %s\n",
    sname);
    - return 0;
    + goto out2;
    }
    } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) {
    - if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename,
    - &unifilename)) {
    + if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, filename,
    + unifilename)) {
    udf_debug("Failed in udf_get_filename: sname = %s\n",
    sname);
    - return 0;
    + goto out2;
    }
    } else
    - return 0;
    -
    - len = udf_translate_to_linux(dname, filename.u_name, filename.u_len,
    - unifilename.u_name, unifilename.u_len);
    - if (len)
    - return len;
    -
    - return 0;
    + goto out2;
    +
    + len = udf_translate_to_linux(dname, filename->u_name, filename->u_len,
    + unifilename->u_name, unifilename->u_len);
    +out2:
    + kfree(unifilename);
    +out1:
    + kfree(filename);
    + return len;
    }

    int udf_put_filename(struct super_block *sb, const uint8_t *sname,
    --
    1.5.6.4


    \
     
     \ /
      Last update: 2008-11-16 19:05    [W:0.022 / U:181.248 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site