On Thu, 27 Mar 2014 23:38:31 +0100 Fabian Frederick <f...@skynet.be> wrote:

> mutex_destroy was also called when trying to mount volume in read/write
> without write support enabled.
> 
> --- a/fs/ufs/super.c
> +++ b/fs/ufs/super.c
> @@ -798,7 +798,7 @@ static int ufs_fill_super(struct super_block *sb, void 
> *data, int silent)
>       if (!(sb->s_flags & MS_RDONLY)) {
>               printk("ufs was compiled with read-only support, "
>               "can't be mounted as read-write\n");
> -             goto failed;
> +             goto failed_noreadwrite;
>       }
>  #endif
>       mutex_init(&sbi->mutex);
> @@ -1255,10 +1255,14 @@ magic_found:
>       return 0;
>  
>  failed:
> +     mutex_destroy(&sbi->mutex);
> +
> +#ifndef CONFIG_UFS_FS_WRITE
> +failed_noreadwrite:
> +#endif
>       if (ubh)
>               ubh_brelse_uspi (uspi);
>       kfree (uspi);
> -     mutex_destroy(&sbi->mutex);
>       kfree(sbi);
>       sb->s_fs_info = NULL;
>       UFSD("EXIT (FAILED)\n");

Ugly.  Wht don't we perform the check before we've allocated anything
so we can simply return?

And it should return -EROFS, not -EINVAL.

--- a/fs/ufs/super.c~ufs-sb-mutex-merge-mutex_destroy-fix-v2-fix
+++ a/fs/ufs/super.c
@@ -785,6 +785,14 @@ static int ufs_fill_super(struct super_b
        flags = 0;
        
        UFSD("ENTER\n");
+
+#ifndef CONFIG_UFS_FS_WRITE
+       if (!(sb->s_flags & MS_RDONLY)) {
+               printk("ufs was compiled with read-only support, "
+                      "can't be mounted as read-write\n");
+               return -EROFS;
+       }
+#endif
                
        sbi = kzalloc(sizeof(struct ufs_sb_info), GFP_KERNEL);
        if (!sbi)
@@ -794,13 +802,6 @@ static int ufs_fill_super(struct super_b
 
        UFSD("flag %u\n", (int)(sb->s_flags & MS_RDONLY));
        
-#ifndef CONFIG_UFS_FS_WRITE
-       if (!(sb->s_flags & MS_RDONLY)) {
-               printk("ufs was compiled with read-only support, "
-               "can't be mounted as read-write\n");
-               goto failed_noreadwrite;
-       }
-#endif
        mutex_init(&sbi->mutex);
        spin_lock_init(&sbi->work_lock);
        INIT_DELAYED_WORK(&sbi->sync_work, delayed_sync_fs);
@@ -1256,10 +1257,6 @@ magic_found:
 
 failed:
        mutex_destroy(&sbi->mutex);
-
-#ifndef CONFIG_UFS_FS_WRITE
-failed_noreadwrite:
-#endif
        if (ubh)
                ubh_brelse_uspi (uspi);
        kfree (uspi);
_

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to