Commit b5edfd27 authored by Al Viro's avatar Al Viro

hppfs: fix the leaks on close()

we need to close the underlying procfs file and free ->private_data
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3dc20cb2
...@@ -436,7 +436,6 @@ static int hppfs_open(struct inode *inode, struct file *file) ...@@ -436,7 +436,6 @@ static int hppfs_open(struct inode *inode, struct file *file)
path.mnt = inode->i_sb->s_fs_info; path.mnt = inode->i_sb->s_fs_info;
path.dentry = HPPFS_I(inode)->proc_dentry; path.dentry = HPPFS_I(inode)->proc_dentry;
/* XXX This isn't closed anywhere */
data->proc_file = dentry_open(&path, file_mode(file->f_mode), cred); data->proc_file = dentry_open(&path, file_mode(file->f_mode), cred);
err = PTR_ERR(data->proc_file); err = PTR_ERR(data->proc_file);
if (IS_ERR(data->proc_file)) if (IS_ERR(data->proc_file))
...@@ -523,12 +522,23 @@ static loff_t hppfs_llseek(struct file *file, loff_t off, int where) ...@@ -523,12 +522,23 @@ static loff_t hppfs_llseek(struct file *file, loff_t off, int where)
return default_llseek(file, off, where); return default_llseek(file, off, where);
} }
static int hppfs_release(struct inode *inode, struct file *file)
{
struct hppfs_private *data = file->private_data;
struct file *proc_file = data->proc_file;
if (proc_file)
fput(proc_file);
kfree(data);
return 0;
}
static const struct file_operations hppfs_file_fops = { static const struct file_operations hppfs_file_fops = {
.owner = NULL, .owner = NULL,
.llseek = hppfs_llseek, .llseek = hppfs_llseek,
.read = hppfs_read, .read = hppfs_read,
.write = hppfs_write, .write = hppfs_write,
.open = hppfs_open, .open = hppfs_open,
.release = hppfs_release,
}; };
struct hppfs_dirent { struct hppfs_dirent {
...@@ -582,6 +592,7 @@ static const struct file_operations hppfs_dir_fops = { ...@@ -582,6 +592,7 @@ static const struct file_operations hppfs_dir_fops = {
.open = hppfs_dir_open, .open = hppfs_dir_open,
.fsync = hppfs_fsync, .fsync = hppfs_fsync,
.llseek = default_llseek, .llseek = default_llseek,
.release = hppfs_release,
}; };
static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf) static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment