static int parse_options(struct super_block *sb, char *options, int silent, int *debug, struct sdcardfs_mount_options *opts) { char *p; substring_t args[MAX_OPT_ARGS]; int option; char *string_option; int ret; char *perms; /* by default, we use AID_MEDIA_RW as uid, gid */ opts->fs_low_uid = AID_MEDIA_RW; opts->fs_low_gid = AID_MEDIA_RW; /* by default, we use AID_SDCARD_RW as write_gid */ opts->write_gid = AID_SDCARD_RW; /* default permission policy * (DERIVE_NONE | DERIVE_LEGACY | DERIVE_UNIFIED) */ opts->derive = DERIVE_NONE; opts->split_perms = 0; /* by default, we use LOWER_FS_EXT4 as lower fs type */ opts->lower_fs = LOWER_FS_EXT4; /* by default, 50MB is reserved */ opts->reserved_mb = LOWER_FS_MIN_FREE_SIZE; *debug = 0; if (!options) return 0; while ((p = strsep(&options, ",")) != NULL) { int token; if (!*p) continue; token = match_token(p, sdcardfs_tokens, args); switch (token) { case Opt_debug: *debug = 1; break; case Opt_uid: if (match_int(&args[0], &option)) return 0; opts->fs_low_uid = option; break; case Opt_gid: if (match_int(&args[0], &option)) return 0; opts->fs_low_gid = option; break; case Opt_wgid: if (match_int(&args[0], &option)) return 0; opts->write_gid = option; break; case Opt_upper_perms: perms = match_strdup(args); if(perms) { ret = parse_perms(&opts->upper_perms, perms); kfree(perms); if (ret) return -EINVAL; } else { return -EINVAL; } break; case Opt_split: opts->split_perms=1; break; case Opt_derive: string_option = match_strdup(&args[0]); if (!strcmp("none", string_option)) { opts->derive = DERIVE_NONE; } else if (!strcmp("legacy", string_option)) { opts->derive = DERIVE_LEGACY; } else if (!strcmp("unified", string_option)) { opts->derive = DERIVE_UNIFIED; } else if (!strcmp("public", string_option)) { opts->derive = DERIVE_PUBLIC; } else if (!strcmp("multi", string_option)) { opts->derive = DERIVE_MULTI; } else { kfree(string_option); goto invalid_option; } kfree(string_option); break; case Opt_lower_fs: string_option = match_strdup(&args[0]); if (!strcmp("ext4", string_option)) { opts->lower_fs = LOWER_FS_EXT4; } else if (!strcmp("fat", string_option)) { opts->lower_fs = LOWER_FS_FAT; } else if (!strcmp("f2fs", string_option)) { opts->lower_fs = LOWER_FS_F2FS; } else { kfree(string_option); goto invalid_option; } kfree(string_option); break; case Opt_reserved_mb: if (match_int(&args[0], &option)) return 0; opts->reserved_mb = option; printk( KERN_INFO "sdcardfs : options - reserved_mb: %d\n", opts->reserved_mb); break; /* unknown option */ default: invalid_option: if (!silent) { printk( KERN_ERR "Unrecognized mount option \"%s\" " "or missing value", p); } return -EINVAL; } } if (*debug) { printk( KERN_INFO "sdcardfs : options - debug:%d\n", *debug); printk( KERN_INFO "sdcardfs : options - uid:%d\n", opts->fs_low_uid); printk( KERN_INFO "sdcardfs : options - gid:%d\n", opts->fs_low_gid); printk( KERN_INFO "sdcardfs : options - derive:%d\n", opts->derive); printk( KERN_INFO "sdcardfs : options - write_gid:%d\n", opts->write_gid); } return 0; }
static int parse_options(struct super_block *sb, char *options) { struct esdfs_sb_info *sbi = ESDFS_SB(sb); substring_t args[MAX_OPT_ARGS]; char *p; if (!options) return 0; while ((p = strsep(&options, ",")) != NULL) { int token; if (!*p) continue; /* * Initialize args struct so we know whether arg was * found; some options take optional arguments. */ args[0].to = args[0].from = NULL; token = match_token(p, esdfs_tokens, args); switch (token) { case Opt_lower_perms: if (args->from) { int ret; char *perms = match_strdup(args); ret = parse_perms(&sbi->lower_perms, perms); kfree(perms); if (ret) return -EINVAL; } else return -EINVAL; break; case Opt_upper_perms: if (args->from) { int ret; char *perms = match_strdup(args); ret = parse_perms(&sbi->upper_perms, perms); kfree(perms); if (ret) return -EINVAL; } else return -EINVAL; break; case Opt_derive_none: clear_opt(sbi, DERIVE_LEGACY); clear_opt(sbi, DERIVE_UNIFIED); break; case Opt_derive_legacy: set_opt(sbi, DERIVE_LEGACY); clear_opt(sbi, DERIVE_UNIFIED); break; case Opt_derive_unified: clear_opt(sbi, DERIVE_LEGACY); set_opt(sbi, DERIVE_UNIFIED); break; case Opt_split: set_opt(sbi, DERIVE_SPLIT); break; case Opt_nosplit: clear_opt(sbi, DERIVE_SPLIT); break; default: esdfs_msg(sb, KERN_ERR, "unrecognized mount option \"%s\" or missing value\n", p); return -EINVAL; } } return 0; }