diff options
| author | Marcin Slusarz <marcin.slusarz@gmail.com> | 2008-11-16 13:02:45 -0500 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2009-04-02 06:29:49 -0400 |
| commit | 530f1a5e3e93a038a457faf716975ed19f82831d (patch) | |
| tree | 59dbd8517dd925067891d61b26589ad759c56278 | |
| parent | ba9aadd80c24775e55a93ebe0c2491b4d2899257 (diff) | |
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>
Signed-off-by: Jan Kara <jack@suse.cz>
| -rw-r--r-- | 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 9fdf8c93c58e..a3bbdbde9f4b 100644 --- a/fs/udf/unicode.c +++ b/fs/udf/unicode.c | |||
| @@ -324,34 +324,43 @@ try_again: | |||
| 324 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, | 324 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, |
| 325 | int flen) | 325 | int flen) |
| 326 | { | 326 | { |
| 327 | struct ustr filename, unifilename; | 327 | struct ustr *filename, *unifilename; |
| 328 | int len; | 328 | int len = 0; |
| 329 | 329 | ||
| 330 | if (udf_build_ustr_exact(&unifilename, sname, flen)) | 330 | filename = kmalloc(sizeof(struct ustr), GFP_NOFS); |
| 331 | if (!filename) | ||
| 331 | return 0; | 332 | return 0; |
| 332 | 333 | ||
| 334 | unifilename = kmalloc(sizeof(struct ustr), GFP_NOFS); | ||
| 335 | if (!unifilename) | ||
| 336 | goto out1; | ||
| 337 | |||
| 338 | if (udf_build_ustr_exact(unifilename, sname, flen)) | ||
| 339 | goto out2; | ||
| 340 | |||
| 333 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { | 341 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { |
| 334 | if (!udf_CS0toUTF8(&filename, &unifilename)) { | 342 | if (!udf_CS0toUTF8(filename, unifilename)) { |
| 335 | udf_debug("Failed in udf_get_filename: sname = %s\n", | 343 | udf_debug("Failed in udf_get_filename: sname = %s\n", |
| 336 | sname); | 344 | sname); |
| 337 | return 0; | 345 | goto out2; |
| 338 | } | 346 | } |
| 339 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { | 347 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { |
| 340 | if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, | 348 | if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, filename, |
| 341 | &unifilename)) { | 349 | unifilename)) { |
| 342 | udf_debug("Failed in udf_get_filename: sname = %s\n", | 350 | udf_debug("Failed in udf_get_filename: sname = %s\n", |
| 343 | sname); | 351 | sname); |
| 344 | return 0; | 352 | goto out2; |
| 345 | } | 353 | } |
| 346 | } else | 354 | } else |
| 347 | return 0; | 355 | goto out2; |
| 348 | 356 | ||
| 349 | len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, | 357 | len = udf_translate_to_linux(dname, filename->u_name, filename->u_len, |
| 350 | unifilename.u_name, unifilename.u_len); | 358 | unifilename->u_name, unifilename->u_len); |
| 351 | if (len) | 359 | out2: |
| 352 | return len; | 360 | kfree(unifilename); |
| 353 | 361 | out1: | |
| 354 | return 0; | 362 | kfree(filename); |
| 363 | return len; | ||
| 355 | } | 364 | } |
| 356 | 365 | ||
| 357 | int udf_put_filename(struct super_block *sb, const uint8_t *sname, | 366 | int udf_put_filename(struct super_block *sb, const uint8_t *sname, |
