Re: [patch 25/26] mount options: fix udf

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> From: Miklos Szeredi <mszeredi@xxxxxxx>
> 
> Add a .show_options super operation to udf.
> 
> Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxx>
> ---
> 
> Index: linux/fs/udf/super.c
> ===================================================================
> --- linux.orig/fs/udf/super.c	2008-01-24 13:48:37.000000000 +0100
> +++ linux/fs/udf/super.c	2008-01-24 15:58:21.000000000 +0100
> @@ -53,6 +53,8 @@
>  #include <linux/vfs.h>
>  #include <linux/vmalloc.h>
>  #include <linux/errno.h>
> +#include <linux/mount.h>
> +#include <linux/seq_file.h>
>  #include <asm/byteorder.h>
>  
>  #include <linux/udf_fs.h>
> @@ -71,6 +73,8 @@
>  #define VDS_POS_TERMINATING_DESC	6
>  #define VDS_POS_LENGTH			7
>  
> +#define UDF_DEFAULT_BLOCKSIZE 2048
> +
>  static char error_buf[1024];
>  
>  /* These are the "meat" - everything else is stuffing */
> @@ -95,6 +99,7 @@ static void udf_open_lvid(struct super_b
>  static void udf_close_lvid(struct super_block *);
>  static unsigned int udf_count_free(struct super_block *);
>  static int udf_statfs(struct dentry *, struct kstatfs *);
> +static int udf_show_options(struct seq_file *, struct vfsmount *);
>  
>  struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi)
>  {
> @@ -181,6 +186,7 @@ static const struct super_operations udf
>  	.write_super	= udf_write_super,
>  	.statfs		= udf_statfs,
>  	.remount_fs	= udf_remount_fs,
> +	.show_options	= udf_show_options,
>  };
>  
>  struct udf_options {
> @@ -247,6 +253,56 @@ static int udf_sb_alloc_partition_maps(s
>  	return 0;
>  }
>  
> +static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt)
> +{
> +	struct super_block *sb = mnt->mnt_sb;
> +	struct udf_sb_info *sbi = UDF_SB(sb);
> +
> +	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT))
> +		seq_puts(seq, ",nostrict");
> +	if (sb->s_blocksize != UDF_DEFAULT_BLOCKSIZE)
> +		seq_printf(seq, ",bs=%lu", sb->s_blocksize);
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
> +		seq_puts(seq, ",unhide");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
> +		seq_puts(seq, ",undelete");
> +	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_USE_AD_IN_ICB))
> +		seq_puts(seq, ",noadinicb");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_USE_SHORT_AD))
> +		seq_puts(seq, ",shortad");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_FORGET))
> +		seq_puts(seq, ",uid=forget");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_IGNORE))
> +		seq_puts(seq, ",uid=ignore");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_FORGET))
> +		seq_puts(seq, ",gid=forget");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_IGNORE))
> +		seq_puts(seq, ",gid=ignore");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
> +		seq_printf(seq, ",uid=%u", sbi->s_uid);
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET))
> +		seq_printf(seq, ",gid=%u", sbi->s_gid);
> +	if (sbi->s_umask != 0)
> +		seq_printf(seq, ",umask=%o", sbi->s_umask);
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
> +		seq_printf(seq, ",session=%u", sbi->s_session);
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET))
> +		seq_printf(seq, ",lastblock=%u", sbi->s_last_block);
> +	/* is this correct? */
> +	if (sbi->s_anchor[2] != 0)
> +		seq_printf(seq, ",anchor=%u", sbi->s_anchor[2]);
> +	/*
> +	 * volume, partition, fileset and rootdir seem to be ignored
> +	 * currently
> +	 */
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8))
> +		seq_puts(seq, ",utf8");
> +	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map)
> +		seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset);
> +
> +	return 0;
> +}
> +
>  /*
>   * udf_parse_options
>   *
> @@ -339,13 +395,14 @@ static match_table_t tokens = {
>  	{Opt_err,	NULL}
>  };
>  
> -static int udf_parse_options(char *options, struct udf_options *uopt)
> +static int udf_parse_options(char *options, struct udf_options *uopt,
> +			     bool remount)
>  {
  Please use just 'int' for 'remount' option. We are slowly trying to
get rid of these strange things in UDF code so adding new ones isn't
desirable.

>  	char *p;
>  	int option;
>  
>  	uopt->novrs = 0;
> -	uopt->blocksize = 2048;
> +	uopt->blocksize = UDF_DEFAULT_BLOCKSIZE;
>  	uopt->partition = 0xFFFF;
>  	uopt->session = 0xFFFFFFFF;
>  	uopt->lastblock = 0;
> @@ -415,11 +472,15 @@ static int udf_parse_options(char *optio
>  			if (match_int(args, &option))
>  				return 0;
>  			uopt->session = option;
> +			if (!remount)
> +				uopt->flags |= (1 << UDF_FLAG_SESSION_SET);
>  			break;
>  		case Opt_lastblock:
>  			if (match_int(args, &option))
>  				return 0;
>  			uopt->lastblock = option;
> +			if (!remount)
> +				uopt->flags |= (1 << UDF_FLAG_LASTBLOCK_SET);
>  			break;
>  		case Opt_anchor:
>  			if (match_int(args, &option))
> @@ -497,7 +558,7 @@ static int udf_remount_fs(struct super_b
>  	uopt.gid   = sbi->s_gid;
>  	uopt.umask = sbi->s_umask;
>  
> -	if (!udf_parse_options(options, &uopt))
> +	if (!udf_parse_options(options, &uopt, true))
>  		return -EINVAL;
>  
>  	sbi->s_flags = uopt.flags;
> @@ -1679,7 +1740,7 @@ static int udf_fill_super(struct super_b
>  
>  	mutex_init(&sbi->s_alloc_mutex);
>  
> -	if (!udf_parse_options((char *)options, &uopt))
> +	if (!udf_parse_options((char *)options, &uopt, false))
>  		goto error_out;
>  
>  	if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
> Index: linux/fs/udf/udf_sb.h
> ===================================================================
> --- linux.orig/fs/udf/udf_sb.h	2008-01-24 13:48:37.000000000 +0100
> +++ linux/fs/udf/udf_sb.h	2008-01-24 13:51:08.000000000 +0100
> @@ -26,6 +26,8 @@
>  #define UDF_FLAG_GID_IGNORE     14
>  #define UDF_FLAG_UID_SET	15
>  #define UDF_FLAG_GID_SET	16
> +#define UDF_FLAG_SESSION_SET	17
> +#define UDF_FLAG_LASTBLOCK_SET	18
>  
>  #define UDF_PART_FLAG_UNALLOC_BITMAP	0x0001
>  #define UDF_PART_FLAG_UNALLOC_TABLE	0x0002
  Otherwise (apart from comments I wrote in the other email) the patch
is fine.

								Honza
-- 
Jan Kara <jack@xxxxxxx>
SuSE CR Labs
-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux