# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # # fs/ext3/dir.c | 7 +++++-- # fs/ext3/namei.c | 11 +++++++---- # include/linux/ext3_fs.h | 2 +- # 3 files changed, 13 insertions(+), 7 deletions(-) # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/11/07 tytso@snap.thunk.org 1.778 # Check for failed kmalloc() in ext3_htree_store_dirent() # # This patch checks for a failed kmalloc() in ext3_htree_store_dirent(), # and passes the error up to its caller, ext3_htree_fill_tree(). # -------------------------------------------- # diff -Nru a/fs/ext3/dir.c b/fs/ext3/dir.c --- a/fs/ext3/dir.c Thu Nov 7 10:57:34 2002 +++ b/fs/ext3/dir.c Thu Nov 7 10:57:34 2002 @@ -308,7 +308,7 @@ /* * Given a directory entry, enter it into the fname rb tree. */ -void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, +int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, __u32 minor_hash, struct ext3_dir_entry_2 *dirent) { @@ -323,6 +323,8 @@ /* Create and allocate the fname structure */ len = sizeof(struct fname) + dirent->name_len + 1; new_fn = kmalloc(len, GFP_KERNEL); + if (!new_fn) + return -ENOMEM; memset(new_fn, 0, len); new_fn->hash = hash; new_fn->minor_hash = minor_hash; @@ -344,7 +346,7 @@ (new_fn->minor_hash == fname->minor_hash)) { new_fn->next = fname->next; fname->next = new_fn; - return; + return 0; } if (new_fn->hash < fname->hash) @@ -359,6 +361,7 @@ rb_link_node(&new_fn->rb_hash, parent, p); rb_insert_color(&new_fn->rb_hash, &info->root); + return 0; } diff -Nru a/fs/ext3/namei.c b/fs/ext3/namei.c --- a/fs/ext3/namei.c Thu Nov 7 10:57:34 2002 +++ b/fs/ext3/namei.c Thu Nov 7 10:57:34 2002 @@ -549,9 +549,11 @@ /* Add '.' and '..' from the htree header */ if (!start_hash && !start_minor_hash) { de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; - ext3_htree_store_dirent(dir_file, 0, 0, de); + if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) + goto errout; de = ext3_next_entry(de); - ext3_htree_store_dirent(dir_file, 0, 0, de); + if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) + goto errout; count += 2; } @@ -570,8 +572,9 @@ ((hinfo.hash == start_hash) && (hinfo.minor_hash < start_minor_hash))) continue; - ext3_htree_store_dirent(dir_file, hinfo.hash, - hinfo.minor_hash, de); + if ((err = ext3_htree_store_dirent(dir_file, + hinfo.hash, hinfo.minor_hash, de)) != 0) + goto errout; count++; } brelse (bh); diff -Nru a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h --- a/include/linux/ext3_fs.h Thu Nov 7 10:57:34 2002 +++ b/include/linux/ext3_fs.h Thu Nov 7 10:57:34 2002 @@ -682,7 +682,7 @@ extern int ext3_check_dir_entry(const char *, struct inode *, struct ext3_dir_entry_2 *, struct buffer_head *, unsigned long); -extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, +extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, __u32 minor_hash, struct ext3_dir_entry_2 *dirent); extern void ext3_htree_free_dir_info(struct dir_private_info *p);