aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
authorMarcin Slusarz <marcin.slusarz@gmail.com>2008-11-16 13:01:44 -0500
committerJan Kara <jack@suse.cz>2009-04-02 06:29:48 -0400
commitba9aadd80c24775e55a93ebe0c2491b4d2899257 (patch)
tree29b8f456c6322f9a0d375bfa0a368ef4e18b0cb8 /fs/udf
parent97e961fdbf32488b7386c9f1effa2bee97d47929 (diff)
udf: reduce stack usage of udf_load_pvoldesc
Allocate strings with kmalloc. Checkstack output: Before: udf_process_sequence: 712 After: udf_process_sequence: 200 Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/super.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 62755821374..8364b171915 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -902,14 +902,23 @@ static int udf_find_fileset(struct super_block *sb,
902static int udf_load_pvoldesc(struct super_block *sb, sector_t block) 902static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
903{ 903{
904 struct primaryVolDesc *pvoldesc; 904 struct primaryVolDesc *pvoldesc;
905 struct ustr instr; 905 struct ustr *instr, *outstr;
906 struct ustr outstr;
907 struct buffer_head *bh; 906 struct buffer_head *bh;
908 uint16_t ident; 907 uint16_t ident;
908 int ret = 1;
909
910 instr = kmalloc(sizeof(struct ustr), GFP_NOFS);
911 if (!instr)
912 return 1;
913
914 outstr = kmalloc(sizeof(struct ustr), GFP_NOFS);
915 if (!outstr)
916 goto out1;
909 917
910 bh = udf_read_tagged(sb, block, block, &ident); 918 bh = udf_read_tagged(sb, block, block, &ident);
911 if (!bh) 919 if (!bh)
912 return 1; 920 goto out2;
921
913 BUG_ON(ident != TAG_IDENT_PVD); 922 BUG_ON(ident != TAG_IDENT_PVD);
914 923
915 pvoldesc = (struct primaryVolDesc *)bh->b_data; 924 pvoldesc = (struct primaryVolDesc *)bh->b_data;
@@ -925,20 +934,25 @@ static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
925#endif 934#endif
926 } 935 }
927 936
928 if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) 937 if (!udf_build_ustr(instr, pvoldesc->volIdent, 32))
929 if (udf_CS0toUTF8(&outstr, &instr)) { 938 if (udf_CS0toUTF8(outstr, instr)) {
930 strncpy(UDF_SB(sb)->s_volume_ident, outstr.u_name, 939 strncpy(UDF_SB(sb)->s_volume_ident, outstr->u_name,
931 outstr.u_len > 31 ? 31 : outstr.u_len); 940 outstr->u_len > 31 ? 31 : outstr->u_len);
932 udf_debug("volIdent[] = '%s'\n", 941 udf_debug("volIdent[] = '%s'\n",
933 UDF_SB(sb)->s_volume_ident); 942 UDF_SB(sb)->s_volume_ident);
934 } 943 }
935 944
936 if (!udf_build_ustr(&instr, pvoldesc->volSetIdent, 128)) 945 if (!udf_build_ustr(instr, pvoldesc->volSetIdent, 128))
937 if (udf_CS0toUTF8(&outstr, &instr)) 946 if (udf_CS0toUTF8(outstr, instr))
938 udf_debug("volSetIdent[] = '%s'\n", outstr.u_name); 947 udf_debug("volSetIdent[] = '%s'\n", outstr->u_name);
939 948
940 brelse(bh); 949 brelse(bh);
941 return 0; 950 ret = 0;
951out2:
952 kfree(outstr);
953out1:
954 kfree(instr);
955 return ret;
942} 956}
943 957
944static int udf_load_metadata_files(struct super_block *sb, int partition) 958static int udf_load_metadata_files(struct super_block *sb, int partition)