git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
fs
/
libfs.c
diff --git
a/fs/libfs.c
b/fs/libfs.c
index
30110a2
..
f503fcd
100644
(file)
--- a/
fs/libfs.c
+++ b/
fs/libfs.c
@@
-7,6
+7,8
@@
#include <linux/pagemap.h>
#include <linux/mount.h>
#include <linux/vfs.h>
#include <linux/pagemap.h>
#include <linux/mount.h>
#include <linux/vfs.h>
+#include <linux/mutex.h>
+
#include <asm/uaccess.h>
int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
#include <asm/uaccess.h>
int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
@@
-18,9
+20,9
@@
int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
return 0;
}
return 0;
}
-int simple_statfs(struct
super_block *sb
, struct kstatfs *buf)
+int simple_statfs(struct
dentry *dentry
, struct kstatfs *buf)
{
{
- buf->f_type = sb->s_magic;
+ buf->f_type =
dentry->d_
sb->s_magic;
buf->f_bsize = PAGE_CACHE_SIZE;
buf->f_namelen = NAME_MAX;
return 0;
buf->f_bsize = PAGE_CACHE_SIZE;
buf->f_namelen = NAME_MAX;
return 0;
@@
-61,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;
}
@@
-74,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;
@@
-82,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) {
@@
-94,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)
@@
-106,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;
}
@@
-125,7
+127,7
@@
static inline unsigned char dt_type(struct inode *inode)
static inline int do_dcache_readdir_filter(struct file * filp,
void * dirent, filldir_t filldir, int (*filter)(struct dentry *dentry))
{
static inline int do_dcache_readdir_filter(struct file * filp,
void * dirent, filldir_t filldir, int (*filter)(struct dentry *dentry))
{
- 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;
@@
-148,10
+150,9
@@
static inline int do_dcache_readdir_filter(struct file * filp,
/* fallthrough */
default:
spin_lock(&dcache_lock);
/* fallthrough */
default:
spin_lock(&dcache_lock);
- if (filp->f_pos == 2) {
- list_del(q);
- list_add(q, &dentry->d_subdirs);
- }
+ if (filp->f_pos == 2)
+ list_move(q, &dentry->d_subdirs);
+
for (p=q->next; p != &dentry->d_subdirs; p=p->next) {
struct dentry *next;
next = list_entry(p, struct dentry, d_u.d_child);
for (p=q->next; p != &dentry->d_subdirs; p=p->next) {
struct dentry *next;
next = list_entry(p, struct dentry, d_u.d_child);
@@
-165,8
+166,7
@@
static inline int do_dcache_readdir_filter(struct file * filp,
return 0;
spin_lock(&dcache_lock);
/* next is still alive */
return 0;
spin_lock(&dcache_lock);
/* next is still alive */
- list_del(q);
- list_add(q, p);
+ list_move(q, p);
p = q;
filp->f_pos++;
}
p = q;
filp->f_pos++;
}
@@
-192,7
+192,7
@@
ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t
return -EISDIR;
}
return -EISDIR;
}
-struct file_operations simple_dir_operations = {
+
const
struct file_operations simple_dir_operations = {
.open = dcache_dir_open,
.release = dcache_dir_close,
.llseek = dcache_dir_lseek,
.open = dcache_dir_open,
.release = dcache_dir_close,
.llseek = dcache_dir_lseek,
@@
-209,9
+209,9
@@
struct inode_operations simple_dir_inode_operations = {
* Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
* will never be mountable)
*/
* Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
* will never be mountable)
*/
-struct super_block *
-
get_sb_pseudo(struct file_system_type *fs_type, char *name
,
- struct
super_operations *ops, unsigned long magic
)
+int get_sb_pseudo(struct file_system_type *fs_type, char *name,
+
struct super_operations *ops, unsigned long magic
,
+ struct
vfsmount *mnt
)
{
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
static struct super_operations default_ops = {.statfs = simple_statfs};
{
struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
static struct super_operations default_ops = {.statfs = simple_statfs};
@@
-220,7
+220,7
@@
get_sb_pseudo(struct file_system_type *fs_type, char *name,
struct qstr d_name = {.name = name, .len = strlen(name)};
if (IS_ERR(s))
struct qstr d_name = {.name = name, .len = strlen(name)};
if (IS_ERR(s))
- return
s
;
+ return
PTR_ERR(s)
;
s->s_flags = MS_NOUSER;
s->s_maxbytes = ~0ULL;
s->s_flags = MS_NOUSER;
s->s_maxbytes = ~0ULL;
@@
-245,12
+245,12
@@
get_sb_pseudo(struct file_system_type *fs_type, char *name,
d_instantiate(dentry, root);
s->s_root = dentry;
s->s_flags |= MS_ACTIVE;
d_instantiate(dentry, root);
s->s_root = dentry;
s->s_flags |= MS_ACTIVE;
- return s;
+ return s
imple_set_mnt(mnt, s)
;
Enomem:
up_write(&s->s_umount);
deactivate_super(s);
Enomem:
up_write(&s->s_umount);
deactivate_super(s);
- return
ERR_PTR(-ENOMEM)
;
+ return
-ENOMEM
;
}
int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
}
int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
@@
-258,7
+258,7
@@
int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *den
struct inode *inode = old_dentry->d_inode;
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
struct inode *inode = old_dentry->d_inode;
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
- in
ode->i_nlink++
;
+ in
c_nlink(inode)
;
atomic_inc(&inode->i_count);
dget(dentry);
d_instantiate(dentry, inode);
atomic_inc(&inode->i_count);
dget(dentry);
d_instantiate(dentry, inode);
@@
-290,7
+290,7
@@
int simple_unlink(struct inode *dir, struct dentry *dentry)
struct inode *inode = dentry->d_inode;
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
struct inode *inode = dentry->d_inode;
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
-
inode->i_nlink--
;
+
drop_nlink(inode)
;
dput(dentry);
return 0;
}
dput(dentry);
return 0;
}
@@
-300,9
+300,9
@@
int simple_rmdir(struct inode *dir, struct dentry *dentry)
if (!simple_empty(dentry))
return -ENOTEMPTY;
if (!simple_empty(dentry))
return -ENOTEMPTY;
- d
entry->d_inode->i_nlink--
;
+ d
rop_nlink(dentry->d_inode)
;
simple_unlink(dir, dentry);
simple_unlink(dir, dentry);
- d
ir->i_nlink--
;
+ d
rop_nlink(dir)
;
return 0;
}
return 0;
}
@@
-318,10
+318,10
@@
int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
if (new_dentry->d_inode) {
simple_unlink(new_dir, new_dentry);
if (they_are_dirs)
if (new_dentry->d_inode) {
simple_unlink(new_dir, new_dentry);
if (they_are_dirs)
-
old_dir->i_nlink--
;
+
drop_nlink(old_dir)
;
} else if (they_are_dirs) {
} else if (they_are_dirs) {
-
old_dir->i_nlink--
;
-
new_dir->i_nlink++
;
+
drop_nlink(old_dir)
;
+
inc_nlink(new_dir)
;
}
old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime =
}
old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime =
@@
-332,17
+332,9
@@
int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
int simple_readpage(struct file *file, struct page *page)
{
int simple_readpage(struct file *file, struct page *page)
{
- void *kaddr;
-
- if (PageUptodate(page))
- goto out;
-
- kaddr = kmap_atomic(page, KM_USER0);
- memset(kaddr, 0, PAGE_CACHE_SIZE);
- kunmap_atomic(kaddr, KM_USER0);
+ clear_highpage(page);
flush_dcache_page(page);
SetPageUptodate(page);
flush_dcache_page(page);
SetPageUptodate(page);
-out:
unlock_page(page);
return 0;
}
unlock_page(page);
return 0;
}
@@
-398,7
+390,6
@@
int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
return -ENOMEM;
inode->i_mode = S_IFDIR | 0755;
inode->i_uid = inode->i_gid = 0;
return -ENOMEM;
inode->i_mode = S_IFDIR | 0755;
inode->i_uid = inode->i_gid = 0;
- inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_blocks = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode->i_op = &simple_dir_inode_operations;
inode->i_blocks = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode->i_op = &simple_dir_inode_operations;
@@
-420,7
+411,6
@@
int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
goto out;
inode->i_mode = S_IFREG | files->mode;
inode->i_uid = inode->i_gid = 0;
goto out;
inode->i_mode = S_IFREG | files->mode;
inode->i_uid = inode->i_gid = 0;
- inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_blocks = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode->i_fop = files->ops;
inode->i_blocks = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode->i_fop = files->ops;
@@
-437,13
+427,13
@@
out:
static DEFINE_SPINLOCK(pin_fs_lock);
static DEFINE_SPINLOCK(pin_fs_lock);
-int simple_pin_fs(
char *nam
e, struct vfsmount **mount, int *count)
+int simple_pin_fs(
struct file_system_type *typ
e, struct vfsmount **mount, int *count)
{
struct vfsmount *mnt = NULL;
spin_lock(&pin_fs_lock);
if (unlikely(!*mount)) {
spin_unlock(&pin_fs_lock);
{
struct vfsmount *mnt = NULL;
spin_lock(&pin_fs_lock);
if (unlikely(!*mount)) {
spin_unlock(&pin_fs_lock);
- mnt =
do_kern_mount(name, 0,
name, NULL);
+ mnt =
vfs_kern_mount(type, 0, type->
name, NULL);
if (IS_ERR(mnt))
return PTR_ERR(mnt);
spin_lock(&pin_fs_lock);
if (IS_ERR(mnt))
return PTR_ERR(mnt);
spin_lock(&pin_fs_lock);
@@
-545,7
+535,7
@@
struct simple_attr {
char set_buf[24];
void *data;
const char *fmt; /* format for read operation */
char set_buf[24];
void *data;
const char *fmt; /* format for read operation */
- struct
semaphore sem;
/* protects access to these buffers */
+ struct
mutex mutex;
/* protects access to these buffers */
};
/* simple_attr_open is called by an actual attribute open file operation
};
/* simple_attr_open is called by an actual attribute open file operation
@@
-562,9
+552,9
@@
int simple_attr_open(struct inode *inode, struct file *file,
attr->get = get;
attr->set = set;
attr->get = get;
attr->set = set;
- attr->data = inode->
u.generic_ip
;
+ attr->data = inode->
i_private
;
attr->fmt = fmt;
attr->fmt = fmt;
-
init_MUTEX(&attr->sem
);
+
mutex_init(&attr->mutex
);
file->private_data = attr;
file->private_data = attr;
@@
-590,7
+580,7
@@
ssize_t simple_attr_read(struct file *file, char __user *buf,
if (!attr->get)
return -EACCES;
if (!attr->get)
return -EACCES;
-
down(&attr->sem
);
+
mutex_lock(&attr->mutex
);
if (*ppos) /* continued read */
size = strlen(attr->get_buf);
else /* first read */
if (*ppos) /* continued read */
size = strlen(attr->get_buf);
else /* first read */
@@
-599,7
+589,7
@@
ssize_t simple_attr_read(struct file *file, char __user *buf,
(unsigned long long)attr->get(attr->data));
ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
(unsigned long long)attr->get(attr->data));
ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
-
up(&attr->sem
);
+
mutex_unlock(&attr->mutex
);
return ret;
}
return ret;
}
@@
-617,7
+607,7
@@
ssize_t simple_attr_write(struct file *file, const char __user *buf,
if (!attr->set)
return -EACCES;
if (!attr->set)
return -EACCES;
-
down(&attr->sem
);
+
mutex_lock(&attr->mutex
);
ret = -EFAULT;
size = min(sizeof(attr->set_buf) - 1, len);
if (copy_from_user(attr->set_buf, buf, size))
ret = -EFAULT;
size = min(sizeof(attr->set_buf) - 1, len);
if (copy_from_user(attr->set_buf, buf, size))
@@
-628,7
+618,7
@@
ssize_t simple_attr_write(struct file *file, const char __user *buf,
val = simple_strtol(attr->set_buf, NULL, 0);
attr->set(attr->data, val);
out:
val = simple_strtol(attr->set_buf, NULL, 0);
attr->set(attr->data, val);
out:
-
up(&attr->sem
);
+
mutex_unlock(&attr->mutex
);
return ret;
}
return ret;
}