LCOV - code coverage report
Current view: top level - fs/ext2 - super.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 622 0.0 %
Date: 2014-02-18 Functions: 0 33 0.0 %
Branches: 0 484 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/fs/ext2/super.c
       3                 :            :  *
       4                 :            :  * Copyright (C) 1992, 1993, 1994, 1995
       5                 :            :  * Remy Card (card@masi.ibp.fr)
       6                 :            :  * Laboratoire MASI - Institut Blaise Pascal
       7                 :            :  * Universite Pierre et Marie Curie (Paris VI)
       8                 :            :  *
       9                 :            :  *  from
      10                 :            :  *
      11                 :            :  *  linux/fs/minix/inode.c
      12                 :            :  *
      13                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
      14                 :            :  *
      15                 :            :  *  Big-endian to little-endian byte-swapping/bitmaps by
      16                 :            :  *        David S. Miller (davem@caip.rutgers.edu), 1995
      17                 :            :  */
      18                 :            : 
      19                 :            : #include <linux/module.h>
      20                 :            : #include <linux/string.h>
      21                 :            : #include <linux/fs.h>
      22                 :            : #include <linux/slab.h>
      23                 :            : #include <linux/init.h>
      24                 :            : #include <linux/blkdev.h>
      25                 :            : #include <linux/parser.h>
      26                 :            : #include <linux/random.h>
      27                 :            : #include <linux/buffer_head.h>
      28                 :            : #include <linux/exportfs.h>
      29                 :            : #include <linux/vfs.h>
      30                 :            : #include <linux/seq_file.h>
      31                 :            : #include <linux/mount.h>
      32                 :            : #include <linux/log2.h>
      33                 :            : #include <linux/quotaops.h>
      34                 :            : #include <asm/uaccess.h>
      35                 :            : #include "ext2.h"
      36                 :            : #include "xattr.h"
      37                 :            : #include "acl.h"
      38                 :            : #include "xip.h"
      39                 :            : 
      40                 :            : static void ext2_sync_super(struct super_block *sb,
      41                 :            :                             struct ext2_super_block *es, int wait);
      42                 :            : static int ext2_remount (struct super_block * sb, int * flags, char * data);
      43                 :            : static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf);
      44                 :            : static int ext2_sync_fs(struct super_block *sb, int wait);
      45                 :            : static int ext2_freeze(struct super_block *sb);
      46                 :            : static int ext2_unfreeze(struct super_block *sb);
      47                 :            : 
      48                 :          0 : void ext2_error(struct super_block *sb, const char *function,
      49                 :            :                 const char *fmt, ...)
      50                 :            : {
      51                 :            :         struct va_format vaf;
      52                 :            :         va_list args;
      53                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
      54                 :          0 :         struct ext2_super_block *es = sbi->s_es;
      55                 :            : 
      56         [ #  # ]:          0 :         if (!(sb->s_flags & MS_RDONLY)) {
      57                 :            :                 spin_lock(&sbi->s_lock);
      58                 :          0 :                 sbi->s_mount_state |= EXT2_ERROR_FS;
      59                 :          0 :                 es->s_state |= cpu_to_le16(EXT2_ERROR_FS);
      60                 :            :                 spin_unlock(&sbi->s_lock);
      61                 :          0 :                 ext2_sync_super(sb, es, 1);
      62                 :            :         }
      63                 :            : 
      64                 :          0 :         va_start(args, fmt);
      65                 :            : 
      66                 :          0 :         vaf.fmt = fmt;
      67                 :          0 :         vaf.va = &args;
      68                 :            : 
      69                 :          0 :         printk(KERN_CRIT "EXT2-fs (%s): error: %s: %pV\n",
      70                 :          0 :                sb->s_id, function, &vaf);
      71                 :            : 
      72                 :          0 :         va_end(args);
      73                 :            : 
      74         [ #  # ]:          0 :         if (test_opt(sb, ERRORS_PANIC))
      75                 :          0 :                 panic("EXT2-fs: panic from previous error\n");
      76         [ #  # ]:          0 :         if (test_opt(sb, ERRORS_RO)) {
      77                 :          0 :                 ext2_msg(sb, KERN_CRIT,
      78                 :            :                              "error: remounting filesystem read-only");
      79                 :          0 :                 sb->s_flags |= MS_RDONLY;
      80                 :            :         }
      81                 :          0 : }
      82                 :            : 
      83                 :          0 : void ext2_msg(struct super_block *sb, const char *prefix,
      84                 :            :                 const char *fmt, ...)
      85                 :            : {
      86                 :            :         struct va_format vaf;
      87                 :            :         va_list args;
      88                 :            : 
      89                 :          0 :         va_start(args, fmt);
      90                 :            : 
      91                 :          0 :         vaf.fmt = fmt;
      92                 :          0 :         vaf.va = &args;
      93                 :            : 
      94                 :          0 :         printk("%sEXT2-fs (%s): %pV\n", prefix, sb->s_id, &vaf);
      95                 :            : 
      96                 :          0 :         va_end(args);
      97                 :          0 : }
      98                 :            : 
      99                 :            : /*
     100                 :            :  * This must be called with sbi->s_lock held.
     101                 :            :  */
     102                 :          0 : void ext2_update_dynamic_rev(struct super_block *sb)
     103                 :            : {
     104                 :          0 :         struct ext2_super_block *es = EXT2_SB(sb)->s_es;
     105                 :            : 
     106         [ #  # ]:          0 :         if (le32_to_cpu(es->s_rev_level) > EXT2_GOOD_OLD_REV)
     107                 :          0 :                 return;
     108                 :            : 
     109                 :          0 :         ext2_msg(sb, KERN_WARNING,
     110                 :            :                      "warning: updating to rev %d because of "
     111                 :            :                      "new feature flag, running e2fsck is recommended",
     112                 :            :                      EXT2_DYNAMIC_REV);
     113                 :            : 
     114                 :          0 :         es->s_first_ino = cpu_to_le32(EXT2_GOOD_OLD_FIRST_INO);
     115                 :          0 :         es->s_inode_size = cpu_to_le16(EXT2_GOOD_OLD_INODE_SIZE);
     116                 :          0 :         es->s_rev_level = cpu_to_le32(EXT2_DYNAMIC_REV);
     117                 :            :         /* leave es->s_feature_*compat flags alone */
     118                 :            :         /* es->s_uuid will be set by e2fsck if empty */
     119                 :            : 
     120                 :            :         /*
     121                 :            :          * The rest of the superblock fields should be zero, and if not it
     122                 :            :          * means they are likely already in use, so leave them alone.  We
     123                 :            :          * can leave it up to e2fsck to clean up any inconsistencies there.
     124                 :            :          */
     125                 :            : }
     126                 :            : 
     127                 :          0 : static void ext2_put_super (struct super_block * sb)
     128                 :            : {
     129                 :            :         int db_count;
     130                 :            :         int i;
     131                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     132                 :            : 
     133                 :          0 :         dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
     134                 :            : 
     135                 :            :         ext2_xattr_put_super(sb);
     136         [ #  # ]:          0 :         if (!(sb->s_flags & MS_RDONLY)) {
     137                 :          0 :                 struct ext2_super_block *es = sbi->s_es;
     138                 :            : 
     139                 :            :                 spin_lock(&sbi->s_lock);
     140                 :          0 :                 es->s_state = cpu_to_le16(sbi->s_mount_state);
     141                 :            :                 spin_unlock(&sbi->s_lock);
     142                 :          0 :                 ext2_sync_super(sb, es, 1);
     143                 :            :         }
     144                 :          0 :         db_count = sbi->s_gdb_count;
     145         [ #  # ]:          0 :         for (i = 0; i < db_count; i++)
     146         [ #  # ]:          0 :                 if (sbi->s_group_desc[i])
     147                 :            :                         brelse (sbi->s_group_desc[i]);
     148                 :          0 :         kfree(sbi->s_group_desc);
     149                 :          0 :         kfree(sbi->s_debts);
     150                 :          0 :         percpu_counter_destroy(&sbi->s_freeblocks_counter);
     151                 :          0 :         percpu_counter_destroy(&sbi->s_freeinodes_counter);
     152                 :          0 :         percpu_counter_destroy(&sbi->s_dirs_counter);
     153                 :          0 :         brelse (sbi->s_sbh);
     154                 :          0 :         sb->s_fs_info = NULL;
     155                 :          0 :         kfree(sbi->s_blockgroup_lock);
     156                 :          0 :         kfree(sbi);
     157                 :          0 : }
     158                 :            : 
     159                 :            : static struct kmem_cache * ext2_inode_cachep;
     160                 :            : 
     161                 :          0 : static struct inode *ext2_alloc_inode(struct super_block *sb)
     162                 :            : {
     163                 :            :         struct ext2_inode_info *ei;
     164                 :          0 :         ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL);
     165         [ #  # ]:          0 :         if (!ei)
     166                 :            :                 return NULL;
     167                 :          0 :         ei->i_block_alloc_info = NULL;
     168                 :          0 :         ei->vfs_inode.i_version = 1;
     169                 :          0 :         return &ei->vfs_inode;
     170                 :            : }
     171                 :            : 
     172                 :          0 : static void ext2_i_callback(struct rcu_head *head)
     173                 :            : {
     174                 :            :         struct inode *inode = container_of(head, struct inode, i_rcu);
     175                 :          0 :         kmem_cache_free(ext2_inode_cachep, EXT2_I(inode));
     176                 :          0 : }
     177                 :            : 
     178                 :          0 : static void ext2_destroy_inode(struct inode *inode)
     179                 :            : {
     180                 :          0 :         call_rcu(&inode->i_rcu, ext2_i_callback);
     181                 :          0 : }
     182                 :            : 
     183                 :          0 : static void init_once(void *foo)
     184                 :            : {
     185                 :            :         struct ext2_inode_info *ei = (struct ext2_inode_info *) foo;
     186                 :            : 
     187                 :          0 :         rwlock_init(&ei->i_meta_lock);
     188                 :            : #ifdef CONFIG_EXT2_FS_XATTR
     189                 :            :         init_rwsem(&ei->xattr_sem);
     190                 :            : #endif
     191                 :          0 :         mutex_init(&ei->truncate_mutex);
     192                 :          0 :         inode_init_once(&ei->vfs_inode);
     193                 :          0 : }
     194                 :            : 
     195                 :          0 : static int init_inodecache(void)
     196                 :            : {
     197                 :          0 :         ext2_inode_cachep = kmem_cache_create("ext2_inode_cache",
     198                 :            :                                              sizeof(struct ext2_inode_info),
     199                 :            :                                              0, (SLAB_RECLAIM_ACCOUNT|
     200                 :            :                                                 SLAB_MEM_SPREAD),
     201                 :            :                                              init_once);
     202         [ #  # ]:          0 :         if (ext2_inode_cachep == NULL)
     203                 :            :                 return -ENOMEM;
     204                 :          0 :         return 0;
     205                 :            : }
     206                 :            : 
     207                 :            : static void destroy_inodecache(void)
     208                 :            : {
     209                 :            :         /*
     210                 :            :          * Make sure all delayed rcu free inodes are flushed before we
     211                 :            :          * destroy cache.
     212                 :            :          */
     213                 :          0 :         rcu_barrier();
     214                 :          0 :         kmem_cache_destroy(ext2_inode_cachep);
     215                 :            : }
     216                 :            : 
     217                 :          0 : static int ext2_show_options(struct seq_file *seq, struct dentry *root)
     218                 :            : {
     219                 :          0 :         struct super_block *sb = root->d_sb;
     220                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     221                 :          0 :         struct ext2_super_block *es = sbi->s_es;
     222                 :            :         unsigned long def_mount_opts;
     223                 :            : 
     224                 :            :         spin_lock(&sbi->s_lock);
     225                 :          0 :         def_mount_opts = le32_to_cpu(es->s_default_mount_opts);
     226                 :            : 
     227         [ #  # ]:          0 :         if (sbi->s_sb_block != 1)
     228                 :          0 :                 seq_printf(seq, ",sb=%lu", sbi->s_sb_block);
     229         [ #  # ]:          0 :         if (test_opt(sb, MINIX_DF))
     230                 :          0 :                 seq_puts(seq, ",minixdf");
     231         [ #  # ]:          0 :         if (test_opt(sb, GRPID))
     232                 :          0 :                 seq_puts(seq, ",grpid");
     233 [ #  # ][ #  # ]:          0 :         if (!test_opt(sb, GRPID) && (def_mount_opts & EXT2_DEFM_BSDGROUPS))
     234                 :          0 :                 seq_puts(seq, ",nogrpid");
     235 [ #  # ][ #  # ]:          0 :         if (!uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT2_DEF_RESUID)) ||
     236                 :          0 :             le16_to_cpu(es->s_def_resuid) != EXT2_DEF_RESUID) {
     237                 :          0 :                 seq_printf(seq, ",resuid=%u",
     238                 :            :                                 from_kuid_munged(&init_user_ns, sbi->s_resuid));
     239                 :            :         }
     240 [ #  # ][ #  # ]:          0 :         if (!gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT2_DEF_RESGID)) ||
     241                 :          0 :             le16_to_cpu(es->s_def_resgid) != EXT2_DEF_RESGID) {
     242                 :          0 :                 seq_printf(seq, ",resgid=%u",
     243                 :            :                                 from_kgid_munged(&init_user_ns, sbi->s_resgid));
     244                 :            :         }
     245         [ #  # ]:          0 :         if (test_opt(sb, ERRORS_RO)) {
     246                 :          0 :                 int def_errors = le16_to_cpu(es->s_errors);
     247                 :            : 
     248         [ #  # ]:          0 :                 if (def_errors == EXT2_ERRORS_PANIC ||
     249                 :          0 :                     def_errors == EXT2_ERRORS_CONTINUE) {
     250                 :          0 :                         seq_puts(seq, ",errors=remount-ro");
     251                 :            :                 }
     252                 :            :         }
     253         [ #  # ]:          0 :         if (test_opt(sb, ERRORS_CONT))
     254                 :          0 :                 seq_puts(seq, ",errors=continue");
     255         [ #  # ]:          0 :         if (test_opt(sb, ERRORS_PANIC))
     256                 :          0 :                 seq_puts(seq, ",errors=panic");
     257         [ #  # ]:          0 :         if (test_opt(sb, NO_UID32))
     258                 :          0 :                 seq_puts(seq, ",nouid32");
     259         [ #  # ]:          0 :         if (test_opt(sb, DEBUG))
     260                 :          0 :                 seq_puts(seq, ",debug");
     261         [ #  # ]:          0 :         if (test_opt(sb, OLDALLOC))
     262                 :          0 :                 seq_puts(seq, ",oldalloc");
     263                 :            : 
     264                 :            : #ifdef CONFIG_EXT2_FS_XATTR
     265                 :            :         if (test_opt(sb, XATTR_USER))
     266                 :            :                 seq_puts(seq, ",user_xattr");
     267                 :            :         if (!test_opt(sb, XATTR_USER) &&
     268                 :            :             (def_mount_opts & EXT2_DEFM_XATTR_USER)) {
     269                 :            :                 seq_puts(seq, ",nouser_xattr");
     270                 :            :         }
     271                 :            : #endif
     272                 :            : 
     273                 :            : #ifdef CONFIG_EXT2_FS_POSIX_ACL
     274                 :            :         if (test_opt(sb, POSIX_ACL))
     275                 :            :                 seq_puts(seq, ",acl");
     276                 :            :         if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT2_DEFM_ACL))
     277                 :            :                 seq_puts(seq, ",noacl");
     278                 :            : #endif
     279                 :            : 
     280         [ #  # ]:          0 :         if (test_opt(sb, NOBH))
     281                 :          0 :                 seq_puts(seq, ",nobh");
     282                 :            : 
     283                 :            : #if defined(CONFIG_QUOTA)
     284         [ #  # ]:          0 :         if (sbi->s_mount_opt & EXT2_MOUNT_USRQUOTA)
     285                 :          0 :                 seq_puts(seq, ",usrquota");
     286                 :            : 
     287         [ #  # ]:          0 :         if (sbi->s_mount_opt & EXT2_MOUNT_GRPQUOTA)
     288                 :          0 :                 seq_puts(seq, ",grpquota");
     289                 :            : #endif
     290                 :            : 
     291                 :            : #if defined(CONFIG_EXT2_FS_XIP)
     292                 :            :         if (sbi->s_mount_opt & EXT2_MOUNT_XIP)
     293                 :            :                 seq_puts(seq, ",xip");
     294                 :            : #endif
     295                 :            : 
     296         [ #  # ]:          0 :         if (!test_opt(sb, RESERVATION))
     297                 :          0 :                 seq_puts(seq, ",noreservation");
     298                 :            : 
     299                 :            :         spin_unlock(&sbi->s_lock);
     300                 :          0 :         return 0;
     301                 :            : }
     302                 :            : 
     303                 :            : #ifdef CONFIG_QUOTA
     304                 :            : static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, size_t len, loff_t off);
     305                 :            : static ssize_t ext2_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off);
     306                 :            : #endif
     307                 :            : 
     308                 :            : static const struct super_operations ext2_sops = {
     309                 :            :         .alloc_inode    = ext2_alloc_inode,
     310                 :            :         .destroy_inode  = ext2_destroy_inode,
     311                 :            :         .write_inode    = ext2_write_inode,
     312                 :            :         .evict_inode    = ext2_evict_inode,
     313                 :            :         .put_super      = ext2_put_super,
     314                 :            :         .sync_fs        = ext2_sync_fs,
     315                 :            :         .freeze_fs      = ext2_freeze,
     316                 :            :         .unfreeze_fs    = ext2_unfreeze,
     317                 :            :         .statfs         = ext2_statfs,
     318                 :            :         .remount_fs     = ext2_remount,
     319                 :            :         .show_options   = ext2_show_options,
     320                 :            : #ifdef CONFIG_QUOTA
     321                 :            :         .quota_read     = ext2_quota_read,
     322                 :            :         .quota_write    = ext2_quota_write,
     323                 :            : #endif
     324                 :            : };
     325                 :            : 
     326                 :          0 : static struct inode *ext2_nfs_get_inode(struct super_block *sb,
     327                 :            :                 u64 ino, u32 generation)
     328                 :            : {
     329                 :            :         struct inode *inode;
     330                 :            : 
     331 [ #  # ][ #  # ]:          0 :         if (ino < EXT2_FIRST_INO(sb) && ino != EXT2_ROOT_INO)
     332                 :            :                 return ERR_PTR(-ESTALE);
     333         [ #  # ]:          0 :         if (ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
     334                 :            :                 return ERR_PTR(-ESTALE);
     335                 :            : 
     336                 :            :         /*
     337                 :            :          * ext2_iget isn't quite right if the inode is currently unallocated!
     338                 :            :          * However ext2_iget currently does appropriate checks to handle stale
     339                 :            :          * inodes so everything is OK.
     340                 :            :          */
     341                 :          0 :         inode = ext2_iget(sb, ino);
     342         [ #  # ]:          0 :         if (IS_ERR(inode))
     343                 :            :                 return ERR_CAST(inode);
     344 [ #  # ][ #  # ]:          0 :         if (generation && inode->i_generation != generation) {
     345                 :            :                 /* we didn't find the right inode.. */
     346                 :          0 :                 iput(inode);
     347                 :          0 :                 return ERR_PTR(-ESTALE);
     348                 :            :         }
     349                 :            :         return inode;
     350                 :            : }
     351                 :            : 
     352                 :          0 : static struct dentry *ext2_fh_to_dentry(struct super_block *sb, struct fid *fid,
     353                 :            :                 int fh_len, int fh_type)
     354                 :            : {
     355                 :          0 :         return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
     356                 :            :                                     ext2_nfs_get_inode);
     357                 :            : }
     358                 :            : 
     359                 :          0 : static struct dentry *ext2_fh_to_parent(struct super_block *sb, struct fid *fid,
     360                 :            :                 int fh_len, int fh_type)
     361                 :            : {
     362                 :          0 :         return generic_fh_to_parent(sb, fid, fh_len, fh_type,
     363                 :            :                                     ext2_nfs_get_inode);
     364                 :            : }
     365                 :            : 
     366                 :            : static const struct export_operations ext2_export_ops = {
     367                 :            :         .fh_to_dentry = ext2_fh_to_dentry,
     368                 :            :         .fh_to_parent = ext2_fh_to_parent,
     369                 :            :         .get_parent = ext2_get_parent,
     370                 :            : };
     371                 :            : 
     372                 :          0 : static unsigned long get_sb_block(void **data)
     373                 :            : {
     374                 :            :         unsigned long   sb_block;
     375                 :          0 :         char            *options = (char *) *data;
     376                 :            : 
     377 [ #  # ][ #  # ]:          0 :         if (!options || strncmp(options, "sb=", 3) != 0)
     378                 :            :                 return 1;       /* Default location */
     379                 :          0 :         options += 3;
     380                 :          0 :         sb_block = simple_strtoul(options, &options, 0);
     381         [ #  # ]:          0 :         if (*options && *options != ',') {
     382                 :          0 :                 printk("EXT2-fs: Invalid sb specification: %s\n",
     383                 :            :                        (char *) *data);
     384                 :          0 :                 return 1;
     385                 :            :         }
     386         [ #  # ]:          0 :         if (*options == ',')
     387                 :          0 :                 options++;
     388                 :          0 :         *data = (void *) options;
     389                 :          0 :         return sb_block;
     390                 :            : }
     391                 :            : 
     392                 :            : enum {
     393                 :            :         Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid,
     394                 :            :         Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic,
     395                 :            :         Opt_err_ro, Opt_nouid32, Opt_nocheck, Opt_debug,
     396                 :            :         Opt_oldalloc, Opt_orlov, Opt_nobh, Opt_user_xattr, Opt_nouser_xattr,
     397                 :            :         Opt_acl, Opt_noacl, Opt_xip, Opt_ignore, Opt_err, Opt_quota,
     398                 :            :         Opt_usrquota, Opt_grpquota, Opt_reservation, Opt_noreservation
     399                 :            : };
     400                 :            : 
     401                 :            : static const match_table_t tokens = {
     402                 :            :         {Opt_bsd_df, "bsddf"},
     403                 :            :         {Opt_minix_df, "minixdf"},
     404                 :            :         {Opt_grpid, "grpid"},
     405                 :            :         {Opt_grpid, "bsdgroups"},
     406                 :            :         {Opt_nogrpid, "nogrpid"},
     407                 :            :         {Opt_nogrpid, "sysvgroups"},
     408                 :            :         {Opt_resgid, "resgid=%u"},
     409                 :            :         {Opt_resuid, "resuid=%u"},
     410                 :            :         {Opt_sb, "sb=%u"},
     411                 :            :         {Opt_err_cont, "errors=continue"},
     412                 :            :         {Opt_err_panic, "errors=panic"},
     413                 :            :         {Opt_err_ro, "errors=remount-ro"},
     414                 :            :         {Opt_nouid32, "nouid32"},
     415                 :            :         {Opt_nocheck, "check=none"},
     416                 :            :         {Opt_nocheck, "nocheck"},
     417                 :            :         {Opt_debug, "debug"},
     418                 :            :         {Opt_oldalloc, "oldalloc"},
     419                 :            :         {Opt_orlov, "orlov"},
     420                 :            :         {Opt_nobh, "nobh"},
     421                 :            :         {Opt_user_xattr, "user_xattr"},
     422                 :            :         {Opt_nouser_xattr, "nouser_xattr"},
     423                 :            :         {Opt_acl, "acl"},
     424                 :            :         {Opt_noacl, "noacl"},
     425                 :            :         {Opt_xip, "xip"},
     426                 :            :         {Opt_grpquota, "grpquota"},
     427                 :            :         {Opt_ignore, "noquota"},
     428                 :            :         {Opt_quota, "quota"},
     429                 :            :         {Opt_usrquota, "usrquota"},
     430                 :            :         {Opt_reservation, "reservation"},
     431                 :            :         {Opt_noreservation, "noreservation"},
     432                 :            :         {Opt_err, NULL}
     433                 :            : };
     434                 :            : 
     435                 :          0 : static int parse_options(char *options, struct super_block *sb)
     436                 :            : {
     437                 :            :         char *p;
     438                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     439                 :            :         substring_t args[MAX_OPT_ARGS];
     440                 :            :         int option;
     441                 :            :         kuid_t uid;
     442                 :            :         kgid_t gid;
     443                 :            : 
     444         [ #  # ]:          0 :         if (!options)
     445                 :            :                 return 1;
     446                 :            : 
     447         [ #  # ]:          0 :         while ((p = strsep (&options, ",")) != NULL) {
     448                 :            :                 int token;
     449         [ #  # ]:          0 :                 if (!*p)
     450                 :          0 :                         continue;
     451                 :            : 
     452                 :          0 :                 token = match_token(p, tokens, args);
     453   [ #  #  #  #  :          0 :                 switch (token) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     454                 :            :                 case Opt_bsd_df:
     455                 :          0 :                         clear_opt (sbi->s_mount_opt, MINIX_DF);
     456                 :          0 :                         break;
     457                 :            :                 case Opt_minix_df:
     458                 :          0 :                         set_opt (sbi->s_mount_opt, MINIX_DF);
     459                 :          0 :                         break;
     460                 :            :                 case Opt_grpid:
     461                 :          0 :                         set_opt (sbi->s_mount_opt, GRPID);
     462                 :          0 :                         break;
     463                 :            :                 case Opt_nogrpid:
     464                 :          0 :                         clear_opt (sbi->s_mount_opt, GRPID);
     465                 :          0 :                         break;
     466                 :            :                 case Opt_resuid:
     467         [ #  # ]:          0 :                         if (match_int(&args[0], &option))
     468                 :            :                                 return 0;
     469                 :          0 :                         uid = make_kuid(current_user_ns(), option);
     470         [ #  # ]:          0 :                         if (!uid_valid(uid)) {
     471                 :          0 :                                 ext2_msg(sb, KERN_ERR, "Invalid uid value %d", option);
     472                 :          0 :                                 return 0;
     473                 :            : 
     474                 :            :                         }
     475                 :          0 :                         sbi->s_resuid = uid;
     476                 :          0 :                         break;
     477                 :            :                 case Opt_resgid:
     478         [ #  # ]:          0 :                         if (match_int(&args[0], &option))
     479                 :            :                                 return 0;
     480                 :          0 :                         gid = make_kgid(current_user_ns(), option);
     481         [ #  # ]:          0 :                         if (!gid_valid(gid)) {
     482                 :          0 :                                 ext2_msg(sb, KERN_ERR, "Invalid gid value %d", option);
     483                 :          0 :                                 return 0;
     484                 :            :                         }
     485                 :          0 :                         sbi->s_resgid = gid;
     486                 :          0 :                         break;
     487                 :            :                 case Opt_sb:
     488                 :            :                         /* handled by get_sb_block() instead of here */
     489                 :            :                         /* *sb_block = match_int(&args[0]); */
     490                 :            :                         break;
     491                 :            :                 case Opt_err_panic:
     492                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_CONT);
     493                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_RO);
     494                 :          0 :                         set_opt (sbi->s_mount_opt, ERRORS_PANIC);
     495                 :          0 :                         break;
     496                 :            :                 case Opt_err_ro:
     497                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_CONT);
     498                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_PANIC);
     499                 :          0 :                         set_opt (sbi->s_mount_opt, ERRORS_RO);
     500                 :          0 :                         break;
     501                 :            :                 case Opt_err_cont:
     502                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_RO);
     503                 :          0 :                         clear_opt (sbi->s_mount_opt, ERRORS_PANIC);
     504                 :          0 :                         set_opt (sbi->s_mount_opt, ERRORS_CONT);
     505                 :          0 :                         break;
     506                 :            :                 case Opt_nouid32:
     507                 :          0 :                         set_opt (sbi->s_mount_opt, NO_UID32);
     508                 :          0 :                         break;
     509                 :            :                 case Opt_nocheck:
     510                 :          0 :                         clear_opt (sbi->s_mount_opt, CHECK);
     511                 :          0 :                         break;
     512                 :            :                 case Opt_debug:
     513                 :          0 :                         set_opt (sbi->s_mount_opt, DEBUG);
     514                 :          0 :                         break;
     515                 :            :                 case Opt_oldalloc:
     516                 :          0 :                         set_opt (sbi->s_mount_opt, OLDALLOC);
     517                 :          0 :                         break;
     518                 :            :                 case Opt_orlov:
     519                 :          0 :                         clear_opt (sbi->s_mount_opt, OLDALLOC);
     520                 :          0 :                         break;
     521                 :            :                 case Opt_nobh:
     522                 :          0 :                         set_opt (sbi->s_mount_opt, NOBH);
     523                 :          0 :                         break;
     524                 :            : #ifdef CONFIG_EXT2_FS_XATTR
     525                 :            :                 case Opt_user_xattr:
     526                 :            :                         set_opt (sbi->s_mount_opt, XATTR_USER);
     527                 :            :                         break;
     528                 :            :                 case Opt_nouser_xattr:
     529                 :            :                         clear_opt (sbi->s_mount_opt, XATTR_USER);
     530                 :            :                         break;
     531                 :            : #else
     532                 :            :                 case Opt_user_xattr:
     533                 :            :                 case Opt_nouser_xattr:
     534                 :          0 :                         ext2_msg(sb, KERN_INFO, "(no)user_xattr options"
     535                 :            :                                 "not supported");
     536                 :          0 :                         break;
     537                 :            : #endif
     538                 :            : #ifdef CONFIG_EXT2_FS_POSIX_ACL
     539                 :            :                 case Opt_acl:
     540                 :            :                         set_opt(sbi->s_mount_opt, POSIX_ACL);
     541                 :            :                         break;
     542                 :            :                 case Opt_noacl:
     543                 :            :                         clear_opt(sbi->s_mount_opt, POSIX_ACL);
     544                 :            :                         break;
     545                 :            : #else
     546                 :            :                 case Opt_acl:
     547                 :            :                 case Opt_noacl:
     548                 :          0 :                         ext2_msg(sb, KERN_INFO,
     549                 :            :                                 "(no)acl options not supported");
     550                 :          0 :                         break;
     551                 :            : #endif
     552                 :            :                 case Opt_xip:
     553                 :            : #ifdef CONFIG_EXT2_FS_XIP
     554                 :            :                         set_opt (sbi->s_mount_opt, XIP);
     555                 :            : #else
     556                 :          0 :                         ext2_msg(sb, KERN_INFO, "xip option not supported");
     557                 :            : #endif
     558                 :          0 :                         break;
     559                 :            : 
     560                 :            : #if defined(CONFIG_QUOTA)
     561                 :            :                 case Opt_quota:
     562                 :            :                 case Opt_usrquota:
     563                 :          0 :                         set_opt(sbi->s_mount_opt, USRQUOTA);
     564                 :          0 :                         break;
     565                 :            : 
     566                 :            :                 case Opt_grpquota:
     567                 :          0 :                         set_opt(sbi->s_mount_opt, GRPQUOTA);
     568                 :          0 :                         break;
     569                 :            : #else
     570                 :            :                 case Opt_quota:
     571                 :            :                 case Opt_usrquota:
     572                 :            :                 case Opt_grpquota:
     573                 :            :                         ext2_msg(sb, KERN_INFO,
     574                 :            :                                 "quota operations not supported");
     575                 :            :                         break;
     576                 :            : #endif
     577                 :            : 
     578                 :            :                 case Opt_reservation:
     579                 :          0 :                         set_opt(sbi->s_mount_opt, RESERVATION);
     580                 :          0 :                         ext2_msg(sb, KERN_INFO, "reservations ON");
     581                 :          0 :                         break;
     582                 :            :                 case Opt_noreservation:
     583                 :          0 :                         clear_opt(sbi->s_mount_opt, RESERVATION);
     584                 :          0 :                         ext2_msg(sb, KERN_INFO, "reservations OFF");
     585                 :          0 :                         break;
     586                 :            :                 case Opt_ignore:
     587                 :            :                         break;
     588                 :            :                 default:
     589                 :            :                         return 0;
     590                 :            :                 }
     591                 :            :         }
     592                 :            :         return 1;
     593                 :            : }
     594                 :            : 
     595                 :          0 : static int ext2_setup_super (struct super_block * sb,
     596                 :            :                               struct ext2_super_block * es,
     597                 :            :                               int read_only)
     598                 :            : {
     599                 :            :         int res = 0;
     600                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     601                 :            : 
     602         [ #  # ]:          0 :         if (le32_to_cpu(es->s_rev_level) > EXT2_MAX_SUPP_REV) {
     603                 :          0 :                 ext2_msg(sb, KERN_ERR,
     604                 :            :                         "error: revision level too high, "
     605                 :            :                         "forcing read-only mode");
     606                 :            :                 res = MS_RDONLY;
     607                 :            :         }
     608         [ #  # ]:          0 :         if (read_only)
     609                 :            :                 return res;
     610         [ #  # ]:          0 :         if (!(sbi->s_mount_state & EXT2_VALID_FS))
     611                 :          0 :                 ext2_msg(sb, KERN_WARNING,
     612                 :            :                         "warning: mounting unchecked fs, "
     613                 :            :                         "running e2fsck is recommended");
     614         [ #  # ]:          0 :         else if ((sbi->s_mount_state & EXT2_ERROR_FS))
     615                 :          0 :                 ext2_msg(sb, KERN_WARNING,
     616                 :            :                         "warning: mounting fs with errors, "
     617                 :            :                         "running e2fsck is recommended");
     618 [ #  # ][ #  # ]:          0 :         else if ((__s16) le16_to_cpu(es->s_max_mnt_count) >= 0 &&
     619                 :          0 :                  le16_to_cpu(es->s_mnt_count) >=
     620                 :            :                  (unsigned short) (__s16) le16_to_cpu(es->s_max_mnt_count))
     621                 :          0 :                 ext2_msg(sb, KERN_WARNING,
     622                 :            :                         "warning: maximal mount count reached, "
     623                 :            :                         "running e2fsck is recommended");
     624   [ #  #  #  # ]:          0 :         else if (le32_to_cpu(es->s_checkinterval) &&
     625                 :          0 :                 (le32_to_cpu(es->s_lastcheck) +
     626                 :          0 :                         le32_to_cpu(es->s_checkinterval) <= get_seconds()))
     627                 :          0 :                 ext2_msg(sb, KERN_WARNING,
     628                 :            :                         "warning: checktime reached, "
     629                 :            :                         "running e2fsck is recommended");
     630         [ #  # ]:          0 :         if (!le16_to_cpu(es->s_max_mnt_count))
     631                 :          0 :                 es->s_max_mnt_count = cpu_to_le16(EXT2_DFL_MAX_MNT_COUNT);
     632                 :            :         le16_add_cpu(&es->s_mnt_count, 1);
     633         [ #  # ]:          0 :         if (test_opt (sb, DEBUG))
     634                 :          0 :                 ext2_msg(sb, KERN_INFO, "%s, %s, bs=%lu, fs=%lu, gc=%lu, "
     635                 :            :                         "bpg=%lu, ipg=%lu, mo=%04lx]",
     636                 :            :                         EXT2FS_VERSION, EXT2FS_DATE, sb->s_blocksize,
     637                 :            :                         sbi->s_frag_size,
     638                 :            :                         sbi->s_groups_count,
     639                 :            :                         EXT2_BLOCKS_PER_GROUP(sb),
     640                 :            :                         EXT2_INODES_PER_GROUP(sb),
     641                 :            :                         sbi->s_mount_opt);
     642                 :            :         return res;
     643                 :            : }
     644                 :            : 
     645                 :          0 : static int ext2_check_descriptors(struct super_block *sb)
     646                 :            : {
     647                 :            :         int i;
     648                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     649                 :            : 
     650                 :            :         ext2_debug ("Checking group descriptors");
     651                 :            : 
     652         [ #  # ]:          0 :         for (i = 0; i < sbi->s_groups_count; i++) {
     653                 :          0 :                 struct ext2_group_desc *gdp = ext2_get_group_desc(sb, i, NULL);
     654                 :            :                 ext2_fsblk_t first_block = ext2_group_first_block_no(sb, i);
     655                 :            :                 ext2_fsblk_t last_block;
     656                 :            : 
     657         [ #  # ]:          0 :                 if (i == sbi->s_groups_count - 1)
     658                 :          0 :                         last_block = le32_to_cpu(sbi->s_es->s_blocks_count) - 1;
     659                 :            :                 else
     660                 :          0 :                         last_block = first_block +
     661                 :            :                                 (EXT2_BLOCKS_PER_GROUP(sb) - 1);
     662                 :            : 
     663 [ #  # ][ #  # ]:          0 :                 if (le32_to_cpu(gdp->bg_block_bitmap) < first_block ||
     664                 :            :                     le32_to_cpu(gdp->bg_block_bitmap) > last_block)
     665                 :            :                 {
     666                 :          0 :                         ext2_error (sb, "ext2_check_descriptors",
     667                 :            :                                     "Block bitmap for group %d"
     668                 :            :                                     " not in group (block %lu)!",
     669                 :            :                                     i, (unsigned long) le32_to_cpu(gdp->bg_block_bitmap));
     670                 :          0 :                         return 0;
     671                 :            :                 }
     672 [ #  # ][ #  # ]:          0 :                 if (le32_to_cpu(gdp->bg_inode_bitmap) < first_block ||
     673                 :            :                     le32_to_cpu(gdp->bg_inode_bitmap) > last_block)
     674                 :            :                 {
     675                 :          0 :                         ext2_error (sb, "ext2_check_descriptors",
     676                 :            :                                     "Inode bitmap for group %d"
     677                 :            :                                     " not in group (block %lu)!",
     678                 :            :                                     i, (unsigned long) le32_to_cpu(gdp->bg_inode_bitmap));
     679                 :          0 :                         return 0;
     680                 :            :                 }
     681 [ #  # ][ #  # ]:          0 :                 if (le32_to_cpu(gdp->bg_inode_table) < first_block ||
     682                 :          0 :                     le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group - 1 >
     683                 :            :                     last_block)
     684                 :            :                 {
     685                 :          0 :                         ext2_error (sb, "ext2_check_descriptors",
     686                 :            :                                     "Inode table for group %d"
     687                 :            :                                     " not in group (block %lu)!",
     688                 :            :                                     i, (unsigned long) le32_to_cpu(gdp->bg_inode_table));
     689                 :          0 :                         return 0;
     690                 :            :                 }
     691                 :            :         }
     692                 :            :         return 1;
     693                 :            : }
     694                 :            : 
     695                 :            : /*
     696                 :            :  * Maximal file size.  There is a direct, and {,double-,triple-}indirect
     697                 :            :  * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks.
     698                 :            :  * We need to be 1 filesystem block less than the 2^32 sector limit.
     699                 :            :  */
     700                 :          0 : static loff_t ext2_max_size(int bits)
     701                 :            : {
     702                 :            :         loff_t res = EXT2_NDIR_BLOCKS;
     703                 :            :         int meta_blocks;
     704                 :            :         loff_t upper_limit;
     705                 :            : 
     706                 :            :         /* This is calculated to be the largest file size for a
     707                 :            :          * dense, file such that the total number of
     708                 :            :          * sectors in the file, including data and all indirect blocks,
     709                 :            :          * does not exceed 2^32 -1
     710                 :            :          * __u32 i_blocks representing the total number of
     711                 :            :          * 512 bytes blocks of the file
     712                 :            :          */
     713                 :            :         upper_limit = (1LL << 32) - 1;
     714                 :            : 
     715                 :            :         /* total blocks in file system block size */
     716                 :          0 :         upper_limit >>= (bits - 9);
     717                 :            : 
     718                 :            : 
     719                 :            :         /* indirect blocks */
     720                 :            :         meta_blocks = 1;
     721                 :            :         /* double indirect blocks */
     722                 :          0 :         meta_blocks += 1 + (1LL << (bits-2));
     723                 :            :         /* tripple indirect blocks */
     724                 :          0 :         meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2)));
     725                 :            : 
     726                 :          0 :         upper_limit -= meta_blocks;
     727                 :          0 :         upper_limit <<= bits;
     728                 :            : 
     729                 :          0 :         res += 1LL << (bits-2);
     730                 :          0 :         res += 1LL << (2*(bits-2));
     731                 :          0 :         res += 1LL << (3*(bits-2));
     732                 :          0 :         res <<= bits;
     733         [ #  # ]:          0 :         if (res > upper_limit)
     734                 :            :                 res = upper_limit;
     735                 :            : 
     736         [ #  # ]:          0 :         if (res > MAX_LFS_FILESIZE)
     737                 :            :                 res = MAX_LFS_FILESIZE;
     738                 :            : 
     739                 :          0 :         return res;
     740                 :            : }
     741                 :            : 
     742                 :          0 : static unsigned long descriptor_loc(struct super_block *sb,
     743                 :            :                                     unsigned long logic_sb_block,
     744                 :            :                                     int nr)
     745                 :            : {
     746                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
     747                 :            :         unsigned long bg, first_meta_bg;
     748                 :            :         int has_super = 0;
     749                 :            :         
     750                 :          0 :         first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg);
     751                 :            : 
     752 [ #  # ][ #  # ]:          0 :         if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_META_BG) ||
     753                 :          0 :             nr < first_meta_bg)
     754                 :          0 :                 return (logic_sb_block + nr + 1);
     755                 :          0 :         bg = sbi->s_desc_per_block * nr;
     756         [ #  # ]:          0 :         if (ext2_bg_has_super(sb, bg))
     757                 :            :                 has_super = 1;
     758                 :            : 
     759                 :          0 :         return ext2_group_first_block_no(sb, bg) + has_super;
     760                 :            : }
     761                 :            : 
     762                 :          0 : static int ext2_fill_super(struct super_block *sb, void *data, int silent)
     763                 :            : {
     764                 :            :         struct buffer_head * bh;
     765                 :            :         struct ext2_sb_info * sbi;
     766                 :            :         struct ext2_super_block * es;
     767                 :            :         struct inode *root;
     768                 :            :         unsigned long block;
     769                 :          0 :         unsigned long sb_block = get_sb_block(&data);
     770                 :            :         unsigned long logic_sb_block;
     771                 :            :         unsigned long offset = 0;
     772                 :            :         unsigned long def_mount_opts;
     773                 :            :         long ret = -EINVAL;
     774                 :            :         int blocksize = BLOCK_SIZE;
     775                 :            :         int db_count;
     776                 :            :         int i, j;
     777                 :            :         __le32 features;
     778                 :            :         int err;
     779                 :            : 
     780                 :            :         err = -ENOMEM;
     781                 :            :         sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
     782         [ #  # ]:          0 :         if (!sbi)
     783                 :            :                 goto failed;
     784                 :            : 
     785                 :          0 :         sbi->s_blockgroup_lock =
     786                 :            :                 kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
     787         [ #  # ]:          0 :         if (!sbi->s_blockgroup_lock) {
     788                 :          0 :                 kfree(sbi);
     789                 :          0 :                 goto failed;
     790                 :            :         }
     791                 :          0 :         sb->s_fs_info = sbi;
     792                 :          0 :         sbi->s_sb_block = sb_block;
     793                 :            : 
     794                 :          0 :         spin_lock_init(&sbi->s_lock);
     795                 :            : 
     796                 :            :         /*
     797                 :            :          * See what the current blocksize for the device is, and
     798                 :            :          * use that as the blocksize.  Otherwise (or if the blocksize
     799                 :            :          * is smaller than the default) use the default.
     800                 :            :          * This is important for devices that have a hardware
     801                 :            :          * sectorsize that is larger than the default.
     802                 :            :          */
     803                 :          0 :         blocksize = sb_min_blocksize(sb, BLOCK_SIZE);
     804         [ #  # ]:          0 :         if (!blocksize) {
     805                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: unable to set blocksize");
     806                 :          0 :                 goto failed_sbi;
     807                 :            :         }
     808                 :            : 
     809                 :            :         /*
     810                 :            :          * If the superblock doesn't start on a hardware sector boundary,
     811                 :            :          * calculate the offset.  
     812                 :            :          */
     813         [ #  # ]:          0 :         if (blocksize != BLOCK_SIZE) {
     814                 :          0 :                 logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
     815                 :          0 :                 offset = (sb_block*BLOCK_SIZE) % blocksize;
     816                 :            :         } else {
     817                 :            :                 logic_sb_block = sb_block;
     818                 :            :         }
     819                 :            : 
     820         [ #  # ]:          0 :         if (!(bh = sb_bread(sb, logic_sb_block))) {
     821                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: unable to read superblock");
     822                 :          0 :                 goto failed_sbi;
     823                 :            :         }
     824                 :            :         /*
     825                 :            :          * Note: s_es must be initialized as soon as possible because
     826                 :            :          *       some ext2 macro-instructions depend on its value
     827                 :            :          */
     828                 :          0 :         es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
     829                 :          0 :         sbi->s_es = es;
     830                 :          0 :         sb->s_magic = le16_to_cpu(es->s_magic);
     831                 :            : 
     832         [ #  # ]:          0 :         if (sb->s_magic != EXT2_SUPER_MAGIC)
     833                 :            :                 goto cantfind_ext2;
     834                 :            : 
     835                 :            :         /* Set defaults before we parse the mount options */
     836                 :          0 :         def_mount_opts = le32_to_cpu(es->s_default_mount_opts);
     837         [ #  # ]:          0 :         if (def_mount_opts & EXT2_DEFM_DEBUG)
     838                 :          0 :                 set_opt(sbi->s_mount_opt, DEBUG);
     839         [ #  # ]:          0 :         if (def_mount_opts & EXT2_DEFM_BSDGROUPS)
     840                 :          0 :                 set_opt(sbi->s_mount_opt, GRPID);
     841         [ #  # ]:          0 :         if (def_mount_opts & EXT2_DEFM_UID16)
     842                 :          0 :                 set_opt(sbi->s_mount_opt, NO_UID32);
     843                 :            : #ifdef CONFIG_EXT2_FS_XATTR
     844                 :            :         if (def_mount_opts & EXT2_DEFM_XATTR_USER)
     845                 :            :                 set_opt(sbi->s_mount_opt, XATTR_USER);
     846                 :            : #endif
     847                 :            : #ifdef CONFIG_EXT2_FS_POSIX_ACL
     848                 :            :         if (def_mount_opts & EXT2_DEFM_ACL)
     849                 :            :                 set_opt(sbi->s_mount_opt, POSIX_ACL);
     850                 :            : #endif
     851                 :            :         
     852         [ #  # ]:          0 :         if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_PANIC)
     853                 :          0 :                 set_opt(sbi->s_mount_opt, ERRORS_PANIC);
     854         [ #  # ]:          0 :         else if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_CONTINUE)
     855                 :          0 :                 set_opt(sbi->s_mount_opt, ERRORS_CONT);
     856                 :            :         else
     857                 :          0 :                 set_opt(sbi->s_mount_opt, ERRORS_RO);
     858                 :            : 
     859                 :          0 :         sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid));
     860                 :          0 :         sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));
     861                 :            :         
     862                 :          0 :         set_opt(sbi->s_mount_opt, RESERVATION);
     863                 :            : 
     864         [ #  # ]:          0 :         if (!parse_options((char *) data, sb))
     865                 :            :                 goto failed_mount;
     866                 :            : 
     867         [ #  # ]:          0 :         sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
     868                 :          0 :                 ((EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ?
     869                 :            :                  MS_POSIXACL : 0);
     870                 :            : 
     871                 :            :         ext2_xip_verify_sb(sb); /* see if bdev supports xip, unset
     872                 :            :                                     EXT2_MOUNT_XIP if not */
     873                 :            : 
     874 [ #  # ][ #  # ]:          0 :         if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV &&
     875         [ #  # ]:          0 :             (EXT2_HAS_COMPAT_FEATURE(sb, ~0U) ||
     876         [ #  # ]:          0 :              EXT2_HAS_RO_COMPAT_FEATURE(sb, ~0U) ||
     877                 :          0 :              EXT2_HAS_INCOMPAT_FEATURE(sb, ~0U)))
     878                 :          0 :                 ext2_msg(sb, KERN_WARNING,
     879                 :            :                         "warning: feature flags set on rev 0 fs, "
     880                 :            :                         "running e2fsck is recommended");
     881                 :            :         /*
     882                 :            :          * Check feature flags regardless of the revision level, since we
     883                 :            :          * previously didn't change the revision level when setting the flags,
     884                 :            :          * so there is a chance incompat flags are set on a rev 0 filesystem.
     885                 :            :          */
     886                 :          0 :         features = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP);
     887         [ #  # ]:          0 :         if (features) {
     888                 :          0 :                 ext2_msg(sb, KERN_ERR,  "error: couldn't mount because of "
     889                 :            :                        "unsupported optional features (%x)",
     890                 :            :                         le32_to_cpu(features));
     891                 :          0 :                 goto failed_mount;
     892                 :            :         }
     893 [ #  # ][ #  # ]:          0 :         if (!(sb->s_flags & MS_RDONLY) &&
     894                 :          0 :             (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
     895                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: couldn't mount RDWR because of "
     896                 :            :                        "unsupported optional features (%x)",
     897                 :            :                        le32_to_cpu(features));
     898                 :          0 :                 goto failed_mount;
     899                 :            :         }
     900                 :            : 
     901                 :          0 :         blocksize = BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
     902                 :            : 
     903                 :            :         if (ext2_use_xip(sb) && blocksize != PAGE_SIZE) {
     904                 :            :                 if (!silent)
     905                 :            :                         ext2_msg(sb, KERN_ERR,
     906                 :            :                                 "error: unsupported blocksize for xip");
     907                 :            :                 goto failed_mount;
     908                 :            :         }
     909                 :            : 
     910                 :            :         /* If the blocksize doesn't match, re-read the thing.. */
     911         [ #  # ]:          0 :         if (sb->s_blocksize != blocksize) {
     912                 :            :                 brelse(bh);
     913                 :            : 
     914         [ #  # ]:          0 :                 if (!sb_set_blocksize(sb, blocksize)) {
     915                 :          0 :                         ext2_msg(sb, KERN_ERR,
     916                 :            :                                 "error: bad blocksize %d", blocksize);
     917                 :          0 :                         goto failed_sbi;
     918                 :            :                 }
     919                 :            : 
     920                 :          0 :                 logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
     921                 :          0 :                 offset = (sb_block*BLOCK_SIZE) % blocksize;
     922                 :          0 :                 bh = sb_bread(sb, logic_sb_block);
     923         [ #  # ]:          0 :                 if(!bh) {
     924                 :          0 :                         ext2_msg(sb, KERN_ERR, "error: couldn't read"
     925                 :            :                                 "superblock on 2nd try");
     926                 :          0 :                         goto failed_sbi;
     927                 :            :                 }
     928                 :          0 :                 es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
     929                 :          0 :                 sbi->s_es = es;
     930         [ #  # ]:          0 :                 if (es->s_magic != cpu_to_le16(EXT2_SUPER_MAGIC)) {
     931                 :          0 :                         ext2_msg(sb, KERN_ERR, "error: magic mismatch");
     932                 :          0 :                         goto failed_mount;
     933                 :            :                 }
     934                 :            :         }
     935                 :            : 
     936                 :          0 :         sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);
     937                 :          0 :         sb->s_max_links = EXT2_LINK_MAX;
     938                 :            : 
     939         [ #  # ]:          0 :         if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
     940                 :          0 :                 sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
     941                 :          0 :                 sbi->s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
     942                 :            :         } else {
     943                 :          0 :                 sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
     944                 :          0 :                 sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
     945 [ #  # ][ #  # ]:          0 :                 if ((sbi->s_inode_size < EXT2_GOOD_OLD_INODE_SIZE) ||
     946         [ #  # ]:          0 :                     !is_power_of_2(sbi->s_inode_size) ||
     947                 :            :                     (sbi->s_inode_size > blocksize)) {
     948                 :          0 :                         ext2_msg(sb, KERN_ERR,
     949                 :            :                                 "error: unsupported inode size: %d",
     950                 :            :                                 sbi->s_inode_size);
     951                 :          0 :                         goto failed_mount;
     952                 :            :                 }
     953                 :            :         }
     954                 :            : 
     955                 :          0 :         sbi->s_frag_size = EXT2_MIN_FRAG_SIZE <<
     956                 :          0 :                                    le32_to_cpu(es->s_log_frag_size);
     957         [ #  # ]:          0 :         if (sbi->s_frag_size == 0)
     958                 :            :                 goto cantfind_ext2;
     959                 :          0 :         sbi->s_frags_per_block = sb->s_blocksize / sbi->s_frag_size;
     960                 :            : 
     961                 :          0 :         sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
     962                 :          0 :         sbi->s_frags_per_group = le32_to_cpu(es->s_frags_per_group);
     963                 :          0 :         sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
     964                 :            : 
     965         [ #  # ]:          0 :         if (EXT2_INODE_SIZE(sb) == 0)
     966                 :            :                 goto cantfind_ext2;
     967                 :          0 :         sbi->s_inodes_per_block = sb->s_blocksize / EXT2_INODE_SIZE(sb);
     968 [ #  # ][ #  # ]:          0 :         if (sbi->s_inodes_per_block == 0 || sbi->s_inodes_per_group == 0)
     969                 :            :                 goto cantfind_ext2;
     970                 :          0 :         sbi->s_itb_per_group = sbi->s_inodes_per_group /
     971                 :            :                                         sbi->s_inodes_per_block;
     972                 :          0 :         sbi->s_desc_per_block = sb->s_blocksize /
     973                 :            :                                         sizeof (struct ext2_group_desc);
     974                 :          0 :         sbi->s_sbh = bh;
     975                 :          0 :         sbi->s_mount_state = le16_to_cpu(es->s_state);
     976                 :          0 :         sbi->s_addr_per_block_bits =
     977 [ #  # ][ #  # ]:          0 :                 ilog2 (EXT2_ADDR_PER_BLOCK(sb));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     978                 :          0 :         sbi->s_desc_per_block_bits =
     979                 :          0 :                 ilog2 (EXT2_DESC_PER_BLOCK(sb));
     980                 :            : 
     981         [ #  # ]:          0 :         if (sb->s_magic != EXT2_SUPER_MAGIC)
     982                 :            :                 goto cantfind_ext2;
     983                 :            : 
     984         [ #  # ]:          0 :         if (sb->s_blocksize != bh->b_size) {
     985         [ #  # ]:          0 :                 if (!silent)
     986                 :          0 :                         ext2_msg(sb, KERN_ERR, "error: unsupported blocksize");
     987                 :            :                 goto failed_mount;
     988                 :            :         }
     989                 :            : 
     990         [ #  # ]:          0 :         if (sb->s_blocksize != sbi->s_frag_size) {
     991                 :          0 :                 ext2_msg(sb, KERN_ERR,
     992                 :            :                         "error: fragsize %lu != blocksize %lu"
     993                 :            :                         "(not supported yet)",
     994                 :            :                         sbi->s_frag_size, sb->s_blocksize);
     995                 :          0 :                 goto failed_mount;
     996                 :            :         }
     997                 :            : 
     998         [ #  # ]:          0 :         if (sbi->s_blocks_per_group > sb->s_blocksize * 8) {
     999                 :          0 :                 ext2_msg(sb, KERN_ERR,
    1000                 :            :                         "error: #blocks per group too big: %lu",
    1001                 :            :                         sbi->s_blocks_per_group);
    1002                 :          0 :                 goto failed_mount;
    1003                 :            :         }
    1004         [ #  # ]:          0 :         if (sbi->s_frags_per_group > sb->s_blocksize * 8) {
    1005                 :          0 :                 ext2_msg(sb, KERN_ERR,
    1006                 :            :                         "error: #fragments per group too big: %lu",
    1007                 :            :                         sbi->s_frags_per_group);
    1008                 :          0 :                 goto failed_mount;
    1009                 :            :         }
    1010         [ #  # ]:          0 :         if (sbi->s_inodes_per_group > sb->s_blocksize * 8) {
    1011                 :          0 :                 ext2_msg(sb, KERN_ERR,
    1012                 :            :                         "error: #inodes per group too big: %lu",
    1013                 :            :                         sbi->s_inodes_per_group);
    1014                 :          0 :                 goto failed_mount;
    1015                 :            :         }
    1016                 :            : 
    1017         [ #  # ]:          0 :         if (EXT2_BLOCKS_PER_GROUP(sb) == 0)
    1018                 :            :                 goto cantfind_ext2;
    1019                 :          0 :         sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
    1020                 :          0 :                                 le32_to_cpu(es->s_first_data_block) - 1)
    1021                 :          0 :                                         / EXT2_BLOCKS_PER_GROUP(sb)) + 1;
    1022                 :          0 :         db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
    1023                 :            :                    EXT2_DESC_PER_BLOCK(sb);
    1024                 :          0 :         sbi->s_group_desc = kmalloc (db_count * sizeof (struct buffer_head *), GFP_KERNEL);
    1025         [ #  # ]:          0 :         if (sbi->s_group_desc == NULL) {
    1026                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: not enough memory");
    1027                 :          0 :                 goto failed_mount;
    1028                 :            :         }
    1029                 :          0 :         bgl_lock_init(sbi->s_blockgroup_lock);
    1030                 :          0 :         sbi->s_debts = kcalloc(sbi->s_groups_count, sizeof(*sbi->s_debts), GFP_KERNEL);
    1031         [ #  # ]:          0 :         if (!sbi->s_debts) {
    1032                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: not enough memory");
    1033                 :          0 :                 goto failed_mount_group_desc;
    1034                 :            :         }
    1035         [ #  # ]:          0 :         for (i = 0; i < db_count; i++) {
    1036                 :          0 :                 block = descriptor_loc(sb, logic_sb_block, i);
    1037                 :          0 :                 sbi->s_group_desc[i] = sb_bread(sb, block);
    1038         [ #  # ]:          0 :                 if (!sbi->s_group_desc[i]) {
    1039         [ #  # ]:          0 :                         for (j = 0; j < i; j++)
    1040                 :          0 :                                 brelse (sbi->s_group_desc[j]);
    1041                 :          0 :                         ext2_msg(sb, KERN_ERR,
    1042                 :            :                                 "error: unable to read group descriptors");
    1043                 :          0 :                         goto failed_mount_group_desc;
    1044                 :            :                 }
    1045                 :            :         }
    1046         [ #  # ]:          0 :         if (!ext2_check_descriptors (sb)) {
    1047                 :          0 :                 ext2_msg(sb, KERN_ERR, "group descriptors corrupted");
    1048                 :          0 :                 goto failed_mount2;
    1049                 :            :         }
    1050                 :          0 :         sbi->s_gdb_count = db_count;
    1051                 :          0 :         get_random_bytes(&sbi->s_next_generation, sizeof(u32));
    1052                 :          0 :         spin_lock_init(&sbi->s_next_gen_lock);
    1053                 :            : 
    1054                 :            :         /* per fileystem reservation list head & lock */
    1055                 :          0 :         spin_lock_init(&sbi->s_rsv_window_lock);
    1056                 :          0 :         sbi->s_rsv_window_root = RB_ROOT;
    1057                 :            :         /*
    1058                 :            :          * Add a single, static dummy reservation to the start of the
    1059                 :            :          * reservation window list --- it gives us a placeholder for
    1060                 :            :          * append-at-start-of-list which makes the allocation logic
    1061                 :            :          * _much_ simpler.
    1062                 :            :          */
    1063                 :          0 :         sbi->s_rsv_window_head.rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
    1064                 :          0 :         sbi->s_rsv_window_head.rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
    1065                 :          0 :         sbi->s_rsv_window_head.rsv_alloc_hit = 0;
    1066                 :          0 :         sbi->s_rsv_window_head.rsv_goal_size = 0;
    1067                 :          0 :         ext2_rsv_window_add(sb, &sbi->s_rsv_window_head);
    1068                 :            : 
    1069                 :          0 :         err = percpu_counter_init(&sbi->s_freeblocks_counter,
    1070                 :            :                                 ext2_count_free_blocks(sb));
    1071         [ #  # ]:          0 :         if (!err) {
    1072                 :          0 :                 err = percpu_counter_init(&sbi->s_freeinodes_counter,
    1073                 :            :                                 ext2_count_free_inodes(sb));
    1074                 :            :         }
    1075         [ #  # ]:          0 :         if (!err) {
    1076                 :          0 :                 err = percpu_counter_init(&sbi->s_dirs_counter,
    1077                 :            :                                 ext2_count_dirs(sb));
    1078                 :            :         }
    1079         [ #  # ]:          0 :         if (err) {
    1080                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: insufficient memory");
    1081                 :          0 :                 goto failed_mount3;
    1082                 :            :         }
    1083                 :            :         /*
    1084                 :            :          * set up enough so that it can read an inode
    1085                 :            :          */
    1086                 :          0 :         sb->s_op = &ext2_sops;
    1087                 :          0 :         sb->s_export_op = &ext2_export_ops;
    1088                 :          0 :         sb->s_xattr = ext2_xattr_handlers;
    1089                 :            : 
    1090                 :            : #ifdef CONFIG_QUOTA
    1091                 :          0 :         sb->dq_op = &dquot_operations;
    1092                 :          0 :         sb->s_qcop = &dquot_quotactl_ops;
    1093                 :            : #endif
    1094                 :            : 
    1095                 :          0 :         root = ext2_iget(sb, EXT2_ROOT_INO);
    1096         [ #  # ]:          0 :         if (IS_ERR(root)) {
    1097                 :            :                 ret = PTR_ERR(root);
    1098                 :          0 :                 goto failed_mount3;
    1099                 :            :         }
    1100 [ #  # ][ #  # ]:          0 :         if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
                 [ #  # ]
    1101                 :          0 :                 iput(root);
    1102                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: corrupt root inode, run e2fsck");
    1103                 :          0 :                 goto failed_mount3;
    1104                 :            :         }
    1105                 :            : 
    1106                 :          0 :         sb->s_root = d_make_root(root);
    1107         [ #  # ]:          0 :         if (!sb->s_root) {
    1108                 :          0 :                 ext2_msg(sb, KERN_ERR, "error: get root inode failed");
    1109                 :            :                 ret = -ENOMEM;
    1110                 :          0 :                 goto failed_mount3;
    1111                 :            :         }
    1112         [ #  # ]:          0 :         if (EXT2_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL))
    1113                 :          0 :                 ext2_msg(sb, KERN_WARNING,
    1114                 :            :                         "warning: mounting ext3 filesystem as ext2");
    1115         [ #  # ]:          0 :         if (ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY))
    1116                 :          0 :                 sb->s_flags |= MS_RDONLY;
    1117                 :            :         ext2_write_super(sb);
    1118                 :            :         return 0;
    1119                 :            : 
    1120                 :            : cantfind_ext2:
    1121         [ #  # ]:          0 :         if (!silent)
    1122                 :          0 :                 ext2_msg(sb, KERN_ERR,
    1123                 :            :                         "error: can't find an ext2 filesystem on dev %s.",
    1124                 :          0 :                         sb->s_id);
    1125                 :            :         goto failed_mount;
    1126                 :            : failed_mount3:
    1127                 :          0 :         percpu_counter_destroy(&sbi->s_freeblocks_counter);
    1128                 :          0 :         percpu_counter_destroy(&sbi->s_freeinodes_counter);
    1129                 :          0 :         percpu_counter_destroy(&sbi->s_dirs_counter);
    1130                 :            : failed_mount2:
    1131         [ #  # ]:          0 :         for (i = 0; i < db_count; i++)
    1132                 :          0 :                 brelse(sbi->s_group_desc[i]);
    1133                 :            : failed_mount_group_desc:
    1134                 :          0 :         kfree(sbi->s_group_desc);
    1135                 :          0 :         kfree(sbi->s_debts);
    1136                 :            : failed_mount:
    1137                 :            :         brelse(bh);
    1138                 :            : failed_sbi:
    1139                 :          0 :         sb->s_fs_info = NULL;
    1140                 :          0 :         kfree(sbi->s_blockgroup_lock);
    1141                 :          0 :         kfree(sbi);
    1142                 :            : failed:
    1143                 :          0 :         return ret;
    1144                 :            : }
    1145                 :            : 
    1146                 :          0 : static void ext2_clear_super_error(struct super_block *sb)
    1147                 :            : {
    1148                 :          0 :         struct buffer_head *sbh = EXT2_SB(sb)->s_sbh;
    1149                 :            : 
    1150         [ #  # ]:          0 :         if (buffer_write_io_error(sbh)) {
    1151                 :            :                 /*
    1152                 :            :                  * Oh, dear.  A previous attempt to write the
    1153                 :            :                  * superblock failed.  This could happen because the
    1154                 :            :                  * USB device was yanked out.  Or it could happen to
    1155                 :            :                  * be a transient write error and maybe the block will
    1156                 :            :                  * be remapped.  Nothing we can do but to retry the
    1157                 :            :                  * write and hope for the best.
    1158                 :            :                  */
    1159                 :          0 :                 ext2_msg(sb, KERN_ERR,
    1160                 :            :                        "previous I/O error to superblock detected\n");
    1161                 :            :                 clear_buffer_write_io_error(sbh);
    1162                 :            :                 set_buffer_uptodate(sbh);
    1163                 :            :         }
    1164                 :          0 : }
    1165                 :            : 
    1166                 :          0 : static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
    1167                 :            :                             int wait)
    1168                 :            : {
    1169                 :          0 :         ext2_clear_super_error(sb);
    1170                 :            :         spin_lock(&EXT2_SB(sb)->s_lock);
    1171                 :          0 :         es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb));
    1172                 :          0 :         es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb));
    1173                 :          0 :         es->s_wtime = cpu_to_le32(get_seconds());
    1174                 :            :         /* unlock before we do IO */
    1175                 :            :         spin_unlock(&EXT2_SB(sb)->s_lock);
    1176                 :          0 :         mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
    1177         [ #  # ]:          0 :         if (wait)
    1178                 :          0 :                 sync_dirty_buffer(EXT2_SB(sb)->s_sbh);
    1179                 :          0 : }
    1180                 :            : 
    1181                 :            : /*
    1182                 :            :  * In the second extended file system, it is not necessary to
    1183                 :            :  * write the super block since we use a mapping of the
    1184                 :            :  * disk super block in a buffer.
    1185                 :            :  *
    1186                 :            :  * However, this function is still used to set the fs valid
    1187                 :            :  * flags to 0.  We need to set this flag to 0 since the fs
    1188                 :            :  * may have been checked while mounted and e2fsck may have
    1189                 :            :  * set s_state to EXT2_VALID_FS after some corrections.
    1190                 :            :  */
    1191                 :          0 : static int ext2_sync_fs(struct super_block *sb, int wait)
    1192                 :            : {
    1193                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
    1194                 :          0 :         struct ext2_super_block *es = EXT2_SB(sb)->s_es;
    1195                 :            : 
    1196                 :            :         /*
    1197                 :            :          * Write quota structures to quota file, sync_blockdev() will write
    1198                 :            :          * them to disk later
    1199                 :            :          */
    1200                 :          0 :         dquot_writeback_dquots(sb, -1);
    1201                 :            : 
    1202                 :            :         spin_lock(&sbi->s_lock);
    1203         [ #  # ]:          0 :         if (es->s_state & cpu_to_le16(EXT2_VALID_FS)) {
    1204                 :            :                 ext2_debug("setting valid to 0\n");
    1205                 :          0 :                 es->s_state &= cpu_to_le16(~EXT2_VALID_FS);
    1206                 :            :         }
    1207                 :            :         spin_unlock(&sbi->s_lock);
    1208                 :          0 :         ext2_sync_super(sb, es, wait);
    1209                 :          0 :         return 0;
    1210                 :            : }
    1211                 :            : 
    1212                 :          0 : static int ext2_freeze(struct super_block *sb)
    1213                 :            : {
    1214                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
    1215                 :            : 
    1216                 :            :         /*
    1217                 :            :          * Open but unlinked files present? Keep EXT2_VALID_FS flag cleared
    1218                 :            :          * because we have unattached inodes and thus filesystem is not fully
    1219                 :            :          * consistent.
    1220                 :            :          */
    1221         [ #  # ]:          0 :         if (atomic_long_read(&sb->s_remove_count)) {
    1222                 :          0 :                 ext2_sync_fs(sb, 1);
    1223                 :          0 :                 return 0;
    1224                 :            :         }
    1225                 :            :         /* Set EXT2_FS_VALID flag */
    1226                 :            :         spin_lock(&sbi->s_lock);
    1227                 :          0 :         sbi->s_es->s_state = cpu_to_le16(sbi->s_mount_state);
    1228                 :            :         spin_unlock(&sbi->s_lock);
    1229                 :          0 :         ext2_sync_super(sb, sbi->s_es, 1);
    1230                 :            : 
    1231                 :          0 :         return 0;
    1232                 :            : }
    1233                 :            : 
    1234                 :          0 : static int ext2_unfreeze(struct super_block *sb)
    1235                 :            : {
    1236                 :            :         /* Just write sb to clear EXT2_VALID_FS flag */
    1237                 :            :         ext2_write_super(sb);
    1238                 :            : 
    1239                 :          0 :         return 0;
    1240                 :            : }
    1241                 :            : 
    1242                 :          0 : void ext2_write_super(struct super_block *sb)
    1243                 :            : {
    1244 [ #  # ][ #  # ]:          0 :         if (!(sb->s_flags & MS_RDONLY))
         [ #  # ][ #  # ]
    1245                 :          0 :                 ext2_sync_fs(sb, 1);
    1246                 :          0 : }
    1247                 :            : 
    1248                 :          0 : static int ext2_remount (struct super_block * sb, int * flags, char * data)
    1249                 :            : {
    1250                 :            :         struct ext2_sb_info * sbi = EXT2_SB(sb);
    1251                 :            :         struct ext2_super_block * es;
    1252                 :          0 :         unsigned long old_mount_opt = sbi->s_mount_opt;
    1253                 :            :         struct ext2_mount_options old_opts;
    1254                 :            :         unsigned long old_sb_flags;
    1255                 :            :         int err;
    1256                 :            : 
    1257                 :            :         spin_lock(&sbi->s_lock);
    1258                 :            : 
    1259                 :            :         /* Store the old options */
    1260                 :          0 :         old_sb_flags = sb->s_flags;
    1261                 :          0 :         old_opts.s_mount_opt = sbi->s_mount_opt;
    1262                 :          0 :         old_opts.s_resuid = sbi->s_resuid;
    1263                 :          0 :         old_opts.s_resgid = sbi->s_resgid;
    1264                 :            : 
    1265                 :            :         /*
    1266                 :            :          * Allow the "check" option to be passed as a remount option.
    1267                 :            :          */
    1268         [ #  # ]:          0 :         if (!parse_options(data, sb)) {
    1269                 :            :                 err = -EINVAL;
    1270                 :            :                 goto restore_opts;
    1271                 :            :         }
    1272                 :            : 
    1273         [ #  # ]:          0 :         sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
    1274                 :          0 :                 ((sbi->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
    1275                 :            : 
    1276                 :            :         ext2_xip_verify_sb(sb); /* see if bdev supports xip, unset
    1277                 :            :                                     EXT2_MOUNT_XIP if not */
    1278                 :            : 
    1279                 :            :         if ((ext2_use_xip(sb)) && (sb->s_blocksize != PAGE_SIZE)) {
    1280                 :            :                 ext2_msg(sb, KERN_WARNING,
    1281                 :            :                         "warning: unsupported blocksize for xip");
    1282                 :            :                 err = -EINVAL;
    1283                 :            :                 goto restore_opts;
    1284                 :            :         }
    1285                 :            : 
    1286                 :          0 :         es = sbi->s_es;
    1287         [ #  # ]:          0 :         if ((sbi->s_mount_opt ^ old_mount_opt) & EXT2_MOUNT_XIP) {
    1288                 :          0 :                 ext2_msg(sb, KERN_WARNING, "warning: refusing change of "
    1289                 :            :                          "xip flag with busy inodes while remounting");
    1290                 :          0 :                 sbi->s_mount_opt &= ~EXT2_MOUNT_XIP;
    1291                 :          0 :                 sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP;
    1292                 :            :         }
    1293         [ #  # ]:          0 :         if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
    1294                 :            :                 spin_unlock(&sbi->s_lock);
    1295                 :          0 :                 return 0;
    1296                 :            :         }
    1297         [ #  # ]:          0 :         if (*flags & MS_RDONLY) {
    1298 [ #  # ][ #  # ]:          0 :                 if (le16_to_cpu(es->s_state) & EXT2_VALID_FS ||
    1299                 :          0 :                     !(sbi->s_mount_state & EXT2_VALID_FS)) {
    1300                 :            :                         spin_unlock(&sbi->s_lock);
    1301                 :          0 :                         return 0;
    1302                 :            :                 }
    1303                 :            : 
    1304                 :            :                 /*
    1305                 :            :                  * OK, we are remounting a valid rw partition rdonly, so set
    1306                 :            :                  * the rdonly flag and then mark the partition as valid again.
    1307                 :            :                  */
    1308                 :          0 :                 es->s_state = cpu_to_le16(sbi->s_mount_state);
    1309                 :          0 :                 es->s_mtime = cpu_to_le32(get_seconds());
    1310                 :            :                 spin_unlock(&sbi->s_lock);
    1311                 :            : 
    1312                 :            :                 err = dquot_suspend(sb, -1);
    1313         [ #  # ]:          0 :                 if (err < 0) {
    1314                 :            :                         spin_lock(&sbi->s_lock);
    1315                 :            :                         goto restore_opts;
    1316                 :            :                 }
    1317                 :            : 
    1318                 :          0 :                 ext2_sync_super(sb, es, 1);
    1319                 :            :         } else {
    1320                 :          0 :                 __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
    1321                 :            :                                                ~EXT2_FEATURE_RO_COMPAT_SUPP);
    1322         [ #  # ]:          0 :                 if (ret) {
    1323                 :          0 :                         ext2_msg(sb, KERN_WARNING,
    1324                 :            :                                 "warning: couldn't remount RDWR because of "
    1325                 :            :                                 "unsupported optional features (%x).",
    1326                 :            :                                 le32_to_cpu(ret));
    1327                 :            :                         err = -EROFS;
    1328                 :          0 :                         goto restore_opts;
    1329                 :            :                 }
    1330                 :            :                 /*
    1331                 :            :                  * Mounting a RDONLY partition read-write, so reread and
    1332                 :            :                  * store the current valid flag.  (It may have been changed
    1333                 :            :                  * by e2fsck since we originally mounted the partition.)
    1334                 :            :                  */
    1335                 :          0 :                 sbi->s_mount_state = le16_to_cpu(es->s_state);
    1336         [ #  # ]:          0 :                 if (!ext2_setup_super (sb, es, 0))
    1337                 :          0 :                         sb->s_flags &= ~MS_RDONLY;
    1338                 :            :                 spin_unlock(&sbi->s_lock);
    1339                 :            : 
    1340                 :            :                 ext2_write_super(sb);
    1341                 :            : 
    1342                 :          0 :                 dquot_resume(sb, -1);
    1343                 :            :         }
    1344                 :            : 
    1345                 :            :         return 0;
    1346                 :            : restore_opts:
    1347                 :          0 :         sbi->s_mount_opt = old_opts.s_mount_opt;
    1348                 :          0 :         sbi->s_resuid = old_opts.s_resuid;
    1349                 :          0 :         sbi->s_resgid = old_opts.s_resgid;
    1350                 :          0 :         sb->s_flags = old_sb_flags;
    1351                 :            :         spin_unlock(&sbi->s_lock);
    1352                 :          0 :         return err;
    1353                 :            : }
    1354                 :            : 
    1355                 :          0 : static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)
    1356                 :            : {
    1357                 :          0 :         struct super_block *sb = dentry->d_sb;
    1358                 :            :         struct ext2_sb_info *sbi = EXT2_SB(sb);
    1359                 :          0 :         struct ext2_super_block *es = sbi->s_es;
    1360                 :            :         u64 fsid;
    1361                 :            : 
    1362                 :            :         spin_lock(&sbi->s_lock);
    1363                 :            : 
    1364         [ #  # ]:          0 :         if (test_opt (sb, MINIX_DF))
    1365                 :          0 :                 sbi->s_overhead_last = 0;
    1366         [ #  # ]:          0 :         else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {
    1367                 :            :                 unsigned long i, overhead = 0;
    1368                 :          0 :                 smp_rmb();
    1369                 :            : 
    1370                 :            :                 /*
    1371                 :            :                  * Compute the overhead (FS structures). This is constant
    1372                 :            :                  * for a given filesystem unless the number of block groups
    1373                 :            :                  * changes so we cache the previous value until it does.
    1374                 :            :                  */
    1375                 :            : 
    1376                 :            :                 /*
    1377                 :            :                  * All of the blocks before first_data_block are
    1378                 :            :                  * overhead
    1379                 :            :                  */
    1380                 :          0 :                 overhead = le32_to_cpu(es->s_first_data_block);
    1381                 :            : 
    1382                 :            :                 /*
    1383                 :            :                  * Add the overhead attributed to the superblock and
    1384                 :            :                  * block group descriptors.  If the sparse superblocks
    1385                 :            :                  * feature is turned on, then not all groups have this.
    1386                 :            :                  */
    1387         [ #  # ]:          0 :                 for (i = 0; i < sbi->s_groups_count; i++)
    1388                 :          0 :                         overhead += ext2_bg_has_super(sb, i) +
    1389                 :          0 :                                 ext2_bg_num_gdb(sb, i);
    1390                 :            : 
    1391                 :            :                 /*
    1392                 :            :                  * Every block group has an inode bitmap, a block
    1393                 :            :                  * bitmap, and an inode table.
    1394                 :            :                  */
    1395                 :          0 :                 overhead += (sbi->s_groups_count *
    1396                 :          0 :                              (2 + sbi->s_itb_per_group));
    1397                 :          0 :                 sbi->s_overhead_last = overhead;
    1398                 :          0 :                 smp_wmb();
    1399                 :          0 :                 sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
    1400                 :            :         }
    1401                 :            : 
    1402                 :          0 :         buf->f_type = EXT2_SUPER_MAGIC;
    1403                 :          0 :         buf->f_bsize = sb->s_blocksize;
    1404                 :          0 :         buf->f_blocks = le32_to_cpu(es->s_blocks_count) - sbi->s_overhead_last;
    1405                 :          0 :         buf->f_bfree = ext2_count_free_blocks(sb);
    1406                 :          0 :         es->s_free_blocks_count = cpu_to_le32(buf->f_bfree);
    1407                 :          0 :         buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);
    1408         [ #  # ]:          0 :         if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count))
    1409                 :          0 :                 buf->f_bavail = 0;
    1410                 :          0 :         buf->f_files = le32_to_cpu(es->s_inodes_count);
    1411                 :          0 :         buf->f_ffree = ext2_count_free_inodes(sb);
    1412                 :          0 :         es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
    1413                 :          0 :         buf->f_namelen = EXT2_NAME_LEN;
    1414                 :          0 :         fsid = le64_to_cpup((void *)es->s_uuid) ^
    1415                 :          0 :                le64_to_cpup((void *)es->s_uuid + sizeof(u64));
    1416                 :          0 :         buf->f_fsid.val[0] = fsid & 0xFFFFFFFFUL;
    1417                 :          0 :         buf->f_fsid.val[1] = (fsid >> 32) & 0xFFFFFFFFUL;
    1418                 :            :         spin_unlock(&sbi->s_lock);
    1419                 :          0 :         return 0;
    1420                 :            : }
    1421                 :            : 
    1422                 :          0 : static struct dentry *ext2_mount(struct file_system_type *fs_type,
    1423                 :            :         int flags, const char *dev_name, void *data)
    1424                 :            : {
    1425                 :          0 :         return mount_bdev(fs_type, flags, dev_name, data, ext2_fill_super);
    1426                 :            : }
    1427                 :            : 
    1428                 :            : #ifdef CONFIG_QUOTA
    1429                 :            : 
    1430                 :            : /* Read data from quotafile - avoid pagecache and such because we cannot afford
    1431                 :            :  * acquiring the locks... As quota files are never truncated and quota code
    1432                 :            :  * itself serializes the operations (and no one else should touch the files)
    1433                 :            :  * we don't have to be afraid of races */
    1434                 :          0 : static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data,
    1435                 :            :                                size_t len, loff_t off)
    1436                 :            : {
    1437                 :          0 :         struct inode *inode = sb_dqopt(sb)->files[type];
    1438                 :          0 :         sector_t blk = off >> EXT2_BLOCK_SIZE_BITS(sb);
    1439                 :            :         int err = 0;
    1440                 :          0 :         int offset = off & (sb->s_blocksize - 1);
    1441                 :            :         int tocopy;
    1442                 :            :         size_t toread;
    1443                 :            :         struct buffer_head tmp_bh;
    1444                 :            :         struct buffer_head *bh;
    1445                 :            :         loff_t i_size = i_size_read(inode);
    1446                 :            : 
    1447         [ #  # ]:          0 :         if (off > i_size)
    1448                 :            :                 return 0;
    1449         [ #  # ]:          0 :         if (off+len > i_size)
    1450                 :          0 :                 len = i_size-off;
    1451                 :            :         toread = len;
    1452         [ #  # ]:          0 :         while (toread > 0) {
    1453                 :            :                 tocopy = sb->s_blocksize - offset < toread ?
    1454                 :          0 :                                 sb->s_blocksize - offset : toread;
    1455                 :            : 
    1456                 :          0 :                 tmp_bh.b_state = 0;
    1457                 :          0 :                 tmp_bh.b_size = sb->s_blocksize;
    1458                 :          0 :                 err = ext2_get_block(inode, blk, &tmp_bh, 0);
    1459         [ #  # ]:          0 :                 if (err < 0)
    1460                 :            :                         return err;
    1461         [ #  # ]:          0 :                 if (!buffer_mapped(&tmp_bh))        /* A hole? */
    1462         [ #  # ]:          0 :                         memset(data, 0, tocopy);
    1463                 :            :                 else {
    1464                 :          0 :                         bh = sb_bread(sb, tmp_bh.b_blocknr);
    1465         [ #  # ]:          0 :                         if (!bh)
    1466                 :            :                                 return -EIO;
    1467                 :          0 :                         memcpy(data, bh->b_data+offset, tocopy);
    1468                 :            :                         brelse(bh);
    1469                 :            :                 }
    1470                 :            :                 offset = 0;
    1471                 :          0 :                 toread -= tocopy;
    1472                 :          0 :                 data += tocopy;
    1473                 :          0 :                 blk++;
    1474                 :            :         }
    1475                 :          0 :         return len;
    1476                 :            : }
    1477                 :            : 
    1478                 :            : /* Write to quotafile */
    1479                 :          0 : static ssize_t ext2_quota_write(struct super_block *sb, int type,
    1480                 :            :                                 const char *data, size_t len, loff_t off)
    1481                 :            : {
    1482                 :          0 :         struct inode *inode = sb_dqopt(sb)->files[type];
    1483                 :          0 :         sector_t blk = off >> EXT2_BLOCK_SIZE_BITS(sb);
    1484                 :            :         int err = 0;
    1485                 :          0 :         int offset = off & (sb->s_blocksize - 1);
    1486                 :            :         int tocopy;
    1487                 :            :         size_t towrite = len;
    1488                 :            :         struct buffer_head tmp_bh;
    1489                 :            :         struct buffer_head *bh;
    1490                 :            : 
    1491         [ #  # ]:          0 :         while (towrite > 0) {
    1492                 :            :                 tocopy = sb->s_blocksize - offset < towrite ?
    1493                 :          0 :                                 sb->s_blocksize - offset : towrite;
    1494                 :            : 
    1495                 :          0 :                 tmp_bh.b_state = 0;
    1496                 :          0 :                 tmp_bh.b_size = sb->s_blocksize;
    1497                 :          0 :                 err = ext2_get_block(inode, blk, &tmp_bh, 1);
    1498         [ #  # ]:          0 :                 if (err < 0)
    1499                 :            :                         goto out;
    1500 [ #  # ][ #  # ]:          0 :                 if (offset || tocopy != EXT2_BLOCK_SIZE(sb))
    1501                 :          0 :                         bh = sb_bread(sb, tmp_bh.b_blocknr);
    1502                 :            :                 else
    1503                 :          0 :                         bh = sb_getblk(sb, tmp_bh.b_blocknr);
    1504         [ #  # ]:          0 :                 if (unlikely(!bh)) {
    1505                 :            :                         err = -EIO;
    1506                 :            :                         goto out;
    1507                 :            :                 }
    1508                 :            :                 lock_buffer(bh);
    1509                 :          0 :                 memcpy(bh->b_data+offset, data, tocopy);
    1510                 :          0 :                 flush_dcache_page(bh->b_page);
    1511                 :            :                 set_buffer_uptodate(bh);
    1512                 :          0 :                 mark_buffer_dirty(bh);
    1513                 :          0 :                 unlock_buffer(bh);
    1514                 :            :                 brelse(bh);
    1515                 :            :                 offset = 0;
    1516                 :          0 :                 towrite -= tocopy;
    1517                 :          0 :                 data += tocopy;
    1518                 :          0 :                 blk++;
    1519                 :            :         }
    1520                 :            : out:
    1521         [ #  # ]:          0 :         if (len == towrite)
    1522                 :            :                 return err;
    1523         [ #  # ]:          0 :         if (inode->i_size < off+len-towrite)
    1524                 :            :                 i_size_write(inode, off+len-towrite);
    1525                 :          0 :         inode->i_version++;
    1526                 :          0 :         inode->i_mtime = inode->i_ctime = CURRENT_TIME;
    1527                 :            :         mark_inode_dirty(inode);
    1528                 :          0 :         return len - towrite;
    1529                 :            : }
    1530                 :            : 
    1531                 :            : #endif
    1532                 :            : 
    1533                 :            : static struct file_system_type ext2_fs_type = {
    1534                 :            :         .owner          = THIS_MODULE,
    1535                 :            :         .name           = "ext2",
    1536                 :            :         .mount          = ext2_mount,
    1537                 :            :         .kill_sb        = kill_block_super,
    1538                 :            :         .fs_flags       = FS_REQUIRES_DEV,
    1539                 :            : };
    1540                 :            : MODULE_ALIAS_FS("ext2");
    1541                 :            : 
    1542                 :          0 : static int __init init_ext2_fs(void)
    1543                 :            : {
    1544                 :            :         int err = init_ext2_xattr();
    1545                 :            :         if (err)
    1546                 :            :                 return err;
    1547                 :          0 :         err = init_inodecache();
    1548         [ #  # ]:          0 :         if (err)
    1549                 :            :                 goto out1;
    1550                 :          0 :         err = register_filesystem(&ext2_fs_type);
    1551         [ #  # ]:          0 :         if (err)
    1552                 :            :                 goto out;
    1553                 :            :         return 0;
    1554                 :            : out:
    1555                 :            :         destroy_inodecache();
    1556                 :            : out1:
    1557                 :            :         exit_ext2_xattr();
    1558                 :          0 :         return err;
    1559                 :            : }
    1560                 :            : 
    1561                 :          0 : static void __exit exit_ext2_fs(void)
    1562                 :            : {
    1563                 :          0 :         unregister_filesystem(&ext2_fs_type);
    1564                 :            :         destroy_inodecache();
    1565                 :            :         exit_ext2_xattr();
    1566                 :          0 : }
    1567                 :            : 
    1568                 :            : MODULE_AUTHOR("Remy Card and others");
    1569                 :            : MODULE_DESCRIPTION("Second Extended Filesystem");
    1570                 :            : MODULE_LICENSE("GPL");
    1571                 :            : module_init(init_ext2_fs)
    1572                 :            : module_exit(exit_ext2_fs)

Generated by: LCOV version 1.9