projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] fs: fix libfs data leak
[deliverable/linux.git]
/
fs
/
libfs.c
diff --git
a/fs/libfs.c
b/fs/libfs.c
index bd08e0e64a8caa8731c9ee5ccbd37962eb658298..cf79196535ec5fc277f2dc9f190a3cc7e551dcd6 100644
(file)
--- a/
fs/libfs.c
+++ b/
fs/libfs.c
@@
-63,7
+63,7
@@
int dcache_dir_open(struct inode *inode, struct file *file)
{
static struct qstr cursor_name = {.len = 1, .name = "."};
{
static struct qstr cursor_name = {.len = 1, .name = "."};
- file->private_data = d_alloc(file->f_dentry, &cursor_name);
+ file->private_data = d_alloc(file->f_
path.
dentry, &cursor_name);
return file->private_data ? 0 : -ENOMEM;
}
return file->private_data ? 0 : -ENOMEM;
}
@@
-76,7
+76,7
@@
int dcache_dir_close(struct inode *inode, struct file *file)
loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
{
loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
{
- mutex_lock(&file->f_dentry->d_inode->i_mutex);
+ mutex_lock(&file->f_
path.
dentry->d_inode->i_mutex);
switch (origin) {
case 1:
offset += file->f_pos;
switch (origin) {
case 1:
offset += file->f_pos;
@@
-84,7
+84,7
@@
loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
if (offset >= 0)
break;
default:
if (offset >= 0)
break;
default:
- mutex_unlock(&file->f_dentry->d_inode->i_mutex);
+ mutex_unlock(&file->f_
path.
dentry->d_inode->i_mutex);
return -EINVAL;
}
if (offset != file->f_pos) {
return -EINVAL;
}
if (offset != file->f_pos) {
@@
-96,8
+96,8
@@
loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
spin_lock(&dcache_lock);
list_del(&cursor->d_u.d_child);
spin_lock(&dcache_lock);
list_del(&cursor->d_u.d_child);
- p = file->f_dentry->d_subdirs.next;
- while (n && p != &file->f_dentry->d_subdirs) {
+ p = file->f_
path.
dentry->d_subdirs.next;
+ while (n && p != &file->f_
path.
dentry->d_subdirs) {
struct dentry *next;
next = list_entry(p, struct dentry, d_u.d_child);
if (!d_unhashed(next) && next->d_inode)
struct dentry *next;
next = list_entry(p, struct dentry, d_u.d_child);
if (!d_unhashed(next) && next->d_inode)
@@
-108,7
+108,7
@@
loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
spin_unlock(&dcache_lock);
}
}
spin_unlock(&dcache_lock);
}
}
- mutex_unlock(&file->f_dentry->d_inode->i_mutex);
+ mutex_unlock(&file->f_
path.
dentry->d_inode->i_mutex);
return offset;
}
return offset;
}
@@
-126,7
+126,7
@@
static inline unsigned char dt_type(struct inode *inode)
int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
- struct dentry *dentry = filp->f_dentry;
+ struct dentry *dentry = filp->f_
path.
dentry;
struct dentry *cursor = filp->private_data;
struct list_head *p, *q = &cursor->d_u.d_child;
ino_t ino;
struct dentry *cursor = filp->private_data;
struct list_head *p, *q = &cursor->d_u.d_child;
ino_t ino;
@@
-186,7
+186,7
@@
const struct file_operations simple_dir_operations = {
.fsync = simple_sync_file,
};
.fsync = simple_sync_file,
};
-struct inode_operations simple_dir_inode_operations = {
+
const
struct inode_operations simple_dir_inode_operations = {
.lookup = simple_lookup,
};
.lookup = simple_lookup,
};
@@
-195,11
+195,11
@@
struct inode_operations simple_dir_inode_operations = {
* will never be mountable)
*/
int get_sb_pseudo(struct file_system_type *fs_type, char *name,
* will never be mountable)
*/
int get_sb_pseudo(struct file_system_type *fs_type, char *name,
- struct super_operations *ops, unsigned long magic,
+
const
struct super_operations *ops, unsigned long magic,
struct vfsmount *mnt)
{
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
struct vfsmount *mnt)
{
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
- static struct super_operations default_ops = {.statfs = simple_statfs};
+ static
const
struct super_operations default_ops = {.statfs = simple_statfs};
struct dentry *dentry;
struct inode *root;
struct qstr d_name = {.name = name, .len = strlen(name)};
struct dentry *dentry;
struct inode *root;
struct qstr d_name = {.name = name, .len = strlen(name)};
@@
-335,17
+335,18
@@
int simple_prepare_write(struct file *file, struct page *page,
flush_dcache_page(page);
kunmap_atomic(kaddr, KM_USER0);
}
flush_dcache_page(page);
kunmap_atomic(kaddr, KM_USER0);
}
- SetPageUptodate(page);
}
return 0;
}
int simple_commit_write(struct file *file, struct page *page,
}
return 0;
}
int simple_commit_write(struct file *file, struct page *page,
- unsigned
offset
, unsigned to)
+ unsigned
from
, unsigned to)
{
struct inode *inode = page->mapping->host;
loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
{
struct inode *inode = page->mapping->host;
loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
+ if (!PageUptodate(page))
+ SetPageUptodate(page);
/*
* No need to use i_size_read() here, the i_size
* cannot change under us because we hold the i_mutex.
/*
* No need to use i_size_read() here, the i_size
* cannot change under us because we hold the i_mutex.
This page took
0.028732 seconds
and
5
git commands to generate.