EXT4之mount可選項


static const match_table_t tokens = {
 {Opt_bsd_df, "bsddf"},
 {Opt_minix_df, "minixdf"},
 {Opt_grpid, "grpid"},
 {Opt_grpid, "bsdgroups"},
 {Opt_nogrpid, "nogrpid"},
 {Opt_nogrpid, "sysvgroups"},
 {Opt_resgid, "resgid=%u"},
 {Opt_resuid, "resuid=%u"},
 {Opt_sb, "sb=%u"},
 {Opt_err_cont, "errors=continue"},
 {Opt_err_panic, "errors=panic"},
 {Opt_err_ro, "errors=remount-ro"},
 {Opt_nouid32, "nouid32"},
 {Opt_debug, "debug"},
 {Opt_removed, "oldalloc"},
 {Opt_removed, "orlov"},
 {Opt_user_xattr, "user_xattr"},
 {Opt_nouser_xattr, "nouser_xattr"},
 {Opt_acl, "acl"},
 {Opt_noacl, "noacl"},
 {Opt_noload, "norecovery"},
 {Opt_noload, "noload"},
 {Opt_removed, "nobh"},
 {Opt_removed, "bh"},
 {Opt_commit, "commit=%u"},
 {Opt_min_batch_time, "min_batch_time=%u"},
 {Opt_max_batch_time, "max_batch_time=%u"},
 {Opt_journal_dev, "journal_dev=%u"},
 {Opt_journal_path, "journal_path=%s"},
 {Opt_journal_checksum, "journal_checksum"},
 {Opt_nojournal_checksum, "nojournal_checksum"},
 {Opt_journal_async_commit, "journal_async_commit"},
 {Opt_abort, "abort"},
 {Opt_data_journal, "data=journal"},
 {Opt_data_ordered, "data=ordered"},
 {Opt_data_writeback, "data=writeback"},
 {Opt_data_err_abort, "data_err=abort"},
 {Opt_data_err_ignore, "data_err=ignore"},
 {Opt_offusrjquota, "usrjquota="},
 {Opt_usrjquota, "usrjquota=%s"},
 {Opt_offgrpjquota, "grpjquota="},
 {Opt_grpjquota, "grpjquota=%s"},
 {Opt_jqfmt_vfsold, "jqfmt=vfsold"},
 {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
 {Opt_jqfmt_vfsv1, "jqfmt=vfsv1"},
 {Opt_grpquota, "grpquota"},
 {Opt_noquota, "noquota"},
 {Opt_quota, "quota"},
 {Opt_usrquota, "usrquota"},
 {Opt_prjquota, "prjquota"},
 {Opt_barrier, "barrier=%u"},
 {Opt_barrier, "barrier"},
 {Opt_nobarrier, "nobarrier"},
 {Opt_i_version, "i_version"},
 {Opt_dax, "dax"},
 {Opt_stripe, "stripe=%u"},
 {Opt_delalloc, "delalloc"},
 {Opt_lazytime, "lazytime"},
 {Opt_nolazytime, "nolazytime"},
 {Opt_nodelalloc, "nodelalloc"},
 {Opt_removed, "mblk_io_submit"},
 {Opt_removed, "nomblk_io_submit"},
 {Opt_block_validity, "block_validity"},
 {Opt_noblock_validity, "noblock_validity"},
 {Opt_inode_readahead_blks, "inode_readahead_blks=%u"},
 {Opt_journal_ioprio, "journal_ioprio=%u"},
 {Opt_auto_da_alloc, "auto_da_alloc=%u"},
 {Opt_auto_da_alloc, "auto_da_alloc"},
 {Opt_noauto_da_alloc, "noauto_da_alloc"},
 {Opt_dioread_nolock, "dioread_nolock"},
 {Opt_dioread_lock, "dioread_lock"},
 {Opt_discard, "discard"},
 {Opt_nodiscard, "nodiscard"},
 {Opt_init_itable, "init_itable=%u"},
 {Opt_init_itable, "init_itable"},
 {Opt_noinit_itable, "noinit_itable"},
 {Opt_max_dir_size_kb, "max_dir_size_kb=%u"},
 {Opt_test_dummy_encryption, "test_dummy_encryption"},
 {Opt_removed, "check=none"}, /* mount option from ext2/3 */
 {Opt_removed, "nocheck"}, /* mount option from ext2/3 */
 {Opt_removed, "reservation"}, /* mount option from ext2/3 */
 {Opt_removed, "noreservation"}, /* mount option from ext2/3 */
 {Opt_removed, "journal=%u"}, /* mount option from ext2/3 */
 {Opt_err, NULL},
};
static int parse_options(char *options, struct super_block *sb,
    unsigned long *journal_devnum,
    unsigned int *journal_ioprio,
    int is_remount)
{
 struct ext4_sb_info *sbi = EXT4_SB(sb);
 char *p;
 substring_t args[MAX_OPT_ARGS];
 int token;
 if (!options)
  return 1;
 while ((p = strsep(&options, ",")) != NULL) {
  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, tokens, args);
  if (handle_mount_opt(sb, p, token, args, journal_devnum,
         journal_ioprio, is_remount) < 0)
   return 0;
 }
#ifdef CONFIG_QUOTA
 /*
  * We do the test below only for project quotas. 'usrquota' and
  * 'grpquota' mount options are allowed even without quota feature
  * to support legacy quotas in quota files.
  */
 if (test_opt(sb, PRJQUOTA) && !ext4_has_feature_project(sb)) {
  ext4_msg(sb, KERN_ERR, "Project quota feature not enabled. "
    "Cannot enable project quota enforcement.");
  return 0;
 }
 if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) {
  if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA])
   clear_opt(sb, USRQUOTA);
  if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA])
   clear_opt(sb, GRPQUOTA);
  if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) {
   ext4_msg(sb, KERN_ERR, "old and new quota "
     "format mixing");
   return 0;
  }
  if (!sbi->s_jquota_fmt) {
   ext4_msg(sb, KERN_ERR, "journaled quota format "
     "not specified");
   return 0;
  }
 }
#endif
 if (test_opt(sb, DIOREAD_NOLOCK)) {
  int blocksize =
   BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
  if (blocksize < PAGE_SIZE) {
   ext4_msg(sb, KERN_ERR, "can't mount with "
     "dioread_nolock if block size != PAGE_SIZE");
   return 0;
  }
 }
 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA &&
     test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
  ext4_msg(sb, KERN_ERR, "can't mount with journal_async_commit "
    "in data=ordered mode");
  return 0;
 }
 return 1;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章