Re: next-2008-11-28 : can't mount UDF DVD

Laurent Riffard
2008-12-01T19:28:14Z

Le 01.12.2008 01:18, Marcin Slusarz a écrit :
> On Mon, Dec 01, 2008 at 12:44:05AM +0100, Laurent Riffard wrote:
>> Hi,
>>
>> With next-2008-11-28, I was unable to mount an UDF-formatted DVD-RW:
>>
>> ~$ mount -oro -t udf /dev/sr0 /media/cdrom/
>> mount: Not a directory
>>
>> There was no problem with 2.6.28-rc6.
>>
>> I made a bisection:
>>
>> 33284bdf40f88160a154202510b27d983138c805 is first bad commit
>> commit 33284bdf40f88160a154202510b27d983138c805
>> Author: Marcin Slusarz <marcin.slusarz@gmail.com>
>> Date: Sun Nov 16 20:52:19 2008 +0100
>>
>> udf: implement mode and dmode mounting options
>>
>> "dmode" allows overriding permissions of directories and
>> "mode" allows overriding permissions of files.
>>
>> Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
>> Cc: Jan Kara <jack@suse.cz>
>> Signed-off-by: Jan Kara <jack@suse.cz>
>>
>>
>> Indeed, with this commit, I *must* use the dmode option to mount my DVD:
>
> That's not intended behaviour... ;)
>
>> ~$ sudo mount -oro,dmode=0755 -t udf /dev/sr0 /media/cdrom/
>> ~$ grep /media/cdrom /proc/mounts
>> /dev/scd0 /media/cdrom udf ro,mode=177777,dmode=755,utf8 0 0
> ^^^^^^
> funny (it's 65535 / (u16)-1)
>
[snip]
>
> Can you check whether attached patch fixes it?
> What architecture are you testing on?

i686, 32-bit althought CPU is "AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ stepping 02".

~$ uname -a
Linux calimero 2.6.28-rc6-next-20081128-05108-g389b1c9 #62 SMP PREEMPT Mon Dec 1 19:53:55 CET 2008 i686 GNU/Linux

Current kernel is next-20081128 + reiser4 patches + your patch: it seems to works well now.

First test: mount with default options. It works as expected.

~$ sudo mount -oro -t udf /dev/sr0 /media/cdrom/
~$ grep /media/cdrom /proc/mounts
/dev/scd0 /media/cdrom udf ro,utf8 0 0
~$ ls -al /media/cdrom/
total 46
drwxrwxrwx 5 root root 344 2007-12-24 18:09 .
drwxr-xr-x 12 root root 4096 2008-12-01 20:04 ..
drwxr-x--- 2 laurent laurent 7112 2008-11-30 20:14 flexbackup
drwxr-xr-x 2 root root 40 2005-11-20 23:37 lost+found
drwxr-x--- 10 laurent laurent 4548 2005-11-25 18:18 patches
~$ ls -al /media/cdrom/flexbackup/
total 4307946
drwxr-x--- 2 laurent laurent 7112 2008-11-30 20:14 .
drwxrwxrwx 5 root root 344 2007-12-24 18:09 ..
-rw-r----- 1 laurent laurent 44 2006-10-01 15:36 00-index-key
[...]
~$ sudo umount /dev/scd0

Second test : mount with dmode=0755 option. Does work as expected too.

~$ sudo mount -oro,dmode=0755 -t udf /dev/sr0 /media/cdrom/
~$ grep /media/cdrom /proc/mounts
/dev/scd0 /media/cdrom udf ro,dmode=755,utf8 0 0
~$ ls -al /media/cdrom/
total 46
drwxr-xr-x 5 root root 344 2007-12-24 18:09 .
drwxr-xr-x 12 root root 4096 2008-12-01 20:04 ..
drwxr-xr-x 2 laurent laurent 7112 2008-11-30 20:14 flexbackup
drwxr-xr-x 2 root root 40 2005-11-20 23:37 lost+found
drwxr-xr-x 10 laurent laurent 4548 2005-11-25 18:18 patches
~$ ls -al /media/cdrom/flexbackup/
total 4307946
drwxr-xr-x 2 laurent laurent 7112 2008-11-30 20:14 .
drwxr-xr-x 5 root root 344 2007-12-24 18:09 ..
-rw-r----- 1 laurent laurent 44 2006-10-01 15:36 00-index-key
[...]

Tested-by: Laurent Riffard <laurent.riffard@free.fr>

> diff --git a/fs/udf/inode.c b/fs/udf/inode.c
> index 6612a27..9eeb726 100644
> --- a/fs/udf/inode.c
> +++ b/fs/udf/inode.c
> @@ -1222,10 +1222,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
> iinfo->i_lenExtents = inode->i_size;
>
> if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY &&
> - sbi->s_fmode != -1)
> + sbi->s_fmode != (mode_t)-1)
> inode->i_mode = sbi->s_fmode;
> else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY &&
> - sbi->s_dmode != -1)
> + sbi->s_dmode != (mode_t)-1)
> inode->i_mode = sbi->s_dmode;
> else
> inode->i_mode = udf_convert_permissions(fe);
> diff --git a/fs/udf/super.c b/fs/udf/super.c
> index e5d121d..af8a771 100644
> --- a/fs/udf/super.c
> +++ b/fs/udf/super.c
> @@ -284,9 +284,9 @@ static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt)
> seq_printf(seq, ",gid=%u", sbi->s_gid);
> if (sbi->s_umask != 0)
> seq_printf(seq, ",umask=%o", sbi->s_umask);
> - if (sbi->s_fmode != -1)
> + if (sbi->s_fmode != (mode_t)-1)
> seq_printf(seq, ",mode=%o", sbi->s_fmode);
> - if (sbi->s_dmode != -1)
> + if (sbi->s_dmode != (mode_t)-1)
> seq_printf(seq, ",dmode=%o", sbi->s_dmode);
> if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
> seq_printf(seq, ",session=%u", sbi->s_session);

Thanks
~~
laurent