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 kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
fs
/
super.c
diff --git
a/fs/super.c
b/fs/super.c
index
d79b04c
..
d325036
100644
(file)
--- a/
fs/super.c
+++ b/
fs/super.c
@@
-37,6
+37,7
@@
#include <linux/writeback.h> /* for the emergency remount stuff */
#include <linux/idr.h>
#include <linux/kobject.h>
#include <linux/writeback.h> /* for the emergency remount stuff */
#include <linux/idr.h>
#include <linux/kobject.h>
+#include <linux/mutex.h>
#include <linux/devpts_fs.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/devpts_fs.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
@@
-57,11
+58,10
@@
DEFINE_SPINLOCK(sb_lock);
*/
static struct super_block *alloc_super(void)
{
*/
static struct super_block *alloc_super(void)
{
- struct super_block *s = k
m
alloc(sizeof(struct super_block), GFP_USER);
+ struct super_block *s = k
z
alloc(sizeof(struct super_block), GFP_USER);
static struct super_operations default_op;
if (s) {
static struct super_operations default_op;
if (s) {
- memset(s, 0, sizeof(struct super_block));
if (security_sb_alloc(s)) {
kfree(s);
s = NULL;
if (security_sb_alloc(s)) {
kfree(s);
s = NULL;
@@
-74,13
+74,13
@@
static struct super_block *alloc_super(void)
INIT_HLIST_HEAD(&s->s_anon);
INIT_LIST_HEAD(&s->s_inodes);
init_rwsem(&s->s_umount);
INIT_HLIST_HEAD(&s->s_anon);
INIT_LIST_HEAD(&s->s_inodes);
init_rwsem(&s->s_umount);
-
sema_init(&s->s_lock, 1
);
+
mutex_init(&s->s_lock
);
down_write(&s->s_umount);
s->s_count = S_BIAS;
atomic_set(&s->s_active, 1);
down_write(&s->s_umount);
s->s_count = S_BIAS;
atomic_set(&s->s_active, 1);
-
sema_init(&s->s_vfs_rename_sem,1
);
-
sema_init(&s->s_dquot.dqio_sem, 1
);
-
sema_init(&s->s_dquot.dqonoff_sem, 1
);
+
mutex_init(&s->s_vfs_rename_mutex
);
+
mutex_init(&s->s_dquot.dqio_mutex
);
+
mutex_init(&s->s_dquot.dqonoff_mutex
);
init_rwsem(&s->s_dquot.dqptr_sem);
init_waitqueue_head(&s->s_wait_unfrozen);
s->s_maxbytes = MAX_NON_LFS;
init_rwsem(&s->s_dquot.dqptr_sem);
init_waitqueue_head(&s->s_wait_unfrozen);
s->s_maxbytes = MAX_NON_LFS;
@@
-173,6
+173,7
@@
void deactivate_super(struct super_block *s)
if (atomic_dec_and_lock(&s->s_active, &sb_lock)) {
s->s_count -= S_BIAS-1;
spin_unlock(&sb_lock);
if (atomic_dec_and_lock(&s->s_active, &sb_lock)) {
s->s_count -= S_BIAS-1;
spin_unlock(&sb_lock);
+ DQUOT_OFF(s);
down_write(&s->s_umount);
fs->kill_sb(s);
put_filesystem(fs);
down_write(&s->s_umount);
fs->kill_sb(s);
put_filesystem(fs);
@@
-248,8
+249,9
@@
void generic_shutdown_super(struct super_block *sb)
/* Forget any remaining inodes */
if (invalidate_inodes(sb)) {
/* Forget any remaining inodes */
if (invalidate_inodes(sb)) {
- printk("VFS: Busy inodes after unmount. "
- "Self-destruct in 5 seconds. Have a nice day...\n");
+ printk("VFS: Busy inodes after unmount of %s. "
+ "Self-destruct in 5 seconds. Have a nice day...\n",
+ sb->s_id);
}
unlock_kernel();
}
unlock_kernel();
@@
-343,20
+345,22
@@
static inline void write_super(struct super_block *sb)
*/
void sync_supers(void)
{
*/
void sync_supers(void)
{
- struct super_block *
sb;
-restart:
+ struct super_block *sb;
+
spin_lock(&sb_lock);
spin_lock(&sb_lock);
- sb = sb_entry(super_blocks.next);
- while (sb != sb_entry(&super_blocks))
+restart:
+ list_for_each_entry(sb, &super_blocks, s_list) {
if (sb->s_dirt) {
sb->s_count++;
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
write_super(sb);
if (sb->s_dirt) {
sb->s_count++;
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
write_super(sb);
- drop_super(sb);
- goto restart;
- } else
- sb = sb_entry(sb->s_list.next);
+ up_read(&sb->s_umount);
+ spin_lock(&sb_lock);
+ if (__put_super_and_need_restart(sb))
+ goto restart;
+ }
+ }
spin_unlock(&sb_lock);
}
spin_unlock(&sb_lock);
}
@@
-379,24
+383,20
@@
restart:
void sync_filesystems(int wait)
{
struct super_block *sb;
void sync_filesystems(int wait)
{
struct super_block *sb;
- static DE
CLAR
E_MUTEX(mutex);
+ static DE
FIN
E_MUTEX(mutex);
-
down(&mutex);
/* Could be down_interruptible */
+
mutex_lock(&mutex);
/* Could be down_interruptible */
spin_lock(&sb_lock);
spin_lock(&sb_lock);
- for (sb = sb_entry(super_blocks.next); sb != sb_entry(&super_blocks);
- sb = sb_entry(sb->s_list.next)) {
+ list_for_each_entry(sb, &super_blocks, s_list) {
if (!sb->s_op->sync_fs)
continue;
if (sb->s_flags & MS_RDONLY)
continue;
sb->s_need_sync_fs = 1;
}
if (!sb->s_op->sync_fs)
continue;
if (sb->s_flags & MS_RDONLY)
continue;
sb->s_need_sync_fs = 1;
}
- spin_unlock(&sb_lock);
restart:
restart:
- spin_lock(&sb_lock);
- for (sb = sb_entry(super_blocks.next); sb != sb_entry(&super_blocks);
- sb = sb_entry(sb->s_list.next)) {
+ list_for_each_entry(sb, &super_blocks, s_list) {
if (!sb->s_need_sync_fs)
continue;
sb->s_need_sync_fs = 0;
if (!sb->s_need_sync_fs)
continue;
sb->s_need_sync_fs = 0;
@@
-407,11
+407,14
@@
restart:
down_read(&sb->s_umount);
if (sb->s_root && (wait || sb->s_dirt))
sb->s_op->sync_fs(sb, wait);
down_read(&sb->s_umount);
if (sb->s_root && (wait || sb->s_dirt))
sb->s_op->sync_fs(sb, wait);
- drop_super(sb);
- goto restart;
+ up_read(&sb->s_umount);
+ /* restart only when sb is no longer on the list */
+ spin_lock(&sb_lock);
+ if (__put_super_and_need_restart(sb))
+ goto restart;
}
spin_unlock(&sb_lock);
}
spin_unlock(&sb_lock);
-
up
(&mutex);
+
mutex_unlock
(&mutex);
}
/**
}
/**
@@
-424,21
+427,25
@@
restart:
struct super_block * get_super(struct block_device *bdev)
{
struct super_block * get_super(struct block_device *bdev)
{
- struct list_head *p;
+ struct super_block *sb;
+
if (!bdev)
return NULL;
if (!bdev)
return NULL;
-rescan:
+
spin_lock(&sb_lock);
spin_lock(&sb_lock);
- list_for_each(p, &super_blocks) {
- struct super_block *s = sb_entry(p);
- if (s->s_bdev == bdev) {
- s->s_count++;
+rescan:
+ list_for_each_entry(sb, &super_blocks, s_list) {
+ if (s
b
->s_bdev == bdev) {
+ s
b
->s_count++;
spin_unlock(&sb_lock);
spin_unlock(&sb_lock);
- down_read(&s->s_umount);
- if (s->s_root)
- return s;
- drop_super(s);
- goto rescan;
+ down_read(&sb->s_umount);
+ if (sb->s_root)
+ return sb;
+ up_read(&sb->s_umount);
+ /* restart only when sb is no longer on the list */
+ spin_lock(&sb_lock);
+ if (__put_super_and_need_restart(sb))
+ goto rescan;
}
}
spin_unlock(&sb_lock);
}
}
spin_unlock(&sb_lock);
@@
-449,28
+456,28
@@
EXPORT_SYMBOL(get_super);
struct super_block * user_get_super(dev_t dev)
{
struct super_block * user_get_super(dev_t dev)
{
- struct
list_head *p
;
+ struct
super_block *sb
;
-rescan:
spin_lock(&sb_lock);
spin_lock(&sb_lock);
- list_for_each(p, &super_blocks) {
- struct super_block *s = sb_entry(p);
- if (s->s_dev == dev) {
- s->s_count++;
+rescan:
+ list_for_each_entry(sb, &super_blocks, s_list) {
+ if (s
b
->s_dev == dev) {
+ s
b
->s_count++;
spin_unlock(&sb_lock);
spin_unlock(&sb_lock);
- down_read(&s->s_umount);
- if (s->s_root)
- return s;
- drop_super(s);
- goto rescan;
+ down_read(&sb->s_umount);
+ if (sb->s_root)
+ return sb;
+ up_read(&sb->s_umount);
+ /* restart only when sb is no longer on the list */
+ spin_lock(&sb_lock);
+ if (__put_super_and_need_restart(sb))
+ goto rescan;
}
}
spin_unlock(&sb_lock);
return NULL;
}
}
}
spin_unlock(&sb_lock);
return NULL;
}
-EXPORT_SYMBOL(user_get_super);
-
asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf)
{
struct super_block *s;
asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf)
{
struct super_block *s;
@@
-508,7
+515,7
@@
static void mark_files_ro(struct super_block *sb)
struct file *f;
file_list_lock();
struct file *f;
file_list_lock();
- list_for_each_entry(f, &sb->s_files, f_list) {
+ list_for_each_entry(f, &sb->s_files, f_
u.fu_
list) {
if (S_ISREG(f->f_dentry->d_inode->i_mode) && file_count(f))
f->f_mode &= ~FMODE_WRITE;
}
if (S_ISREG(f->f_dentry->d_inode->i_mode) && file_count(f))
f->f_mode &= ~FMODE_WRITE;
}
@@
-665,9
+672,9
@@
static void bdev_uevent(struct block_device *bdev, enum kobject_action action)
{
if (bdev->bd_disk) {
if (bdev->bd_part)
{
if (bdev->bd_disk) {
if (bdev->bd_part)
- kobject_uevent(&bdev->bd_part->kobj, action
, NULL
);
+ kobject_uevent(&bdev->bd_part->kobj, action);
else
else
- kobject_uevent(&bdev->bd_disk->kobj, action
, NULL
);
+ kobject_uevent(&bdev->bd_disk->kobj, action);
}
}
}
}
@@
-688,9
+695,9
@@
struct super_block *get_sb_bdev(struct file_system_type *fs_type,
* will protect the lockfs code from trying to start a snapshot
* while we are mounting
*/
* will protect the lockfs code from trying to start a snapshot
* while we are mounting
*/
-
down(&bdev->bd_mount_sem
);
+
mutex_lock(&bdev->bd_mount_mutex
);
s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
-
up(&bdev->bd_mount_sem
);
+
mutex_unlock(&bdev->bd_mount_mutex
);
if (IS_ERR(s))
goto out;
if (IS_ERR(s))
goto out;
@@
-706,9
+713,8
@@
struct super_block *get_sb_bdev(struct file_system_type *fs_type,
s->s_flags = flags;
strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
s->s_flags = flags;
strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
- s->s_old_blocksize = block_size(bdev);
- sb_set_blocksize(s, s->s_old_blocksize);
- error = fill_super(s, data, flags & MS_VERBOSE ? 1 : 0);
+ sb_set_blocksize(s, block_size(bdev));
+ error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
@@
-752,7
+758,7
@@
struct super_block *get_sb_nodev(struct file_system_type *fs_type,
s->s_flags = flags;
s->s_flags = flags;
- error = fill_super(s, data, flags & MS_
VERBOSE
? 1 : 0);
+ error = fill_super(s, data, flags & MS_
SILENT
? 1 : 0);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
@@
-781,7
+787,7
@@
struct super_block *get_sb_single(struct file_system_type *fs_type,
return s;
if (!s->s_root) {
s->s_flags = flags;
return s;
if (!s->s_root) {
s->s_flags = flags;
- error = fill_super(s, data, flags & MS_
VERBOSE
? 1 : 0);
+ error = fill_super(s, data, flags & MS_
SILENT
? 1 : 0);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
if (error) {
up_write(&s->s_umount);
deactivate_super(s);
@@
-809,7
+815,7
@@
do_kern_mount(const char *fstype, int flags, const char *name, void *data)
sb = ERR_PTR(-EPERM);
if ((type->fs_flags & FS_BINARY_MOUNTDATA) &&
sb = ERR_PTR(-EPERM);
if ((type->fs_flags & FS_BINARY_MOUNTDATA) &&
- !
capable(CAP_SYS_ADMIN) && !vx_ccaps(
VXC_BINARY_MOUNT))
+ !
vx_capable(CAP_SYS_ADMIN,
VXC_BINARY_MOUNT))
goto out;
sb = ERR_PTR(-ENOMEM);
goto out;
sb = ERR_PTR(-ENOMEM);
@@
-848,8
+854,8
@@
do_kern_mount(const char *fstype, int flags, const char *name, void *data)
mnt->mnt_root = dget(sb->s_root);
mnt->mnt_mountpoint = sb->s_root;
mnt->mnt_parent = mnt;
mnt->mnt_root = dget(sb->s_root);
mnt->mnt_mountpoint = sb->s_root;
mnt->mnt_parent = mnt;
- mnt->mnt_namespace = current->namespace;
up_write(&sb->s_umount);
up_write(&sb->s_umount);
+ free_secdata(secdata);
put_filesystem(type);
return mnt;
out_sb:
put_filesystem(type);
return mnt;
out_sb: