.compat_ioctl   = ext4_compat_ioctl,
  #endif
        .fsync          = ext4_sync_file,
 -      .open           = ext4_dir_open,
        .release        = ext4_release_dir,
  };
- 
- #ifdef CONFIG_UNICODE
- const struct dentry_operations ext4_dentry_ops = {
-       .d_hash = generic_ci_d_hash,
-       .d_compare = generic_ci_d_compare,
- };
- #endif
 
        f2fs_submit_merged_write(sbi, META_FLUSH);
  }
  
 -      return bdev->bd_part ?
 -              (u64)part_stat_read(bdev->bd_part, sectors[STAT_WRITE]) : 0;
+ static inline u64 get_sectors_written(struct block_device *bdev)
+ {
++      return (u64)part_stat_read(bdev, sectors[STAT_WRITE]);
+ }
+ 
+ u64 f2fs_get_sectors_written(struct f2fs_sb_info *sbi)
+ {
+       if (f2fs_is_multi_device(sbi)) {
+               u64 sectors = 0;
+               int i;
+ 
+               for (i = 0; i < sbi->s_ndevs; i++)
+                       sectors += get_sectors_written(FDEV(i).bdev);
+ 
+               return sectors;
+       }
+ 
+       return get_sectors_written(sbi->sb->s_bdev);
+ }
+ 
  static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
  {
        struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
 
  static ssize_t lifetime_write_kbytes_show(struct f2fs_attr *a,
                struct f2fs_sb_info *sbi, char *buf)
  {
 -      struct super_block *sb = sbi->sb;
 -
 -      if (!sb->s_bdev->bd_part)
 -              return sprintf(buf, "0\n");
 -
        return sprintf(buf, "%llu\n",
                        (unsigned long long)(sbi->kbytes_written +
-                       BD_PART_WRITTEN(sbi)));
+                       ((f2fs_get_sectors_written(sbi) -
+                               sbi->sectors_written_start) >> 1)));
  }
  
  static ssize_t features_show(struct f2fs_attr *a,
 
   *
   * Prepare for ->lookup() in a directory which may be encrypted by determining
   * the name that will actually be used to search the directory on-disk.  If the
 - * directory's encryption key is available, then the lookup is assumed to be by
 - * plaintext name; otherwise, it is assumed to be by no-key name.
 + * directory's encryption policy is supported by this kernel and its encryption
 + * key is available, then the lookup is assumed to be by plaintext name;
 + * otherwise, it is assumed to be by no-key name.
   *
-  * This also installs a custom ->d_revalidate() method which will invalidate the
-  * dentry if it was created without the key and the key is later added.
+  * This will set DCACHE_NOKEY_NAME on the dentry if the lookup is by no-key
+  * name.  In this case the filesystem must assign the dentry a dentry_operations
+  * which contains fscrypt_d_revalidate (or contains a d_revalidate method that
+  * calls fscrypt_d_revalidate), so that the dentry will be invalidated if the
+  * directory's encryption key is later added.
   *
   * Return: 0 on success; -ENOENT if the directory's key is unavailable but the
   * filename isn't a valid no-key name, so a negative dentry should be created;