static void nilfs_set_error(struct nilfs_sb_info *sbi)
 {
        struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_super_block **sbp;
 
        down_write(&nilfs->ns_sem);
        if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) {
                nilfs->ns_mount_state |= NILFS_ERROR_FS;
-               nilfs->ns_sbp[0]->s_state |= cpu_to_le16(NILFS_ERROR_FS);
-               nilfs_commit_super(sbi, 1);
+               sbp = nilfs_prepare_super(sbi);
+               if (likely(sbp)) {
+                       sbp[0]->s_state |= cpu_to_le16(NILFS_ERROR_FS);
+                       nilfs_commit_super(sbi, 1);
+               }
        }
        up_write(&nilfs->ns_sem);
 }
        spin_unlock(&nilfs->ns_last_segment_lock);
 }
 
-int nilfs_commit_super(struct nilfs_sb_info *sbi, int dupsb)
+struct nilfs_super_block **nilfs_prepare_super(struct nilfs_sb_info *sbi)
 {
        struct the_nilfs *nilfs = sbi->s_nilfs;
        struct nilfs_super_block **sbp = nilfs->ns_sbp;
-       time_t t;
 
-       /* nilfs->sem must be locked by the caller. */
+       /* nilfs->ns_sem must be locked by the caller. */
        if (sbp[0]->s_magic != cpu_to_le16(NILFS_SUPER_MAGIC)) {
-               if (sbp[1] && sbp[1]->s_magic == cpu_to_le16(NILFS_SUPER_MAGIC))
+               if (sbp[1] &&
+                   sbp[1]->s_magic == cpu_to_le16(NILFS_SUPER_MAGIC)) {
                        nilfs_swap_super_block(nilfs);
-               else {
+               } else {
                        printk(KERN_CRIT "NILFS: superblock broke on dev %s\n",
                               sbi->s_super->s_id);
-                       return -EIO;
+                       return NULL;
                }
        }
+       return sbp;
+}
+
+int nilfs_commit_super(struct nilfs_sb_info *sbi, int dupsb)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_super_block **sbp = nilfs->ns_sbp;
+       time_t t;
+
+       /* nilfs->ns_sem must be locked by the caller. */
        nilfs_set_log_cursor(sbp[0], nilfs);
 
        t = get_seconds();
  */
 int nilfs_cleanup_super(struct nilfs_sb_info *sbi)
 {
-       struct nilfs_super_block **sbp = sbi->s_nilfs->ns_sbp;
-       int ret;
+       struct nilfs_super_block **sbp;
+       int ret = -EIO;
 
-       sbp[0]->s_state = cpu_to_le16(sbi->s_nilfs->ns_mount_state);
-       ret = nilfs_commit_super(sbi, 1);
+       sbp = nilfs_prepare_super(sbi);
+       if (sbp) {
+               sbp[0]->s_state = cpu_to_le16(sbi->s_nilfs->ns_mount_state);
+               ret = nilfs_commit_super(sbi, 1);
+       }
        return ret;
 }
 
 {
        struct nilfs_sb_info *sbi = NILFS_SB(sb);
        struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_super_block **sbp;
        int err = 0;
 
        /* This function is called when super block should be written back */
                err = nilfs_construct_segment(sb);
 
        down_write(&nilfs->ns_sem);
-       if (nilfs_sb_dirty(nilfs))
-               nilfs_commit_super(sbi, 1);
+       if (nilfs_sb_dirty(nilfs)) {
+               sbp = nilfs_prepare_super(sbi);
+               if (likely(sbp))
+                       nilfs_commit_super(sbi, 1);
+       }
        up_write(&nilfs->ns_sem);
 
        return err;
 static int nilfs_setup_super(struct nilfs_sb_info *sbi)
 {
        struct the_nilfs *nilfs = sbi->s_nilfs;
-       struct nilfs_super_block *sbp = nilfs->ns_sbp[0];
-       int max_mnt_count = le16_to_cpu(sbp->s_max_mnt_count);
-       int mnt_count = le16_to_cpu(sbp->s_mnt_count);
+       struct nilfs_super_block **sbp;
+       int max_mnt_count;
+       int mnt_count;
+
+       /* nilfs->ns_sem must be locked by the caller. */
+       sbp = nilfs_prepare_super(sbi);
+       if (!sbp)
+               return -EIO;
+
+       max_mnt_count = le16_to_cpu(sbp[0]->s_max_mnt_count);
+       mnt_count = le16_to_cpu(sbp[0]->s_mnt_count);
 
-       /* nilfs->sem must be locked by the caller. */
        if (nilfs->ns_mount_state & NILFS_ERROR_FS) {
                printk(KERN_WARNING
                       "NILFS warning: mounting fs with errors\n");
 #endif
        }
        if (!max_mnt_count)
-               sbp->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT);
+               sbp[0]->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT);
 
-       sbp->s_mnt_count = cpu_to_le16(mnt_count + 1);
-       sbp->s_state = cpu_to_le16(le16_to_cpu(sbp->s_state) & ~NILFS_VALID_FS);
-       sbp->s_mtime = cpu_to_le64(get_seconds());
+       sbp[0]->s_mnt_count = cpu_to_le16(mnt_count + 1);
+       sbp[0]->s_state =
+               cpu_to_le16(le16_to_cpu(sbp[0]->s_state) & ~NILFS_VALID_FS);
+       sbp[0]->s_mtime = cpu_to_le64(get_seconds());
        return nilfs_commit_super(sbi, 1);
 }