|
@@ -363,10 +363,10 @@ EXPORT_SYMBOL(drop_super);
|
|
|
*/
|
|
|
void sync_supers(void)
|
|
|
{
|
|
|
- struct super_block *sb, *n;
|
|
|
+ struct super_block *sb, *p = NULL;
|
|
|
|
|
|
spin_lock(&sb_lock);
|
|
|
- list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
|
|
|
+ list_for_each_entry(sb, &super_blocks, s_list) {
|
|
|
if (list_empty(&sb->s_instances))
|
|
|
continue;
|
|
|
if (sb->s_op->write_super && sb->s_dirt) {
|
|
@@ -379,11 +379,13 @@ void sync_supers(void)
|
|
|
up_read(&sb->s_umount);
|
|
|
|
|
|
spin_lock(&sb_lock);
|
|
|
- /* lock was dropped, must reset next */
|
|
|
- list_safe_reset_next(sb, n, s_list);
|
|
|
- __put_super(sb);
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
+ p = sb;
|
|
|
}
|
|
|
}
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
spin_unlock(&sb_lock);
|
|
|
}
|
|
|
|
|
@@ -397,10 +399,10 @@ void sync_supers(void)
|
|
|
*/
|
|
|
void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
|
|
|
{
|
|
|
- struct super_block *sb, *n;
|
|
|
+ struct super_block *sb, *p = NULL;
|
|
|
|
|
|
spin_lock(&sb_lock);
|
|
|
- list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
|
|
|
+ list_for_each_entry(sb, &super_blocks, s_list) {
|
|
|
if (list_empty(&sb->s_instances))
|
|
|
continue;
|
|
|
sb->s_count++;
|
|
@@ -412,10 +414,12 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
|
|
|
up_read(&sb->s_umount);
|
|
|
|
|
|
spin_lock(&sb_lock);
|
|
|
- /* lock was dropped, must reset next */
|
|
|
- list_safe_reset_next(sb, n, s_list);
|
|
|
- __put_super(sb);
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
+ p = sb;
|
|
|
}
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
spin_unlock(&sb_lock);
|
|
|
}
|
|
|
|
|
@@ -577,10 +581,10 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
|
|
|
|
|
|
static void do_emergency_remount(struct work_struct *work)
|
|
|
{
|
|
|
- struct super_block *sb, *n;
|
|
|
+ struct super_block *sb, *p = NULL;
|
|
|
|
|
|
spin_lock(&sb_lock);
|
|
|
- list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
|
|
|
+ list_for_each_entry(sb, &super_blocks, s_list) {
|
|
|
if (list_empty(&sb->s_instances))
|
|
|
continue;
|
|
|
sb->s_count++;
|
|
@@ -594,10 +598,12 @@ static void do_emergency_remount(struct work_struct *work)
|
|
|
}
|
|
|
up_write(&sb->s_umount);
|
|
|
spin_lock(&sb_lock);
|
|
|
- /* lock was dropped, must reset next */
|
|
|
- list_safe_reset_next(sb, n, s_list);
|
|
|
- __put_super(sb);
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
+ p = sb;
|
|
|
}
|
|
|
+ if (p)
|
|
|
+ __put_super(p);
|
|
|
spin_unlock(&sb_lock);
|
|
|
kfree(work);
|
|
|
printk("Emergency Remount complete\n");
|