2003-02-24 19:38:18

by Alex Tomas

[permalink] [raw]
Subject: [PATCH] one more memory leak in ext3+htree


Hello!

I've just found one more memory leak in ext2+htree code.
this time it's free_rb_tree_fname(). here is aggregated
from previous messages patch against 2.5.62. it fixes
two memory leaks.



diff -uNr linux/fs/ext3/dir.c edited/fs/ext3/dir.c
--- linux/fs/ext3/dir.c Mon Nov 11 06:28:16 2002
+++ edited/fs/ext3/dir.c Mon Feb 24 22:19:55 2003
@@ -33,12 +33,17 @@
static int ext3_readdir(struct file *, void *, filldir_t);
static int ext3_dx_readdir(struct file * filp,
void * dirent, filldir_t filldir);
+static int ext3_release_dir (struct inode * inode,
+ struct file * filp);

struct file_operations ext3_dir_operations = {
.read = generic_read_dir,
.readdir = ext3_readdir, /* we take BKL. needed?*/
.ioctl = ext3_ioctl, /* BKL held */
.fsync = ext3_sync_file, /* BKL held */
+#ifdef CONFIG_EXT3_INDEX
+ .release = ext3_release_dir,
+#endif
};


@@ -275,7 +281,11 @@
*/
parent = n->rb_parent;
fname = rb_entry(n, struct fname, rb_hash);
- kfree(fname);
+ while (fname) {
+ struct fname * old = fname;
+ fname = fname->next;
+ kfree (old);
+ }
if (!parent)
root->rb_node = 0;
else if (parent->rb_left == n)
@@ -481,4 +491,13 @@
UPDATE_ATIME(inode);
return 0;
}
+
+static int ext3_release_dir (struct inode * inode, struct file * filp)
+{
+ if (is_dx(inode) && filp->private_data)
+ ext3_htree_free_dir_info(filp->private_data);
+
+ return 0;
+}
+
#endif