|
@@ -1181,6 +1181,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
unsigned new_mount_opt, ufstype;
|
|
|
unsigned flags;
|
|
|
|
|
|
+ lock_super(sb);
|
|
|
uspi = UFS_SB(sb)->s_uspi;
|
|
|
flags = UFS_SB(sb)->s_flags;
|
|
|
usb1 = ubh_get_usb_first(uspi);
|
|
@@ -1193,17 +1194,21 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
ufstype = UFS_SB(sb)->s_mount_opt & UFS_MOUNT_UFSTYPE;
|
|
|
new_mount_opt = 0;
|
|
|
ufs_set_opt (new_mount_opt, ONERROR_LOCK);
|
|
|
- if (!ufs_parse_options (data, &new_mount_opt))
|
|
|
+ if (!ufs_parse_options (data, &new_mount_opt)) {
|
|
|
+ unlock_super(sb);
|
|
|
return -EINVAL;
|
|
|
+ }
|
|
|
if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) {
|
|
|
new_mount_opt |= ufstype;
|
|
|
} else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) {
|
|
|
printk("ufstype can't be changed during remount\n");
|
|
|
+ unlock_super(sb);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
|
|
|
UFS_SB(sb)->s_mount_opt = new_mount_opt;
|
|
|
+ unlock_super(sb);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1228,6 +1233,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
#ifndef CONFIG_UFS_FS_WRITE
|
|
|
printk("ufs was compiled with read-only support, "
|
|
|
"can't be mounted as read-write\n");
|
|
|
+ unlock_super(sb);
|
|
|
return -EINVAL;
|
|
|
#else
|
|
|
if (ufstype != UFS_MOUNT_UFSTYPE_SUN &&
|
|
@@ -1236,16 +1242,19 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
ufstype != UFS_MOUNT_UFSTYPE_SUNx86 &&
|
|
|
ufstype != UFS_MOUNT_UFSTYPE_UFS2) {
|
|
|
printk("this ufstype is read-only supported\n");
|
|
|
+ unlock_super(sb);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
if (!ufs_read_cylinder_structures(sb)) {
|
|
|
printk("failed during remounting\n");
|
|
|
+ unlock_super(sb);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
sb->s_flags &= ~MS_RDONLY;
|
|
|
#endif
|
|
|
}
|
|
|
UFS_SB(sb)->s_mount_opt = new_mount_opt;
|
|
|
+ unlock_super(sb);
|
|
|
return 0;
|
|
|
}
|
|
|
|