[Miklos Szeredi - Thu, Jan 24, 2008 at 08:34:06PM +0100] | 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) | { | 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 | | -- | Jan Kara CC'ed - Cyrill - - 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