mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
[PATCH] ext2: fix mount options parting
Restore old set of ext2 mount options when remounting of a filesystem fails. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
08c6a96fd7
commit
50a5223428
2 changed files with 30 additions and 3 deletions
|
@ -1,6 +1,15 @@
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/ext2_fs.h>
|
#include <linux/ext2_fs.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ext2 mount options
|
||||||
|
*/
|
||||||
|
struct ext2_mount_options {
|
||||||
|
unsigned long s_mount_opt;
|
||||||
|
uid_t s_resuid;
|
||||||
|
gid_t s_resgid;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* second extended file system inode data in memory
|
* second extended file system inode data in memory
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -936,12 +936,23 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
|
||||||
struct ext2_sb_info * sbi = EXT2_SB(sb);
|
struct ext2_sb_info * sbi = EXT2_SB(sb);
|
||||||
struct ext2_super_block * es;
|
struct ext2_super_block * es;
|
||||||
unsigned long old_mount_opt = sbi->s_mount_opt;
|
unsigned long old_mount_opt = sbi->s_mount_opt;
|
||||||
|
struct ext2_mount_options old_opts;
|
||||||
|
unsigned long old_sb_flags;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* Store the old options */
|
||||||
|
old_sb_flags = sb->s_flags;
|
||||||
|
old_opts.s_mount_opt = sbi->s_mount_opt;
|
||||||
|
old_opts.s_resuid = sbi->s_resuid;
|
||||||
|
old_opts.s_resgid = sbi->s_resgid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allow the "check" option to be passed as a remount option.
|
* Allow the "check" option to be passed as a remount option.
|
||||||
*/
|
*/
|
||||||
if (!parse_options (data, sbi))
|
if (!parse_options (data, sbi)) {
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto restore_opts;
|
||||||
|
}
|
||||||
|
|
||||||
sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
|
sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
|
||||||
((sbi->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
|
((sbi->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
|
||||||
|
@ -971,7 +982,8 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
|
||||||
printk("EXT2-fs: %s: couldn't remount RDWR because of "
|
printk("EXT2-fs: %s: couldn't remount RDWR because of "
|
||||||
"unsupported optional features (%x).\n",
|
"unsupported optional features (%x).\n",
|
||||||
sb->s_id, le32_to_cpu(ret));
|
sb->s_id, le32_to_cpu(ret));
|
||||||
return -EROFS;
|
err = -EROFS;
|
||||||
|
goto restore_opts;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Mounting a RDONLY partition read-write, so reread and
|
* Mounting a RDONLY partition read-write, so reread and
|
||||||
|
@ -984,6 +996,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
|
||||||
}
|
}
|
||||||
ext2_sync_super(sb, es);
|
ext2_sync_super(sb, es);
|
||||||
return 0;
|
return 0;
|
||||||
|
restore_opts:
|
||||||
|
sbi->s_mount_opt = old_opts.s_mount_opt;
|
||||||
|
sbi->s_resuid = old_opts.s_resuid;
|
||||||
|
sbi->s_resgid = old_opts.s_resgid;
|
||||||
|
sb->s_flags = old_sb_flags;
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext2_statfs (struct super_block * sb, struct kstatfs * buf)
|
static int ext2_statfs (struct super_block * sb, struct kstatfs * buf)
|
||||||
|
|
Loading…
Reference in a new issue