Messages in this thread | | | Date | Wed, 19 Nov 2008 16:54:18 +0100 | From | Jan Kara <> | Subject | Re: [PATCH 2/2] udf: reduce stack usage of udf_get_filename |
| |
On Sun 16-11-08 19:02:45, Marcin Slusarz wrote: > 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> Both patches look fine. Thanks Martin. I've merged them to my UDF tree.
Honza
> --- > 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 > -- Jan Kara <jack@suse.cz> SUSE Labs, CR
| |