All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/11] fs/ntfs3: Bugfix and refactoring
@ 2023-02-15 13:33 Konstantin Komarov
  2023-02-15 13:34 ` [PATCH 01/11] fs/ntfs3: Use bh_read to simplify code Konstantin Komarov
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:33 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

This series contains various fixes and refactoring for ntfs3.
Added error output on failed mount. Reworked some other error messages.

Konstantin Komarov (11):
   fs/ntfs3: Use bh_read to simplify code
   fs/ntfs3: Remove noacsrules
   fs/ntfs3: Fix ntfs_create_inode()
   fs/ntfs3: Optimization in ntfs_set_state()
   fs/ntfs3: Undo endian changes
   fs/ntfs3: Undo critial modificatins to keep directory consistency
   fs/ntfs3: Remove field sbi->used.bitmap.set_tail
   fs/ntfs3: Changed ntfs_get_acl() to use dentry
   fs/ntfs3: Code formatting and refactoring
   fs/ntfs3: Add missed "nocase" in ntfs_show_options
   fs/ntfs3: Print details about mount fails

  Documentation/filesystems/ntfs3.rst |  11 --
  fs/ntfs3/attrib.c                   |  17 +-
  fs/ntfs3/bitmap.c                   |  22 +--
  fs/ntfs3/file.c                     |  50 ++---
  fs/ntfs3/frecord.c                  |  39 ++--
  fs/ntfs3/fslog.c                    |  77 ++++----
  fs/ntfs3/fsntfs.c                   |  73 +++----
  fs/ntfs3/index.c                    |  58 +++---
  fs/ntfs3/inode.c                    | 118 +++++------
  fs/ntfs3/lznt.c                     |  10 +-
  fs/ntfs3/namei.c                    |   9 +-
  fs/ntfs3/ntfs_fs.h                  |  16 +-
  fs/ntfs3/record.c                   |   9 +-
  fs/ntfs3/run.c                      |   6 +-
  fs/ntfs3/super.c                    | 291 ++++++++++++++++------------
  fs/ntfs3/xattr.c                    |  64 +++---
  16 files changed, 435 insertions(+), 435 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 01/11] fs/ntfs3: Use bh_read to simplify code
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
@ 2023-02-15 13:34 ` Konstantin Komarov
  2023-02-15 13:34 ` [PATCH 02/11] fs/ntfs3: Remove noacsrules Konstantin Komarov
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:34 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

The duplicating code is replaced by a generic function bh_read()

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/file.c  | 10 ++--------
  fs/ntfs3/inode.c |  1 +
  2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index d294cd975688..d37df7376543 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -223,16 +223,10 @@ static int ntfs_zero_range(struct inode *inode, 
u64 vbo, u64 vbo_to)
                  set_buffer_uptodate(bh);

              if (!buffer_uptodate(bh)) {
-                lock_buffer(bh);
-                bh->b_end_io = end_buffer_read_sync;
-                get_bh(bh);
-                submit_bh(REQ_OP_READ, bh);
-
-                wait_on_buffer(bh);
-                if (!buffer_uptodate(bh)) {
+                err = bh_read(bh, 0);
+                if (err < 0) {
                      unlock_page(page);
                      put_page(page);
-                    err = -EIO;
                      goto out;
                  }
              }
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index e80e94325467..5e06299591ed 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -648,6 +648,7 @@ static noinline int ntfs_get_block_vbo(struct inode 
*inode, u64 vbo,
              bh->b_size = block_size;
              off = vbo & (PAGE_SIZE - 1);
              set_bh_page(bh, page, off);
+
              err = bh_read(bh, 0);
              if (err < 0)
                  goto out;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 02/11] fs/ntfs3: Remove noacsrules
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
  2023-02-15 13:34 ` [PATCH 01/11] fs/ntfs3: Use bh_read to simplify code Konstantin Komarov
@ 2023-02-15 13:34 ` Konstantin Komarov
  2023-02-15 13:35 ` [PATCH 03/11] fs/ntfs3: Fix ntfs_create_inode() Konstantin Komarov
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:34 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Currently, this option does not work properly. Its use leads to unstable 
results.
If we figure out how to implement it without errors, we will add it later.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  Documentation/filesystems/ntfs3.rst | 11 -----------
  fs/ntfs3/file.c                     | 11 -----------
  fs/ntfs3/inode.c                    |  1 -
  fs/ntfs3/namei.c                    |  1 -
  fs/ntfs3/ntfs_fs.h                  |  3 ---
  fs/ntfs3/super.c                    |  9 +--------
  fs/ntfs3/xattr.c                    | 14 --------------
  7 files changed, 1 insertion(+), 49 deletions(-)

diff --git a/Documentation/filesystems/ntfs3.rst 
b/Documentation/filesystems/ntfs3.rst
index 5aa102bd72c2..f0cf05cad2ba 100644
--- a/Documentation/filesystems/ntfs3.rst
+++ b/Documentation/filesystems/ntfs3.rst
@@ -61,17 +61,6 @@ this table marked with no it means default is without 
**no**.
         directories, fmask applies only to files and dmask only to 
directories.
     * - fmask=

-   * - noacsrules
-     - "No access rules" mount option sets access rights for 
files/folders to
-       777 and owner/group to root. This mount option absorbs all other
-       permissions.
-
-       - Permissions change for files/folders will be reported as 
successful,
-     but they will remain 777.
-
-       - Owner/group change will be reported as successful, butthey 
will stay
-     as root.
-
     * - nohidden
       - Files with the Windows-specific HIDDEN (FILE_ATTRIBUTE_HIDDEN) 
attribute
         will not be shown under Linux.
diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index d37df7376543..9cef189fc0c5 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -654,22 +654,12 @@ static long ntfs_fallocate(struct file *file, int 
mode, loff_t vbo, loff_t len)
  int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry 
*dentry,
            struct iattr *attr)
  {
-    struct super_block *sb = dentry->d_sb;
-    struct ntfs_sb_info *sbi = sb->s_fs_info;
      struct inode *inode = d_inode(dentry);
      struct ntfs_inode *ni = ntfs_i(inode);
      u32 ia_valid = attr->ia_valid;
      umode_t mode = inode->i_mode;
      int err;

-    if (sbi->options->noacsrules) {
-        /* "No access rules" - Force any changes of time etc. */
-        attr->ia_valid |= ATTR_FORCE;
-        /* and disable for editing some attributes. */
-        attr->ia_valid &= ~(ATTR_UID | ATTR_GID | ATTR_MODE);
-        ia_valid = attr->ia_valid;
-    }
-
      err = setattr_prepare(mnt_userns, dentry, attr);
      if (err)
          goto out;
@@ -1153,7 +1143,6 @@ const struct inode_operations 
ntfs_file_inode_operations = {
      .getattr    = ntfs_getattr,
      .setattr    = ntfs3_setattr,
      .listxattr    = ntfs_listxattr,
-    .permission    = ntfs_permission,
      .get_inode_acl    = ntfs_get_acl,
      .set_acl    = ntfs_set_acl,
      .fiemap        = ntfs_fiemap,
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 5e06299591ed..51e342ad79fd 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -2070,7 +2070,6 @@ const struct inode_operations 
ntfs_link_inode_operations = {
      .get_link    = ntfs_get_link,
      .setattr    = ntfs3_setattr,
      .listxattr    = ntfs_listxattr,
-    .permission    = ntfs_permission,
  };

  const struct address_space_operations ntfs_aops = {
diff --git a/fs/ntfs3/namei.c b/fs/ntfs3/namei.c
index 53ddea219e37..5d5fe2f1f77c 100644
--- a/fs/ntfs3/namei.c
+++ b/fs/ntfs3/namei.c
@@ -607,7 +607,6 @@ const struct inode_operations 
ntfs_dir_inode_operations = {
      .rmdir        = ntfs_rmdir,
      .mknod        = ntfs_mknod,
      .rename        = ntfs_rename,
-    .permission    = ntfs_permission,
      .get_inode_acl    = ntfs_get_acl,
      .set_acl    = ntfs_set_acl,
      .setattr    = ntfs3_setattr,
diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index 2050eb3f6a5a..556b76f526cb 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -100,7 +100,6 @@ struct ntfs_mount_options {
      unsigned hide_dot_files : 1; /* Set hidden flag on dot files. */
      unsigned windows_names : 1; /* Disallow names forbidden by Windows. */
      unsigned force : 1; /* RW mount dirty volume. */
-    unsigned noacsrules : 1; /* Exclude acs rules. */
      unsigned prealloc : 1; /* Preallocate space when file is growing. */
      unsigned nocase : 1; /* case insensitive. */
  };
@@ -868,8 +867,6 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, 
struct inode *inode,
  #endif

  int ntfs_acl_chmod(struct user_namespace *mnt_userns, struct dentry 
*dentry);
-int ntfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
-            int mask);
  ssize_t ntfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
  extern const struct xattr_handler *ntfs_xattr_handlers[];

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 19d0889b131f..10c019ef7da3 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -253,7 +253,6 @@ enum Opt {
      Opt_acl,
      Opt_iocharset,
      Opt_prealloc,
-    Opt_noacsrules,
      Opt_nocase,
      Opt_err,
  };
@@ -274,7 +273,6 @@ static const struct fs_parameter_spec 
ntfs_fs_parameters[] = {
      fsparam_flag_no("acl",            Opt_acl),
      fsparam_flag_no("showmeta",        Opt_showmeta),
      fsparam_flag_no("prealloc",        Opt_prealloc),
-    fsparam_flag_no("acsrules",        Opt_noacsrules),
      fsparam_flag_no("nocase",        Opt_nocase),
      fsparam_string("iocharset",        Opt_iocharset),
      {}
@@ -387,9 +385,6 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
      case Opt_prealloc:
          opts->prealloc = result.negated ? 0 : 1;
          break;
-    case Opt_noacsrules:
-        opts->noacsrules = result.negated ? 1 : 0;
-        break;
      case Opt_nocase:
          opts->nocase = result.negated ? 1 : 0;
          break;
@@ -572,8 +567,6 @@ static int ntfs_show_options(struct seq_file *m, 
struct dentry *root)
          seq_puts(m, ",hide_dot_files");
      if (opts->force)
          seq_puts(m, ",force");
-    if (opts->noacsrules)
-        seq_puts(m, ",noacsrules");
      if (opts->prealloc)
          seq_puts(m, ",prealloc");
      if (sb->s_flags & SB_POSIXACL)
@@ -791,7 +784,7 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      if (boot_sector_size != sector_size) {
          ntfs_warn(
              sb,
-            "Different NTFS' sector size (%u) and media sector size (%u)",
+            "Different NTFS sector size (%u) and media sector size (%u)",
              boot_sector_size, sector_size);
          dev_size += sector_size - 1;
      }
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
index 3fa48c8f68d9..c42fbc56eb39 100644
--- a/fs/ntfs3/xattr.c
+++ b/fs/ntfs3/xattr.c
@@ -711,20 +711,6 @@ int ntfs_acl_chmod(struct user_namespace 
*mnt_userns, struct dentry *dentry)
      return posix_acl_chmod(mnt_userns, dentry, inode->i_mode);
  }

-/*
- * ntfs_permission - inode_operations::permission
- */
-int ntfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
-            int mask)
-{
-    if (ntfs_sb(inode->i_sb)->options->noacsrules) {
-        /* "No access rules" mode - Allow all changes. */
-        return 0;
-    }
-
-    return generic_permission(mnt_userns, inode, mask);
-}
-
  /*
   * ntfs_listxattr - inode_operations::listxattr
   */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 03/11] fs/ntfs3: Fix ntfs_create_inode()
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
  2023-02-15 13:34 ` [PATCH 01/11] fs/ntfs3: Use bh_read to simplify code Konstantin Komarov
  2023-02-15 13:34 ` [PATCH 02/11] fs/ntfs3: Remove noacsrules Konstantin Komarov
@ 2023-02-15 13:35 ` Konstantin Komarov
  2023-02-15 13:36 ` [PATCH 04/11] fs/ntfs3: Optimization in ntfs_set_state() Konstantin Komarov
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:35 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Previous variant creates an inode that requires update the parent directory
(ea_packed_size). Operations in ntfs_create_inode have been rearranged
so we insert new directory entry with correct ea_packed_size and
new created inode does not require update it's parent directory.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/file.c    |  2 +-
  fs/ntfs3/inode.c   | 83 ++++++++++++++++++++++++----------------------
  fs/ntfs3/ntfs_fs.h |  2 +-
  fs/ntfs3/xattr.c   | 20 ++++++-----
  4 files changed, 58 insertions(+), 49 deletions(-)

diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index 9cef189fc0c5..df7b76d1c127 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -703,7 +703,7 @@ int ntfs3_setattr(struct user_namespace *mnt_userns, 
struct dentry *dentry,
      }

      if (ia_valid & (ATTR_UID | ATTR_GID | ATTR_MODE))
-        ntfs_save_wsl_perm(inode);
+        ntfs_save_wsl_perm(inode, NULL);
      mark_inode_dirty(inode);
  out:
      return err;
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 51e342ad79fd..752ad17685c0 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -1320,8 +1320,7 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      inode_init_owner(mnt_userns, inode, dir, mode);
      mode = inode->i_mode;

-    inode->i_atime = inode->i_mtime = inode->i_ctime = ni->i_crtime =
-        current_time(inode);
+    ni->i_crtime = current_time(inode);

      rec = ni->mi.mrec;
      rec->hard_links = cpu_to_le16(1);
@@ -1362,10 +1361,9 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      attr->res.data_size = cpu_to_le32(dsize);

      std5->cr_time = std5->m_time = std5->c_time = std5->a_time =
-        kernel2nt(&inode->i_atime);
+        kernel2nt(&ni->i_crtime);

-    ni->std_fa = fa;
-    std5->fa = fa;
+    std5->fa = ni->std_fa = fa;

      attr = Add2Ptr(attr, asize);

@@ -1564,11 +1562,15 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
              }

              asize = SIZEOF_NONRESIDENT + ALIGN(err, 8);
+            /* Write non resident data. */
+            err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rp,
+                        nsize, 0);
+            if (err)
+                goto out5;
          } else {
              attr->res.data_off = SIZEOF_RESIDENT_LE;
              attr->res.data_size = cpu_to_le32(nsize);
              memcpy(Add2Ptr(attr, SIZEOF_RESIDENT), rp, nsize);
-            nsize = 0;
          }
          /* Size of symlink equals the length of input string. */
          inode->i_size = size;
@@ -1589,19 +1591,8 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      rec->used = cpu_to_le32(PtrOffset(rec, attr) + 8);
      rec->next_attr_id = cpu_to_le16(aid);

-    /* Step 2: Add new name in index. */
-    err = indx_insert_entry(&dir_ni->dir, dir_ni, new_de, sbi, fnd, 0);
-    if (err)
-        goto out6;
-
-    /* Unlock parent directory before ntfs_init_acl. */
-    if (!fnd)
-        ni_unlock(dir_ni);
-
      inode->i_generation = le16_to_cpu(rec->seq);

-    dir->i_mtime = dir->i_ctime = inode->i_atime;
-
      if (S_ISDIR(mode)) {
          inode->i_op = &ntfs_dir_inode_operations;
          inode->i_fop = &ntfs_dir_operations;
@@ -1626,41 +1617,58 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      if (!S_ISLNK(mode) && (sb->s_flags & SB_POSIXACL)) {
          err = ntfs_init_acl(mnt_userns, inode, dir);
          if (err)
-            goto out7;
+            goto out5;
      } else
  #endif
      {
          inode->i_flags |= S_NOSEC;
      }

-    /* Write non resident data. */
-    if (nsize) {
-        err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rp, nsize, 0);
-        if (err)
-            goto out7;
+    /*
+     * ntfs_init_acl and ntfs_save_wsl_perm update extended attribute.
+     * The packed size of extended attribute is stored in direntry too.
+     * 'fname' here points to inside new_de.
+     */
+    ntfs_save_wsl_perm(inode, &fname->dup.ea_size);
+
+    /*
+     * update ea_size in file_name attribute too.
+     * Use ni_find_attr cause layout of MFT record may be changed
+     * in ntfs_init_acl and ntfs_save_wsl_perm.
+     */
+    attr = ni_find_attr(ni, NULL, NULL, ATTR_NAME, NULL, 0, NULL, NULL);
+    if (attr) {
+        struct ATTR_FILE_NAME *fn;
+
+        fn = resident_data_ex(attr, SIZEOF_ATTRIBUTE_FILENAME);
+        if (fn)
+            fn->dup.ea_size = fname->dup.ea_size;
      }

+    /* We do not need to update parent directory later */
+    ni->ni_flags &= ~NI_FLAG_UPDATE_PARENT;
+
+    /* Step 2: Add new name in index. */
+    err = indx_insert_entry(&dir_ni->dir, dir_ni, new_de, sbi, fnd, 0);
+    if (err)
+        goto out6;
+
      /*
       * Call 'd_instantiate' after inode->i_op is set
       * but before finish_open.
       */
      d_instantiate(dentry, inode);

-    ntfs_save_wsl_perm(inode);
+    /* Set original time. inode times (i_ctime) may be changed in 
ntfs_init_acl. */
+    inode->i_atime = inode->i_mtime = inode->i_ctime = dir->i_mtime =
+        dir->i_ctime = ni->i_crtime;
+
      mark_inode_dirty(dir);
      mark_inode_dirty(inode);

      /* Normal exit. */
      goto out2;

-out7:
-
-    /* Undo 'indx_insert_entry'. */
-    if (!fnd)
-        ni_lock_dir(dir_ni);
-    indx_delete_entry(&dir_ni->dir, dir_ni, new_de + 1,
-              le16_to_cpu(new_de->key_size), sbi);
-    /* ni_unlock(dir_ni); will be called later. */
  out6:
      if (rp_inserted)
          ntfs_remove_reparse(sbi, IO_REPARSE_TAG_SYMLINK, &new_de->ref);
@@ -1682,11 +1690,11 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      kfree(rp);

  out1:
-    if (err) {
-        if (!fnd)
-            ni_unlock(dir_ni);
+    if (!fnd)
+        ni_unlock(dir_ni);
+
+    if (err)
          return ERR_PTR(err);
-    }

      unlock_new_inode(inode);

@@ -1783,9 +1791,6 @@ void ntfs_evict_inode(struct inode *inode)
  {
      truncate_inode_pages_final(&inode->i_data);

-    if (inode->i_nlink)
-        _ni_write_inode(inode, inode_needs_sync(inode));
-
      invalidate_inode_buffers(inode);
      clear_inode(inode);

diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index 556b76f526cb..73a639716b45 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -870,7 +870,7 @@ int ntfs_acl_chmod(struct user_namespace 
*mnt_userns, struct dentry *dentry);
  ssize_t ntfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
  extern const struct xattr_handler *ntfs_xattr_handlers[];

-int ntfs_save_wsl_perm(struct inode *inode);
+int ntfs_save_wsl_perm(struct inode *inode, __le16 *ea_size);
  void ntfs_get_wsl_perm(struct inode *inode);

  /* globals from lznt.c */
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
index c42fbc56eb39..e7a66225361d 100644
--- a/fs/ntfs3/xattr.c
+++ b/fs/ntfs3/xattr.c
@@ -296,7 +296,8 @@ static int ntfs_get_ea(struct inode *inode, const 
char *name, size_t name_len,

  static noinline int ntfs_set_ea(struct inode *inode, const char *name,
                  size_t name_len, const void *value,
-                size_t val_size, int flags, bool locked)
+                size_t val_size, int flags, bool locked,
+                __le16 *ea_size)
  {
      struct ntfs_inode *ni = ntfs_i(inode);
      struct ntfs_sb_info *sbi = ni->mi.sbi;
@@ -504,6 +505,8 @@ static noinline int ntfs_set_ea(struct inode *inode, 
const char *name,

      if (ea_info.size_pack != size_pack)
          ni->ni_flags |= NI_FLAG_UPDATE_PARENT;
+    if (ea_size)
+        *ea_size = ea_info.size_pack;
      mark_inode_dirty(&ni->vfs_inode);

  out:
@@ -633,7 +636,7 @@ static noinline int ntfs_set_acl_ex(struct 
user_namespace *mnt_userns,
          flags = 0;
      }

-    err = ntfs_set_ea(inode, name, name_len, value, size, flags, 0);
+    err = ntfs_set_ea(inode, name, name_len, value, size, flags, 0, NULL);
      if (err == -ENODATA && !size)
          err = 0; /* Removing non existed xattr. */
      if (!err) {
@@ -923,7 +926,8 @@ static noinline int ntfs_setxattr(const struct 
xattr_handler *handler,
      }

      /* Deal with NTFS extended attribute. */
-    err = ntfs_set_ea(inode, name, strlen(name), value, size, flags, 0);
+    err = ntfs_set_ea(inode, name, strlen(name), value, size, flags, 0,
+              NULL);

  out:
      inode->i_ctime = current_time(inode);
@@ -937,7 +941,7 @@ static noinline int ntfs_setxattr(const struct 
xattr_handler *handler,
   *
   * save uid/gid/mode in xattr
   */
-int ntfs_save_wsl_perm(struct inode *inode)
+int ntfs_save_wsl_perm(struct inode *inode, __le16 *ea_size)
  {
      int err;
      __le32 value;
@@ -946,26 +950,26 @@ int ntfs_save_wsl_perm(struct inode *inode)
      ni_lock(ni);
      value = cpu_to_le32(i_uid_read(inode));
      err = ntfs_set_ea(inode, "$LXUID", sizeof("$LXUID") - 1, &value,
-              sizeof(value), 0, true); /* true == already locked. */
+              sizeof(value), 0, true, ea_size);
      if (err)
          goto out;

      value = cpu_to_le32(i_gid_read(inode));
      err = ntfs_set_ea(inode, "$LXGID", sizeof("$LXGID") - 1, &value,
-              sizeof(value), 0, true);
+              sizeof(value), 0, true, ea_size);
      if (err)
          goto out;

      value = cpu_to_le32(inode->i_mode);
      err = ntfs_set_ea(inode, "$LXMOD", sizeof("$LXMOD") - 1, &value,
-              sizeof(value), 0, true);
+              sizeof(value), 0, true, ea_size);
      if (err)
          goto out;

      if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
          value = cpu_to_le32(inode->i_rdev);
          err = ntfs_set_ea(inode, "$LXDEV", sizeof("$LXDEV") - 1, &value,
-                  sizeof(value), 0, true);
+                  sizeof(value), 0, true, ea_size);
          if (err)
              goto out;
      }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 04/11] fs/ntfs3: Optimization in ntfs_set_state()
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (2 preceding siblings ...)
  2023-02-15 13:35 ` [PATCH 03/11] fs/ntfs3: Fix ntfs_create_inode() Konstantin Komarov
@ 2023-02-15 13:36 ` Konstantin Komarov
  2023-02-15 13:36 ` [PATCH 05/11] fs/ntfs3: Undo endian changes Konstantin Komarov
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:36 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

The current volume flags are updated only if VOLUME_FLAG_DIRTY has been 
changed.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/fsntfs.c | 9 +++++++--
  1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
index 342938704cfd..d888ba14237f 100644
--- a/fs/ntfs3/fsntfs.c
+++ b/fs/ntfs3/fsntfs.c
@@ -925,6 +925,7 @@ int ntfs_set_state(struct ntfs_sb_info *sbi, enum 
NTFS_DIRTY_FLAGS dirty)
      struct VOLUME_INFO *info;
      struct mft_inode *mi;
      struct ntfs_inode *ni;
+    __le16 info_flags;

      /*
       * Do not change state if fs was real_dirty.
@@ -957,6 +958,8 @@ int ntfs_set_state(struct ntfs_sb_info *sbi, enum 
NTFS_DIRTY_FLAGS dirty)
          goto out;
      }

+    info_flags = info->flags;
+
      switch (dirty) {
      case NTFS_DIRTY_ERROR:
          ntfs_notice(sbi->sb, "Mark volume as dirty due to NTFS errors");
@@ -970,8 +973,10 @@ int ntfs_set_state(struct ntfs_sb_info *sbi, enum 
NTFS_DIRTY_FLAGS dirty)
          break;
      }
      /* Cache current volume flags. */
-    sbi->volume.flags = info->flags;
-    mi->dirty = true;
+    if (info_flags != info->flags) {
+        sbi->volume.flags = info->flags;
+        mi->dirty = true;
+    }
      err = 0;

  out:
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 05/11] fs/ntfs3: Undo endian changes
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (3 preceding siblings ...)
  2023-02-15 13:36 ` [PATCH 04/11] fs/ntfs3: Optimization in ntfs_set_state() Konstantin Komarov
@ 2023-02-15 13:36 ` Konstantin Komarov
  2023-02-15 13:37 ` [PATCH 06/11] fs/ntfs3: Undo critial modificatins to keep directory consistency Konstantin Komarov
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:36 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

sbi->mft.reserved_bitmap is in-memory (not on-disk!) bitmap.
Assumed cpu endian is faster than fixed endian.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/fsntfs.c | 11 +++++------
  1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
index d888ba14237f..9ed9dd0d8edf 100644
--- a/fs/ntfs3/fsntfs.c
+++ b/fs/ntfs3/fsntfs.c
@@ -646,13 +646,13 @@ int ntfs_look_free_mft(struct ntfs_sb_info *sbi, 
CLST *rno, bool mft,
                           NULL, 0, NULL, NULL))
                      goto next;

-                __clear_bit_le(ir - MFT_REC_RESERVED,
+                __clear_bit(ir - MFT_REC_RESERVED,
                          &sbi->mft.reserved_bitmap);
              }
          }

          /* Scan 5 bits for zero. Bit 0 == MFT_REC_RESERVED */
-        zbit = find_next_zero_bit_le(&sbi->mft.reserved_bitmap,
+        zbit = find_next_zero_bit(&sbi->mft.reserved_bitmap,
                        MFT_REC_FREE, MFT_REC_RESERVED);
          if (zbit >= MFT_REC_FREE) {
              sbi->mft.next_reserved = MFT_REC_FREE;
@@ -720,7 +720,7 @@ int ntfs_look_free_mft(struct ntfs_sb_info *sbi, 
CLST *rno, bool mft,
      if (*rno >= MFT_REC_FREE)
          wnd_set_used(wnd, *rno, 1);
      else if (*rno >= MFT_REC_RESERVED && sbi->mft.reserved_bitmap_inited)
-        __set_bit_le(*rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap);
+        __set_bit(*rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap);

  out:
      if (!mft)
@@ -748,7 +748,7 @@ void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, 
CLST rno, bool is_mft)
          else
              wnd_set_free(wnd, rno, 1);
      } else if (rno >= MFT_REC_RESERVED && 
sbi->mft.reserved_bitmap_inited) {
-        __clear_bit_le(rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap);
+        __clear_bit(rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap);
      }

      if (rno < wnd_zone_bit(wnd))
@@ -846,9 +846,8 @@ void ntfs_update_mftmirr(struct ntfs_sb_info *sbi, 
int wait)
  {
      int err;
      struct super_block *sb = sbi->sb;
-    u32 blocksize;
+    u32 blocksize, bytes;
      sector_t block1, block2;
-    u32 bytes;

      if (!sb)
          return;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 06/11] fs/ntfs3: Undo critial modificatins to keep directory consistency
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (4 preceding siblings ...)
  2023-02-15 13:36 ` [PATCH 05/11] fs/ntfs3: Undo endian changes Konstantin Komarov
@ 2023-02-15 13:37 ` Konstantin Komarov
  2023-02-15 13:38 ` [PATCH 07/11] fs/ntfs3: Remove field sbi->used.bitmap.set_tail Konstantin Komarov
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:37 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Affect xfstest 320.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/index.c | 30 ++++++++++++++++++++----------
  1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c
index 9fefeac5fe7e..5d1ec0124137 100644
--- a/fs/ntfs3/index.c
+++ b/fs/ntfs3/index.c
@@ -1778,10 +1778,11 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
      struct indx_node *n1 = fnd->nodes[level];
      struct INDEX_HDR *hdr1 = &n1->index->ihdr;
      struct INDEX_HDR *hdr2;
-    u32 to_copy, used;
+    u32 to_copy, used, used1;
      CLST new_vbn;
      __le64 t_vbn, *sub_vbn;
      u16 sp_size;
+    void *hdr1_saved = NULL;

      /* Try the most easy case. */
      e = fnd->level - 1 == level ? fnd->de[level] : NULL;
@@ -1814,6 +1815,13 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
          return -ENOMEM;
      memcpy(up_e, sp, sp_size);

+    used1 = le32_to_cpu(hdr1->used);
+    hdr1_saved = kmemdup(hdr1, used1, GFP_NOFS);
+    if (!hdr1_saved) {
+        err = -ENOMEM;
+        goto out;
+    }
+
      if (!hdr1->flags) {
          up_e->flags |= NTFS_IE_HAS_SUBNODES;
          up_e->size = cpu_to_le16(sp_size + sizeof(u64));
@@ -1846,7 +1854,7 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
      hdr_insert_head(hdr2, de_t, to_copy);

      /* Remove all entries (sp including) from hdr1. */
-    used = le32_to_cpu(hdr1->used) - to_copy - sp_size;
+    used = used1 - to_copy - sp_size;
      memmove(de_t, Add2Ptr(sp, sp_size), used - le32_to_cpu(hdr1->de_off));
      hdr1->used = cpu_to_le32(used);

@@ -1876,8 +1884,6 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
      if (!level) {
          /* Insert in root. */
          err = indx_insert_into_root(indx, ni, up_e, NULL, ctx, fnd, 0);
-        if (err)
-            goto out;
      } else {
          /*
           * The target buffer's parent is another index buffer.
@@ -1885,12 +1891,20 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
           */
          err = indx_insert_into_buffer(indx, ni, root, up_e, ctx,
                            level - 1, fnd);
-        if (err)
-            goto out;
+    }
+
+    if (err) {
+        /*
+         * Undo critical operations.
+         */
+        indx_mark_free(indx, ni, new_vbn >> indx->idx2vbn_bits);
+        memcpy(hdr1, hdr1_saved, used1);
+        indx_write(indx, ni, n1, 0);
      }

  out:
      kfree(up_e);
+    kfree(hdr1_saved);

      return err;
  }
@@ -1949,16 +1963,12 @@ int indx_insert_entry(struct ntfs_index *indx, 
struct ntfs_inode *ni,
           */
          err = indx_insert_into_root(indx, ni, new_de, fnd->root_de, ctx,
                          fnd, undo);
-        if (err)
-            goto out;
      } else {
          /*
           * Found a leaf buffer, so we'll insert the new entry into it.
           */
          err = indx_insert_into_buffer(indx, ni, root, new_de, ctx,
                            fnd->level - 1, fnd);
-        if (err)
-            goto out;
      }

  out:
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 07/11] fs/ntfs3: Remove field sbi->used.bitmap.set_tail
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (5 preceding siblings ...)
  2023-02-15 13:37 ` [PATCH 06/11] fs/ntfs3: Undo critial modificatins to keep directory consistency Konstantin Komarov
@ 2023-02-15 13:38 ` Konstantin Komarov
  2023-02-15 13:38 ` [PATCH 08/11] fs/ntfs3: Changed ntfs_get_acl() to use dentry Konstantin Komarov
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:38 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

This field is not used in driver.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/ntfs_fs.h | 1 -
  fs/ntfs3/super.c   | 2 --
  2 files changed, 3 deletions(-)

diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index 73a639716b45..26957dbfe471 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -163,7 +163,6 @@ struct wnd_bitmap {
      size_t zone_bit;
      size_t zone_end;

-    bool set_tail; // Not necessary in driver.
      bool inited;
  };

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 10c019ef7da3..d7bec9b28a42 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -1117,8 +1117,6 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
          goto put_inode_out;
      }

-    /* Not necessary. */
-    sbi->used.bitmap.set_tail = true;
      err = wnd_init(&sbi->used.bitmap, sb, tt);
      if (err)
          goto put_inode_out;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 08/11] fs/ntfs3: Changed ntfs_get_acl() to use dentry
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (6 preceding siblings ...)
  2023-02-15 13:38 ` [PATCH 07/11] fs/ntfs3: Remove field sbi->used.bitmap.set_tail Konstantin Komarov
@ 2023-02-15 13:38 ` Konstantin Komarov
  2023-02-15 13:39 ` [PATCH 09/11] fs/ntfs3: Code formatting and refactoring Konstantin Komarov
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:38 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

ntfs_get_acl changed to match new interface in struct inode_operations.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/file.c    |  2 +-
  fs/ntfs3/namei.c   |  4 ++--
  fs/ntfs3/ntfs_fs.h |  3 ++-
  fs/ntfs3/xattr.c   | 26 +++++++++-----------------
  4 files changed, 14 insertions(+), 21 deletions(-)

diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index df7b76d1c127..09b7931e6be3 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -1143,7 +1143,7 @@ const struct inode_operations 
ntfs_file_inode_operations = {
      .getattr    = ntfs_getattr,
      .setattr    = ntfs3_setattr,
      .listxattr    = ntfs_listxattr,
-    .get_inode_acl    = ntfs_get_acl,
+    .get_acl    = ntfs_get_acl,
      .set_acl    = ntfs_set_acl,
      .fiemap        = ntfs_fiemap,
  };
diff --git a/fs/ntfs3/namei.c b/fs/ntfs3/namei.c
index 5d5fe2f1f77c..8b68ead5cc1f 100644
--- a/fs/ntfs3/namei.c
+++ b/fs/ntfs3/namei.c
@@ -607,7 +607,7 @@ const struct inode_operations 
ntfs_dir_inode_operations = {
      .rmdir        = ntfs_rmdir,
      .mknod        = ntfs_mknod,
      .rename        = ntfs_rename,
-    .get_inode_acl    = ntfs_get_acl,
+    .get_acl    = ntfs_get_acl,
      .set_acl    = ntfs_set_acl,
      .setattr    = ntfs3_setattr,
      .getattr    = ntfs_getattr,
@@ -620,7 +620,7 @@ const struct inode_operations 
ntfs_special_inode_operations = {
      .setattr    = ntfs3_setattr,
      .getattr    = ntfs_getattr,
      .listxattr    = ntfs_listxattr,
-    .get_inode_acl    = ntfs_get_acl,
+    .get_acl    = ntfs_get_acl,
      .set_acl    = ntfs_set_acl,
  };

diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index 26957dbfe471..b7782107ce8a 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -855,7 +855,8 @@ unsigned long ntfs_names_hash(const u16 *name, 
size_t len, const u16 *upcase,

  /* globals from xattr.c */
  #ifdef CONFIG_NTFS3_FS_POSIX_ACL
-struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu);
+struct posix_acl *ntfs_get_acl(struct user_namespace *mnt_userns,
+         struct dentry *dentry, int type);
  int ntfs_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
           struct posix_acl *acl, int type);
  int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
index e7a66225361d..95c479d7ebba 100644
--- a/fs/ntfs3/xattr.c
+++ b/fs/ntfs3/xattr.c
@@ -520,9 +520,14 @@ static noinline int ntfs_set_ea(struct inode 
*inode, const char *name,
  }

  #ifdef CONFIG_NTFS3_FS_POSIX_ACL
-static struct posix_acl *ntfs_get_acl_ex(struct inode *inode, int type,
-                     int locked)
+
+/*
+ * ntfs_get_acl - inode_operations::get_acl
+ */
+struct posix_acl *ntfs_get_acl(struct user_namespace *mnt_userns,
+                   struct dentry *dentry, int type)
  {
+    struct inode *inode = d_inode(dentry);
      struct ntfs_inode *ni = ntfs_i(inode);
      const char *name;
      size_t name_len;
@@ -545,13 +550,11 @@ static struct posix_acl *ntfs_get_acl_ex(struct 
inode *inode, int type,
          name_len = sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1;
      }

-    if (!locked)
-        ni_lock(ni);
+    ni_lock(ni);

      err = ntfs_get_ea(inode, name, name_len, buf, PATH_MAX, &req);

-    if (!locked)
-        ni_unlock(ni);
+    ni_unlock(ni);

      /* Translate extended attribute to acl. */
      if (err >= 0) {
@@ -570,17 +573,6 @@ static struct posix_acl *ntfs_get_acl_ex(struct 
inode *inode, int type,
      return acl;
  }

-/*
- * ntfs_get_acl - inode_operations::get_acl
- */
-struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu)
-{
-    if (rcu)
-        return ERR_PTR(-ECHILD);
-
-    return ntfs_get_acl_ex(inode, type, 0);
-}
-
  static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
                      struct inode *inode, struct posix_acl *acl,
                      int type, bool init_acl)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 09/11] fs/ntfs3: Code formatting and refactoring
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (7 preceding siblings ...)
  2023-02-15 13:38 ` [PATCH 08/11] fs/ntfs3: Changed ntfs_get_acl() to use dentry Konstantin Komarov
@ 2023-02-15 13:39 ` Konstantin Komarov
  2023-02-15 13:39 ` [PATCH 10/11] fs/ntfs3: Add missed "nocase" in ntfs_show_options Konstantin Komarov
  2023-02-15 13:40 ` [PATCH 11/11] fs/ntfs3: Print details about mount fails Konstantin Komarov
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:39 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Added minor refactoring.
Added and fixed some comments.
In some places, the code has been reformatted to fit into 80 columns.
clang-format-12 was used to format code according kernel's .clang-format.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/attrib.c  | 17 +++++-----
  fs/ntfs3/bitmap.c  | 22 ++++++-------
  fs/ntfs3/file.c    | 25 ++++++++-------
  fs/ntfs3/frecord.c | 37 ++++++++++------------
  fs/ntfs3/fslog.c   | 77 +++++++++++++++++++++++-----------------------
  fs/ntfs3/fsntfs.c  | 13 ++++----
  fs/ntfs3/index.c   | 28 +++++++++--------
  fs/ntfs3/inode.c   | 33 ++++++++++----------
  fs/ntfs3/lznt.c    | 10 +++---
  fs/ntfs3/namei.c   |  4 +--
  fs/ntfs3/ntfs_fs.h |  9 +++---
  fs/ntfs3/record.c  |  9 +++---
  fs/ntfs3/run.c     |  6 ++--
  fs/ntfs3/super.c   | 70 ++++++++++++++++++++++-------------------
  fs/ntfs3/xattr.c   |  4 +--
  15 files changed, 186 insertions(+), 178 deletions(-)

diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
index 5e6bafb10f42..0b8bc66377db 100644
--- a/fs/ntfs3/attrib.c
+++ b/fs/ntfs3/attrib.c
@@ -405,8 +405,8 @@ int attr_set_size(struct ntfs_inode *ni, enum 
ATTR_TYPE type,
      int err = 0;
      struct ntfs_sb_info *sbi = ni->mi.sbi;
      u8 cluster_bits = sbi->cluster_bits;
-    bool is_mft =
-        ni->mi.rno == MFT_REC_MFT && type == ATTR_DATA && !name_len;
+    bool is_mft = ni->mi.rno == MFT_REC_MFT && type == ATTR_DATA &&
+              !name_len;
      u64 old_valid, old_size, old_alloc, new_alloc, new_alloc_tmp;
      struct ATTRIB *attr = NULL, *attr_b;
      struct ATTR_LIST_ENTRY *le, *le_b;
@@ -531,11 +531,10 @@ int attr_set_size(struct ntfs_inode *ni, enum 
ATTR_TYPE type,
              pre_alloc = 0;
              if (type == ATTR_DATA && !name_len &&
                  sbi->options->prealloc) {
-                pre_alloc =
-                    bytes_to_cluster(
-                        sbi,
-                        get_pre_allocated(new_size)) -
-                    new_alen;
+                pre_alloc = bytes_to_cluster(
+                            sbi, get_pre_allocated(
+                                 new_size)) -
+                        new_alen;
              }

              /* Get the last LCN to allocate from. */
@@ -573,8 +572,8 @@ int attr_set_size(struct ntfs_inode *ni, enum 
ATTR_TYPE type,
              err = attr_allocate_clusters(
                  sbi, run, vcn, lcn, to_allocate, &pre_alloc,
                  is_mft ? ALLOCATE_MFT : ALLOCATE_DEF, &alen,
-                is_mft ? 0
-                       : (sbi->record_size -
+                is_mft ? 0 :
+                           (sbi->record_size -
                        le32_to_cpu(rec->used) + 8) /
                               3 +
                           1,
diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c
index 393c726ef17a..9a6c6a09d70c 100644
--- a/fs/ntfs3/bitmap.c
+++ b/fs/ntfs3/bitmap.c
@@ -40,9 +40,9 @@ static struct kmem_cache *ntfs_enode_cachep;

  int __init ntfs3_init_bitmap(void)
  {
-    ntfs_enode_cachep =
-        kmem_cache_create("ntfs3_enode_cache", sizeof(struct e_node), 0,
-                  SLAB_RECLAIM_ACCOUNT, NULL);
+    ntfs_enode_cachep = kmem_cache_create("ntfs3_enode_cache",
+                          sizeof(struct e_node), 0,
+                          SLAB_RECLAIM_ACCOUNT, NULL);
      return ntfs_enode_cachep ? 0 : -ENOMEM;
  }

@@ -286,9 +286,9 @@ static void wnd_add_free_ext(struct wnd_bitmap *wnd, 
size_t bit, size_t len,
          if (wnd->uptodated != 1) {
              /* Check bits before 'bit'. */
              ib = wnd->zone_bit == wnd->zone_end ||
-                         bit < wnd->zone_end
-                     ? 0
-                     : wnd->zone_end;
+                         bit < wnd->zone_end ?
+                       0 :
+                       wnd->zone_end;

              while (bit > ib && wnd_is_free_hlp(wnd, bit - 1, 1)) {
                  bit -= 1;
@@ -297,9 +297,9 @@ static void wnd_add_free_ext(struct wnd_bitmap *wnd, 
size_t bit, size_t len,

              /* Check bits after 'end_in'. */
              ib = wnd->zone_bit == wnd->zone_end ||
-                         end_in > wnd->zone_bit
-                     ? wnd->nbits
-                     : wnd->zone_bit;
+                         end_in > wnd->zone_bit ?
+                       wnd->nbits :
+                       wnd->zone_bit;

              while (end_in < ib && wnd_is_free_hlp(wnd, end_in, 1)) {
                  end_in += 1;
@@ -417,8 +417,8 @@ static void wnd_remove_free_ext(struct wnd_bitmap 
*wnd, size_t bit, size_t len)
              return;
          n3 = rb_first(&wnd->count_tree);
          wnd->extent_max =
-            n3 ? rb_entry(n3, struct e_node, count.node)->count.key
-               : 0;
+            n3 ? rb_entry(n3, struct e_node, count.node)->count.key :
+                   0;
          return;
      }

diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
index 09b7931e6be3..a10a905ec7ce 100644
--- a/fs/ntfs3/file.c
+++ b/fs/ntfs3/file.c
@@ -22,20 +22,21 @@ static int ntfs_ioctl_fitrim(struct ntfs_sb_info 
*sbi, unsigned long arg)
  {
      struct fstrim_range __user *user_range;
      struct fstrim_range range;
+    struct block_device *dev;
      int err;

      if (!capable(CAP_SYS_ADMIN))
          return -EPERM;

-    if (!bdev_max_discard_sectors(sbi->sb->s_bdev))
+    dev = sbi->sb->s_bdev;
+    if (!bdev_max_discard_sectors(dev))
          return -EOPNOTSUPP;

      user_range = (struct fstrim_range __user *)arg;
      if (copy_from_user(&range, user_range, sizeof(range)))
          return -EFAULT;

-    range.minlen = max_t(u32, range.minlen,
-                 bdev_discard_granularity(sbi->sb->s_bdev));
+    range.minlen = max_t(u32, range.minlen, bdev_discard_granularity(dev));

      err = ntfs_trim_fs(sbi, &range);
      if (err < 0)
@@ -190,8 +191,8 @@ static int ntfs_zero_range(struct inode *inode, u64 
vbo, u64 vbo_to)

      for (; idx < idx_end; idx += 1, from = 0) {
          page_off = (loff_t)idx << PAGE_SHIFT;
-        to = (page_off + PAGE_SIZE) > vbo_to ? (vbo_to - page_off)
-                             : PAGE_SIZE;
+        to = (page_off + PAGE_SIZE) > vbo_to ? (vbo_to - page_off) :
+                                 PAGE_SIZE;
          iblock = page_off >> inode->i_blkbits;

          page = find_or_create_page(mapping, idx,
@@ -564,13 +565,14 @@ static long ntfs_fallocate(struct file *file, int 
mode, loff_t vbo, loff_t len)
          ni_unlock(ni);
      } else {
          /* Check new size. */
+        u8 cluster_bits = sbi->cluster_bits;

          /* generic/213: expected -ENOSPC instead of -EFBIG. */
          if (!is_supported_holes) {
              loff_t to_alloc = new_size - inode_get_bytes(inode);

              if (to_alloc > 0 &&
-                (to_alloc >> sbi->cluster_bits) >
+                (to_alloc >> cluster_bits) >
                      wnd_zeroes(&sbi->used.bitmap)) {
                  err = -ENOSPC;
                  goto out;
@@ -591,7 +593,7 @@ static long ntfs_fallocate(struct file *file, int 
mode, loff_t vbo, loff_t len)
          }

          if (is_supported_holes) {
-            CLST vcn = vbo >> sbi->cluster_bits;
+            CLST vcn = vbo >> cluster_bits;
              CLST cend = bytes_to_cluster(sbi, end);
              CLST cend_v = bytes_to_cluster(sbi, ni->i_valid);
              CLST lcn, clen;
@@ -1049,8 +1051,8 @@ static ssize_t ntfs_file_write_iter(struct kiocb 
*iocb, struct iov_iter *from)
      if (ret)
          goto out;

-    ret = is_compressed(ni) ? ntfs_compress_write(iocb, from)
-                : __generic_file_write_iter(iocb, from);
+    ret = is_compressed(ni) ? ntfs_compress_write(iocb, from) :
+                    __generic_file_write_iter(iocb, from);

  out:
      inode_unlock(inode);
@@ -1102,8 +1104,9 @@ static int ntfs_file_release(struct inode *inode, 
struct file *file)
      int err = 0;

      /* If we are last writer on the inode, drop the block reservation. */
-    if (sbi->options->prealloc && ((file->f_mode & FMODE_WRITE) &&
-                      atomic_read(&inode->i_writecount) == 1)) {
+    if (sbi->options->prealloc &&
+        ((file->f_mode & FMODE_WRITE) &&
+         atomic_read(&inode->i_writecount) == 1)) {
          ni_lock(ni);
          down_write(&ni->file.run_lock);

diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 9e7dfee303e8..481219f2a7cf 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -76,8 +76,8 @@ struct ATTR_STD_INFO *ni_std(struct ntfs_inode *ni)
      const struct ATTRIB *attr;

      attr = mi_find_attr(&ni->mi, NULL, ATTR_STD, NULL, 0, NULL);
-    return attr ? resident_data_ex(attr, sizeof(struct ATTR_STD_INFO))
-            : NULL;
+    return attr ? resident_data_ex(attr, sizeof(struct ATTR_STD_INFO)) :
+                NULL;
  }

  /*
@@ -91,8 +91,8 @@ struct ATTR_STD_INFO5 *ni_std5(struct ntfs_inode *ni)

      attr = mi_find_attr(&ni->mi, NULL, ATTR_STD, NULL, 0, NULL);

-    return attr ? resident_data_ex(attr, sizeof(struct ATTR_STD_INFO5))
-            : NULL;
+    return attr ? resident_data_ex(attr, sizeof(struct ATTR_STD_INFO5)) :
+                NULL;
  }

  /*
@@ -1439,8 +1439,8 @@ int ni_insert_nonresident(struct ntfs_inode *ni, 
enum ATTR_TYPE type,
      int err;
      CLST plen;
      struct ATTRIB *attr;
-    bool is_ext =
-        (flags & (ATTR_FLAG_SPARSED | ATTR_FLAG_COMPRESSED)) && !svcn;
+    bool is_ext = (flags & (ATTR_FLAG_SPARSED | ATTR_FLAG_COMPRESSED)) &&
+              !svcn;
      u32 name_size = ALIGN(name_len * sizeof(short), 8);
      u32 name_off = is_ext ? SIZEOF_NONRESIDENT_EX : SIZEOF_NONRESIDENT;
      u32 run_off = name_off + name_size;
@@ -1756,9 +1756,9 @@ int ni_new_attr_flags(struct ntfs_inode *ni, enum 
FILE_ATTRIBUTE new_fa)
      }

      /* Resize nonresident empty attribute in-place only. */
-    new_asize = (new_aflags & (ATTR_FLAG_COMPRESSED | ATTR_FLAG_SPARSED))
-                ? (SIZEOF_NONRESIDENT_EX + 8)
-                : (SIZEOF_NONRESIDENT + 8);
+    new_asize = (new_aflags & (ATTR_FLAG_COMPRESSED | ATTR_FLAG_SPARSED)) ?
+                  (SIZEOF_NONRESIDENT_EX + 8) :
+                  (SIZEOF_NONRESIDENT + 8);

      if (!mi_resize_attr(mi, attr, new_asize - le32_to_cpu(attr->size)))
          return -EOPNOTSUPP;
@@ -2965,14 +2965,14 @@ bool ni_remove_name_undo(struct ntfs_inode 
*dir_ni, struct ntfs_inode *ni,
  {
      struct ntfs_sb_info *sbi = ni->mi.sbi;
      struct ATTRIB *attr;
-    u16 de_key_size = de2 ? le16_to_cpu(de2->key_size) : 0;
+    u16 de_key_size;

      switch (undo_step) {
      case 4:
+        de_key_size = le16_to_cpu(de2->key_size);
          if (ni_insert_resident(ni, de_key_size, ATTR_NAME, NULL, 0,
-                       &attr, NULL, NULL)) {
+                       &attr, NULL, NULL))
              return false;
-        }
          memcpy(Add2Ptr(attr, SIZEOF_RESIDENT), de2 + 1, de_key_size);

          mi_get_ref(&ni->mi, &de2->ref);
@@ -2981,19 +2981,16 @@ bool ni_remove_name_undo(struct ntfs_inode 
*dir_ni, struct ntfs_inode *ni,
          de2->flags = 0;
          de2->res = 0;

-        if (indx_insert_entry(&dir_ni->dir, dir_ni, de2, sbi, NULL,
-                      1)) {
+        if (indx_insert_entry(&dir_ni->dir, dir_ni, de2, sbi, NULL, 1))
              return false;
-        }
          fallthrough;

      case 2:
          de_key_size = le16_to_cpu(de->key_size);

          if (ni_insert_resident(ni, de_key_size, ATTR_NAME, NULL, 0,
-                       &attr, NULL, NULL)) {
+                       &attr, NULL, NULL))
              return false;
-        }

          memcpy(Add2Ptr(attr, SIZEOF_RESIDENT), de + 1, de_key_size);
          mi_get_ref(&ni->mi, &de->ref);
@@ -3162,9 +3159,9 @@ static bool ni_update_parent(struct ntfs_inode 
*ni, struct NTFS_DUP_INFO *dup,
              u64 data_size = le64_to_cpu(attr->nres.data_size);
              __le64 valid_le;

-            dup->alloc_size = is_attr_ext(attr)
-                          ? attr->nres.total_size
-                          : attr->nres.alloc_size;
+            dup->alloc_size = is_attr_ext(attr) ?
+                            attr->nres.total_size :
+                            attr->nres.alloc_size;
              dup->data_size = attr->nres.data_size;

              if (new_valid > data_size)
diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c
index bf7396447284..57762c5fe68b 100644
--- a/fs/ntfs3/fslog.c
+++ b/fs/ntfs3/fslog.c
@@ -827,10 +827,10 @@ static inline struct RESTART_TABLE 
*extend_rsttbl(struct RESTART_TABLE *tbl,

      memcpy(rt + 1, tbl + 1, esize * used);

-    rt->free_goal = free_goal == ~0u
-                ? cpu_to_le32(~0u)
-                : cpu_to_le32(sizeof(struct RESTART_TABLE) +
-                          free_goal * esize);
+    rt->free_goal = free_goal == ~0u ?
+                      cpu_to_le32(~0u) :
+                      cpu_to_le32(sizeof(struct RESTART_TABLE) +
+                        free_goal * esize);

      if (tbl->first_free) {
          rt->first_free = tbl->first_free;
@@ -1089,9 +1089,9 @@ static inline u64 base_lsn(struct ntfs_log *log,
              (lsn < (lsn_to_vbo(log, h_lsn) & ~log->page_mask) ? 1 : 0))
             << log->file_data_bits) +
            ((((is_log_record_end(hdr) &&
-              h_lsn <= le64_to_cpu(hdr->record_hdr.last_end_lsn))
-                 ? le16_to_cpu(hdr->record_hdr.next_record_off)
-                 : log->page_size) +
+              h_lsn <= le64_to_cpu(hdr->record_hdr.last_end_lsn)) ?
+                   le16_to_cpu(hdr->record_hdr.next_record_off) :
+                   log->page_size) +
              lsn) >>
             3);

@@ -1298,9 +1298,9 @@ static void log_init_pg_hdr(struct ntfs_log *log, 
u32 sys_page_size,
      if (!log->clst_per_page)
          log->clst_per_page = 1;

-    log->first_page = major_ver >= 2
-                  ? 0x22 * page_size
-                  : ((sys_page_size << 1) + (page_size << 1));
+    log->first_page = major_ver >= 2 ?
+                    0x22 * page_size :
+                    ((sys_page_size << 1) + (page_size << 1));
      log->major_ver = major_ver;
      log->minor_ver = minor_ver;
  }
@@ -1512,20 +1512,19 @@ static u32 current_log_avail(struct ntfs_log *log)
       * have to compute the free range.
       * If there is no oldest lsn then start at the first page of the file.
       */
-    oldest_off = (log->l_flags & NTFSLOG_NO_OLDEST_LSN)
-                 ? log->first_page
-                 : (log->oldest_lsn_off & ~log->sys_page_mask);
+    oldest_off = (log->l_flags & NTFSLOG_NO_OLDEST_LSN) ?
+                   log->first_page :
+                   (log->oldest_lsn_off & ~log->sys_page_mask);

      /*
       * We will use the next log page offset to compute the next free page.
       * If we are going to reuse this page go to the next page.
       * If we are at the first page then use the end of the file.
       */
-    next_free_off = (log->l_flags & NTFSLOG_REUSE_TAIL)
-                ? log->next_page + log->page_size
-                : log->next_page == log->first_page
-                      ? log->l_size
-                      : log->next_page;
+    next_free_off = (log->l_flags & NTFSLOG_REUSE_TAIL) ?
+                      log->next_page + log->page_size :
+            log->next_page == log->first_page ? log->l_size :
+                                  log->next_page;

      /* If the two offsets are the same then there is no available 
space. */
      if (oldest_off == next_free_off)
@@ -1535,9 +1534,9 @@ static u32 current_log_avail(struct ntfs_log *log)
       * this range from the total available pages.
       */
      free_bytes =
-        oldest_off < next_free_off
-            ? log->total_avail_pages - (next_free_off - oldest_off)
-            : oldest_off - next_free_off;
+        oldest_off < next_free_off ?
+                  log->total_avail_pages - (next_free_off - oldest_off) :
+                  oldest_off - next_free_off;

      free_bytes >>= log->page_bits;
      return free_bytes * log->reserved;
@@ -1671,8 +1670,8 @@ static int last_log_lsn(struct ntfs_log *log)
      }

      best_lsn1 = first_tail ? base_lsn(log, first_tail, first_file_off) 
: 0;
-    best_lsn2 =
-        second_tail ? base_lsn(log, second_tail, second_file_off) : 0;
+    best_lsn2 = second_tail ? base_lsn(log, second_tail, second_file_off) :
+                    0;

      if (first_tail && second_tail) {
          if (best_lsn1 > best_lsn2) {
@@ -1767,8 +1766,8 @@ static int last_log_lsn(struct ntfs_log *log)

      page_cnt = page_pos = 1;

-    curpage_off = seq_base == log->seq_num ? min(log->next_page, page_off)
-                           : log->next_page;
+    curpage_off = seq_base == log->seq_num ? min(log->next_page, 
page_off) :
+                               log->next_page;

      wrapped_file =
          curpage_off == log->first_page &&
@@ -1826,9 +1825,9 @@ static int last_log_lsn(struct ntfs_log *log)
                  le64_to_cpu(cur_page->record_hdr.last_end_lsn) &&
              ((lsn_cur >> log->file_data_bits) +
               ((curpage_off <
-               (lsn_to_vbo(log, lsn_cur) & ~log->page_mask))
-                  ? 1
-                  : 0)) != expected_seq) {
+               (lsn_to_vbo(log, lsn_cur) & ~log->page_mask)) ?
+                    1 :
+                    0)) != expected_seq) {
              goto check_tail;
          }

@@ -2642,9 +2641,10 @@ static inline bool check_index_root(const struct 
ATTRIB *attr,
  {
      bool ret;
      const struct INDEX_ROOT *root = resident_data(attr);
-    u8 index_bits = le32_to_cpu(root->index_block_size) >= 
sbi->cluster_size
-                ? sbi->cluster_bits
-                : SECTOR_SHIFT;
+    u8 index_bits = le32_to_cpu(root->index_block_size) >=
+                    sbi->cluster_size ?
+                      sbi->cluster_bits :
+                      SECTOR_SHIFT;
      u8 block_clst = root->index_block_clst;

      if (le32_to_cpu(attr->res.data_size) < sizeof(struct INDEX_ROOT) ||
@@ -3683,7 +3683,8 @@ static int do_action(struct ntfs_log *log, struct 
OPEN_ATTR_ENRTY *oe,

      if (a_dirty) {
          attr = oa->attr;
-        err = ntfs_sb_write_run(sbi, oa->run1, vbo, buffer_le, bytes, 0);
+        err = ntfs_sb_write_run(sbi, oa->run1, vbo, buffer_le, bytes,
+                    0);
          if (err)
              goto out;
      }
@@ -3768,11 +3769,10 @@ int log_replay(struct ntfs_inode *ni, bool 
*initialized)
      if (!log)
          return -ENOMEM;

-    memset(&rst_info, 0, sizeof(struct restart_info));
-
      log->ni = ni;
      log->l_size = l_size;
      log->one_page_buf = kmalloc(page_size, GFP_NOFS);
+
      if (!log->one_page_buf) {
          err = -ENOMEM;
          goto out;
@@ -3783,6 +3783,7 @@ int log_replay(struct ntfs_inode *ni, bool 
*initialized)
      log->page_bits = blksize_bits(page_size);

      /* Look for a restart area on the disk. */
+    memset(&rst_info, 0, sizeof(struct restart_info));
      err = log_read_rst(log, l_size, true, &rst_info);
      if (err)
          goto out;
@@ -3859,10 +3860,10 @@ int log_replay(struct ntfs_inode *ni, bool 
*initialized)
      log->init_ra = !!rst_info.vbo;

      /* If we have a valid page then grab a pointer to the restart area. */
-    ra2 = rst_info.valid_page
-              ? Add2Ptr(rst_info.r_page,
-                le16_to_cpu(rst_info.r_page->ra_off))
-              : NULL;
+    ra2 = rst_info.valid_page ?
+                Add2Ptr(rst_info.r_page,
+                  le16_to_cpu(rst_info.r_page->ra_off)) :
+                NULL;

      if (rst_info.chkdsk_was_run ||
          (ra2 && ra2->client_idx[1] == LFS_NO_CLIENT_LE)) {
diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
index 9ed9dd0d8edf..0a82b1bf3ec2 100644
--- a/fs/ntfs3/fsntfs.c
+++ b/fs/ntfs3/fsntfs.c
@@ -172,8 +172,8 @@ int ntfs_fix_post_read(struct NTFS_RECORD_HEADER 
*rhdr, size_t bytes,
      u16 sample, fo, fn;

      fo = le16_to_cpu(rhdr->fix_off);
-    fn = simple ? ((bytes >> SECTOR_SHIFT) + 1)
-            : le16_to_cpu(rhdr->fix_num);
+    fn = simple ? ((bytes >> SECTOR_SHIFT) + 1) :
+                le16_to_cpu(rhdr->fix_num);

      /* Check errors. */
      if ((fo & 1) || fo + fn * sizeof(short) > SECTOR_SIZE || !fn-- ||
@@ -849,14 +849,13 @@ void ntfs_update_mftmirr(struct ntfs_sb_info *sbi, 
int wait)
      u32 blocksize, bytes;
      sector_t block1, block2;

-    if (!sb)
+    /*
+     * sb can be NULL here. In this case sbi->flags should be 0 too.
+     */
+    if (!sb || !(sbi->flags & NTFS_FLAGS_MFTMIRR))
          return;

      blocksize = sb->s_blocksize;
-
-    if (!(sbi->flags & NTFS_FLAGS_MFTMIRR))
-        return;
-
      bytes = sbi->mft.recs_mirr << sbi->record_bits;
      block1 = sbi->mft.lbo >> sb->s_blocksize_bits;
      block2 = sbi->mft.lbo2 >> sb->s_blocksize_bits;
diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c
index 5d1ec0124137..0a48d2d67219 100644
--- a/fs/ntfs3/index.c
+++ b/fs/ntfs3/index.c
@@ -431,8 +431,9 @@ static int scan_nres_bitmap(struct ntfs_inode *ni, 
struct ATTRIB *bitmap,
          if (vbo + blocksize > data_size)
              nbits = 8 * (data_size - vbo);

-        ok = nbits > from ? (*fn)((ulong *)bh->b_data, from, nbits, ret)
-                  : false;
+        ok = nbits > from ?
+                   (*fn)((ulong *)bh->b_data, from, nbits, ret) :
+                   false;
          put_bh(bh);

          if (ok) {
@@ -764,8 +765,7 @@ static struct NTFS_DE *hdr_find_e(const struct 
ntfs_index *indx,
                  return NULL;

              max_idx = 0;
-            table_size = min(table_size * 2,
-                     (int)ARRAY_SIZE(offs));
+            table_size = min(table_size * 2, (int)ARRAY_SIZE(offs));
              goto fill_table;
          }
      } else if (diff2 < 0) {
@@ -1170,8 +1170,10 @@ int indx_find(struct ntfs_index *indx, struct 
ntfs_inode *ni,

          /* Read next level. */
          err = indx_read(indx, ni, de_get_vbn(e), &node);
-        if (err)
+        if (err) {
+            /* io error? */
              return err;
+        }

          /* Lookup entry that is <= to the search value. */
          e = hdr_find_e(indx, &node->index->ihdr, key, key_len, ctx,
@@ -1673,9 +1675,9 @@ static int indx_insert_into_root(struct ntfs_index 
*indx, struct ntfs_inode *ni,
      mi->dirty = true;

      /* Create alloc and bitmap attributes (if not). */
-    err = run_is_empty(&indx->alloc_run)
-              ? indx_create_allocate(indx, ni, &new_vbn)
-              : indx_add_allocate(indx, ni, &new_vbn);
+    err = run_is_empty(&indx->alloc_run) ?
+                indx_create_allocate(indx, ni, &new_vbn) :
+                indx_add_allocate(indx, ni, &new_vbn);

      /* Layout of record may be changed, so rescan root. */
      root = indx_get_root(indx, ni, &attr, &mi);
@@ -1865,9 +1867,9 @@ indx_insert_into_buffer(struct ntfs_index *indx, 
struct ntfs_inode *ni,
      hdr_insert_de(indx,
                (*indx->cmp)(new_de + 1, le16_to_cpu(new_de->key_size),
                     up_e + 1, le16_to_cpu(up_e->key_size),
-                   ctx) < 0
-                  ? hdr2
-                  : hdr1,
+                   ctx) < 0 ?
+                    hdr2 :
+                    hdr1,
                new_de, NULL, ctx);

      indx_mark_used(indx, ni, new_vbn >> indx->idx2vbn_bits);
@@ -2337,8 +2339,8 @@ int indx_delete_entry(struct ntfs_index *indx, 
struct ntfs_inode *ni,
              err = level ? indx_insert_into_buffer(indx, ni, root,
                                    re, ctx,
                                    fnd->level - 1,
-                                  fnd)
-                    : indx_insert_into_root(indx, ni, re, e,
+                                  fnd) :
+                        indx_insert_into_root(indx, ni, re, e,
                                  ctx, fnd, 0);
              kfree(re);

diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 752ad17685c0..f64b1e001501 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -262,8 +262,8 @@ static struct inode *ntfs_read_mft(struct inode *inode,
          if (!attr->nres.alloc_size)
              goto next_attr;

-        run = ino == MFT_REC_BITMAP ? &sbi->used.bitmap.run
-                        : &ni->file.run;
+        run = ino == MFT_REC_BITMAP ? &sbi->used.bitmap.run :
+                            &ni->file.run;
          break;

      case ATTR_ROOT:
@@ -290,9 +290,9 @@ static struct inode *ntfs_read_mft(struct inode *inode,
          if (err)
              goto out;

-        mode = sb->s_root
-                   ? (S_IFDIR | (0777 & sbi->options->fs_dmask_inv))
-                   : (S_IFDIR | 0777);
+        mode = sb->s_root ?
+                     (S_IFDIR | (0777 & sbi->options->fs_dmask_inv)) :
+                     (S_IFDIR | 0777);
          goto next_attr;

      case ATTR_ALLOC:
@@ -449,8 +449,8 @@ static struct inode *ntfs_read_mft(struct inode *inode,
          ni->std_fa &= ~FILE_ATTRIBUTE_DIRECTORY;
          inode->i_op = &ntfs_file_inode_operations;
          inode->i_fop = &ntfs_file_operations;
-        inode->i_mapping->a_ops =
-            is_compressed(ni) ? &ntfs_aops_cmpr : &ntfs_aops;
+        inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr :
+                                    &ntfs_aops;
          if (ino != MFT_REC_MFT)
              init_rwsem(&ni->file.run_lock);
      } else if (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode) ||
@@ -786,8 +786,8 @@ static ssize_t ntfs_direct_IO(struct kiocb *iocb, 
struct iov_iter *iter)
      }

      ret = blockdev_direct_IO(iocb, inode, iter,
-                 wr ? ntfs_get_block_direct_IO_W
-                    : ntfs_get_block_direct_IO_R);
+                 wr ? ntfs_get_block_direct_IO_W :
+                        ntfs_get_block_direct_IO_R);

      if (ret > 0)
          end = vbo + ret;
@@ -846,7 +846,7 @@ int ntfs_set_size(struct inode *inode, u64 new_size)
  }

  static int ntfs_resident_writepage(struct page *page,
-        struct writeback_control *wbc, void *data)
+                   struct writeback_control *wbc, void *data)
  {
      struct address_space *mapping = data;
      struct ntfs_inode *ni = ntfs_i(mapping->host);
@@ -887,8 +887,8 @@ int ntfs_write_begin(struct file *file, struct 
address_space *mapping,

      *pagep = NULL;
      if (is_resident(ni)) {
-        struct page *page = grab_cache_page_write_begin(
-            mapping, pos >> PAGE_SHIFT);
+        struct page *page =
+            grab_cache_page_write_begin(mapping, pos >> PAGE_SHIFT);

          if (!page) {
              err = -ENOMEM;
@@ -920,9 +920,8 @@ int ntfs_write_begin(struct file *file, struct 
address_space *mapping,
  /*
   * ntfs_write_end - Address_space_operations::write_end.
   */
-int ntfs_write_end(struct file *file, struct address_space *mapping,
-           loff_t pos, u32 len, u32 copied, struct page *page,
-           void *fsdata)
+int ntfs_write_end(struct file *file, struct address_space *mapping, 
loff_t pos,
+           u32 len, u32 copied, struct page *page, void *fsdata)
  {
      struct inode *inode = mapping->host;
      struct ntfs_inode *ni = ntfs_i(inode);
@@ -1605,8 +1604,8 @@ struct inode *ntfs_create_inode(struct 
user_namespace *mnt_userns,
      } else if (S_ISREG(mode)) {
          inode->i_op = &ntfs_file_inode_operations;
          inode->i_fop = &ntfs_file_operations;
-        inode->i_mapping->a_ops =
-            is_compressed(ni) ? &ntfs_aops_cmpr : &ntfs_aops;
+        inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr :
+                                    &ntfs_aops;
          init_rwsem(&ni->file.run_lock);
      } else {
          inode->i_op = &ntfs_special_inode_operations;
diff --git a/fs/ntfs3/lznt.c b/fs/ntfs3/lznt.c
index 28f654561f27..61e161c7c567 100644
--- a/fs/ntfs3/lznt.c
+++ b/fs/ntfs3/lznt.c
@@ -296,8 +296,8 @@ static inline ssize_t decompress_chunk(u8 *unc, u8 
*unc_end, const u8 *cmpr,
   */
  struct lznt *get_lznt_ctx(int level)
  {
-    struct lznt *r = kzalloc(level ? offsetof(struct lznt, hash)
-                       : sizeof(struct lznt),
+    struct lznt *r = kzalloc(level ? offsetof(struct lznt, hash) :
+                           sizeof(struct lznt),
                   GFP_NOFS);

      if (r)
@@ -392,9 +392,9 @@ ssize_t decompress_lznt(const void *cmpr, size_t 
cmpr_size, void *unc,
              unc_use = err;
          } else {
              /* This chunk does not contain compressed data. */
-            unc_use = unc_chunk + LZNT_CHUNK_SIZE > unc_end
-                      ? unc_end - unc_chunk
-                      : LZNT_CHUNK_SIZE;
+            unc_use = unc_chunk + LZNT_CHUNK_SIZE > unc_end ?
+                        unc_end - unc_chunk :
+                        LZNT_CHUNK_SIZE;

              if (cmpr_chunk + sizeof(chunk_hdr) + unc_use >
                  cmpr_end) {
diff --git a/fs/ntfs3/namei.c b/fs/ntfs3/namei.c
index 8b68ead5cc1f..5d5a251334a1 100644
--- a/fs/ntfs3/namei.c
+++ b/fs/ntfs3/namei.c
@@ -433,8 +433,8 @@ static int ntfs_atomic_open(struct inode *dir, 
struct dentry *dentry,

      inode = ntfs_create_inode(&init_user_ns, dir, dentry, uni, mode, 0,
                    NULL, 0, fnd);
-    err = IS_ERR(inode) ? PTR_ERR(inode)
-                : finish_open(file, dentry, ntfs_file_open);
+    err = IS_ERR(inode) ? PTR_ERR(inode) :
+                    finish_open(file, dentry, ntfs_file_open);
      dput(d);

  out2:
diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index b7782107ce8a..9a2d965f183e 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -338,7 +338,7 @@ enum ntfs_inode_mutex_lock_class {
  };

  /*
- * sturct ntfs_inode
+ * struct ntfs_inode
   *
   * Ntfs inode - extends linux inode. consists of one or more MFT inodes.
   */
@@ -697,9 +697,8 @@ int ntfs_get_block(struct inode *inode, sector_t vbn,
             struct buffer_head *bh_result, int create);
  int ntfs_write_begin(struct file *file, struct address_space *mapping,
               loff_t pos, u32 len, struct page **pagep, void **fsdata);
-int ntfs_write_end(struct file *file, struct address_space *mapping,
-           loff_t pos, u32 len, u32 copied, struct page *page,
-           void *fsdata);
+int ntfs_write_end(struct file *file, struct address_space *mapping, 
loff_t pos,
+           u32 len, u32 copied, struct page *page, void *fsdata);
  int ntfs3_write_inode(struct inode *inode, struct writeback_control *wbc);
  int ntfs_sync_inode(struct inode *inode);
  int ntfs_flush_inodes(struct super_block *sb, struct inode *i1,
@@ -856,7 +855,7 @@ unsigned long ntfs_names_hash(const u16 *name, 
size_t len, const u16 *upcase,
  /* globals from xattr.c */
  #ifdef CONFIG_NTFS3_FS_POSIX_ACL
  struct posix_acl *ntfs_get_acl(struct user_namespace *mnt_userns,
-         struct dentry *dentry, int type);
+                   struct dentry *dentry, int type);
  int ntfs_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
           struct posix_acl *acl, int type);
  int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
diff --git a/fs/ntfs3/record.c b/fs/ntfs3/record.c
index 0603169ee8a0..2a281cead2bc 100644
--- a/fs/ntfs3/record.c
+++ b/fs/ntfs3/record.c
@@ -419,10 +419,9 @@ struct ATTRIB *mi_insert_attr(struct mft_inode *mi, 
enum ATTR_TYPE type,
      struct ntfs_sb_info *sbi = mi->sbi;
      u32 used = le32_to_cpu(rec->used);
      const u16 *upcase = sbi->upcase;
-    int diff;

      /* Can we insert mi attribute? */
-    if (used + asize > mi->sbi->record_size)
+    if (used + asize > sbi->record_size)
          return NULL;

      /*
@@ -431,7 +430,7 @@ struct ATTRIB *mi_insert_attr(struct mft_inode *mi, 
enum ATTR_TYPE type,
       */
      attr = NULL;
      while ((attr = mi_enum_attr(mi, attr))) {
-        diff = compare_attr(attr, type, name, name_len, upcase);
+        int diff = compare_attr(attr, type, name, name_len, upcase);

          if (diff < 0)
              continue;
@@ -442,9 +441,11 @@ struct ATTRIB *mi_insert_attr(struct mft_inode *mi, 
enum ATTR_TYPE type,
      }

      if (!attr) {
-        tail = 8; /* Not used, just to suppress warning. */
+        /* Append. */
+        tail = 8;
          attr = Add2Ptr(rec, used - 8);
      } else {
+        /* Insert before 'attr'. */
          tail = used - PtrOffset(rec, attr);
      }

diff --git a/fs/ntfs3/run.c b/fs/ntfs3/run.c
index a5af71cd8d14..47612d16c027 100644
--- a/fs/ntfs3/run.c
+++ b/fs/ntfs3/run.c
@@ -433,9 +433,9 @@ bool run_add_entry(struct runs_tree *run, CLST vcn, 
CLST lcn, CLST len,
              should_add_tail = Tovcn < r->len;

              if (should_add_tail) {
-                tail_lcn = r->lcn == SPARSE_LCN
-                           ? SPARSE_LCN
-                           : (r->lcn + Tovcn);
+                tail_lcn = r->lcn == SPARSE_LCN ?
+                             SPARSE_LCN :
+                             (r->lcn + Tovcn);
                  tail_vcn = r->vcn + Tovcn;
                  tail_len = r->len - Tovcn;
              }
diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index d7bec9b28a42..6a412826b43d 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -39,10 +39,10 @@
   * To mount large volumes as ntfs one should use large cluster size 
(up to 2M)
   * The maximum volume size in this case is 2^32 * 2^21 = 2^53 = 8P
   *
- *     ntfs limits, cluster size is 2M (2^31)
+ *     ntfs limits, cluster size is 2M (2^21)
   * 
-----------------------------------------------------------------------------
- * | < 8P, 2^54    |  < 2^32  |  yes     |  yes   |   yes |  yes   |  
yes   |
- * | > 8P, 2^54    |  > 2^32  |  no      |  no    |   yes |  yes   |  
yes   |
+ * | < 8P, 2^53    |  < 2^32  |  yes     |  yes   |   yes |  yes   |  
yes   |
+ * | > 8P, 2^53    |  > 2^32  |  no      |  no    |   yes |  yes   |  
yes   |
   * 
----------------------------------------------------------|------------------
   *
   */
@@ -115,9 +115,9 @@ void ntfs_inode_printk(struct inode *inode, const 
char *fmt, ...)
          return;

      /* Use static allocated buffer, if possible. */
-    name = atomic_dec_and_test(&s_name_buf_cnt)
-               ? s_name_buf
-               : kmalloc(sizeof(s_name_buf), GFP_NOFS);
+    name = atomic_dec_and_test(&s_name_buf_cnt) ?
+                 s_name_buf :
+                 kmalloc(sizeof(s_name_buf), GFP_NOFS);

      if (name) {
          struct dentry *de = d_find_alias(inode);
@@ -369,7 +369,8 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
  #ifdef CONFIG_NTFS3_FS_POSIX_ACL
              fc->sb_flags |= SB_POSIXACL;
  #else
-            return invalf(fc, "ntfs3: Support for ACL not compiled in!");
+            return invalf(
+                fc, "ntfs3: Support for ACL not compiled in!");
  #endif
          else
              fc->sb_flags &= ~SB_POSIXACL;
@@ -404,24 +405,29 @@ static int ntfs_fs_reconfigure(struct fs_context *fc)

      ro_rw = sb_rdonly(sb) && !(fc->sb_flags & SB_RDONLY);
      if (ro_rw && (sbi->flags & NTFS_FLAGS_NEED_REPLAY)) {
-        errorf(fc, "ntfs3: Couldn't remount rw because journal is not 
replayed. Please umount/remount instead\n");
+        errorf(fc,
+               "ntfs3: Couldn't remount rw because journal is not 
replayed. Please umount/remount instead\n");
          return -EINVAL;
      }

      new_opts->nls = ntfs_load_nls(new_opts->nls_name);
      if (IS_ERR(new_opts->nls)) {
          new_opts->nls = NULL;
-        errorf(fc, "ntfs3: Cannot load iocharset %s", new_opts->nls_name);
+        errorf(fc, "ntfs3: Cannot load iocharset %s",
+               new_opts->nls_name);
          return -EINVAL;
      }
      if (new_opts->nls != sbi->options->nls)
-        return invalf(fc, "ntfs3: Cannot use different iocharset when 
remounting!");
+        return invalf(
+            fc,
+            "ntfs3: Cannot use different iocharset when remounting!");

      sync_filesystem(sb);

      if (ro_rw && (sbi->volume.flags & VOLUME_FLAG_DIRTY) &&
          !new_opts->force) {
-        errorf(fc, "ntfs3: Volume is dirty and \"force\" flag is not 
set!");
+        errorf(fc,
+               "ntfs3: Volume is dirty and \"force\" flag is not set!");
          return -EINVAL;
      }

@@ -539,10 +545,8 @@ static int ntfs_show_options(struct seq_file *m, 
struct dentry *root)
      struct ntfs_mount_options *opts = sbi->options;
      struct user_namespace *user_ns = seq_user_ns(m);

-    seq_printf(m, ",uid=%u",
-          from_kuid_munged(user_ns, opts->fs_uid));
-    seq_printf(m, ",gid=%u",
-          from_kgid_munged(user_ns, opts->fs_gid));
+    seq_printf(m, ",uid=%u", from_kuid_munged(user_ns, opts->fs_uid));
+    seq_printf(m, ",gid=%u", from_kgid_munged(user_ns, opts->fs_gid));
      if (opts->fmask)
          seq_printf(m, ",fmask=%04o", opts->fs_fmask_inv ^ 0xffff);
      if (opts->dmask)
@@ -699,7 +703,7 @@ static u32 true_sectors_per_clst(const struct 
NTFS_BOOT *boot)
      if (boot->sectors_per_clusters <= 0x80)
          return boot->sectors_per_clusters;
      if (boot->sectors_per_clusters >= 0xf4) /* limit shift to 2MB max */
-        return 1U << -(s8)boot->sectors_per_clusters;
+        return 1U << (-(s8)boot->sectors_per_clusters);
      return -EINVAL;
  }

@@ -717,6 +721,7 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      struct buffer_head *bh;
      struct MFT_REC *rec;
      u16 fn, ao;
+    u8 cluster_bits;

      sbi->volume.blocks = dev_size >> PAGE_SHIFT;

@@ -784,7 +789,7 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      if (boot_sector_size != sector_size) {
          ntfs_warn(
              sb,
-            "Different NTFS sector size (%u) and media sector size (%u)",
+            "Different NTFS sector size (%u) and media sector size (%u).",
              boot_sector_size, sector_size);
          dev_size += sector_size - 1;
      }
@@ -792,8 +797,8 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      sbi->cluster_size = boot_sector_size * sct_per_clst;
      sbi->cluster_bits = blksize_bits(sbi->cluster_size);

-    sbi->mft.lbo = mlcn << sbi->cluster_bits;
-    sbi->mft.lbo2 = mlcn2 << sbi->cluster_bits;
+    sbi->mft.lbo = mlcn << cluster_bits;
+    sbi->mft.lbo2 = mlcn2 << cluster_bits;

      /* Compare boot's cluster and sector. */
      if (sbi->cluster_size < boot_sector_size)
@@ -804,7 +809,7 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
          /* No way to use ntfs_get_block in this case. */
          ntfs_err(
              sb,
-            "Failed to mount 'cause NTFS's cluster size (%u) is less 
than media sector size (%u)",
+            "Failed to mount 'cause NTFS's cluster size (%u) is less 
than media sector size (%u).",
              sbi->cluster_size, sector_size);
          goto out;
      }
@@ -840,18 +845,18 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
          gb0 = format_size_gb(dev_size, &mb0);
          ntfs_warn(
              sb,
-            "RAW NTFS volume: Filesystem size %u.%02u Gb > volume size 
%u.%02u Gb. Mount in read-only",
+            "RAW NTFS volume: Filesystem size %u.%02u Gb > volume size 
%u.%02u Gb. Mount in read-only.",
              gb, mb, gb0, mb0);
          sb->s_flags |= SB_RDONLY;
      }

-    clusters = sbi->volume.size >> sbi->cluster_bits;
+    clusters = sbi->volume.size >> cluster_bits;
  #ifndef CONFIG_NTFS3_64BIT_CLUSTER
      /* 32 bits per cluster. */
      if (clusters >> 32) {
          ntfs_notice(
              sb,
-            "NTFS %u.%02u Gb is too big to use 32 bits per cluster",
+            "NTFS %u.%02u Gb is too big to use 32 bits per cluster.",
              gb, mb);
          goto out;
      }
@@ -885,17 +890,17 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      sbi->volume.blocks = sbi->volume.size >> sb->s_blocksize_bits;

      /* Maximum size for normal files. */
-    sbi->maxbytes = (clusters << sbi->cluster_bits) - 1;
+    sbi->maxbytes = (clusters << cluster_bits) - 1;

  #ifdef CONFIG_NTFS3_64BIT_CLUSTER
-    if (clusters >= (1ull << (64 - sbi->cluster_bits)))
+    if (clusters >= (1ull << (64 - cluster_bits)))
          sbi->maxbytes = -1;
      sbi->maxbytes_sparse = -1;
      sb->s_maxbytes = MAX_LFS_FILESIZE;
  #else
      /* Maximum size for sparse file. */
-    sbi->maxbytes_sparse = (1ull << (sbi->cluster_bits + 32)) - 1;
-    sb->s_maxbytes = 0xFFFFFFFFull << sbi->cluster_bits;
+    sbi->maxbytes_sparse = (1ull << (cluster_bits + 32)) - 1;
+    sb->s_maxbytes = 0xFFFFFFFFull << cluster_bits;
  #endif

      /*
@@ -903,7 +908,7 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
       * It would be nice if we are able to allocate 1/8 of
       * total clusters for MFT but not more then 512 MB.
       */
-    sbi->zone_max = min_t(CLST, 0x20000000 >> sbi->cluster_bits, 
clusters >> 3);
+    sbi->zone_max = min_t(CLST, 0x20000000 >> cluster_bits, clusters >> 3);

      err = 0;

@@ -1433,7 +1438,7 @@ static const struct fs_context_operations 
ntfs_context_ops = {
  };

  /*
- * ntfs_init_fs_context - Initialize spi and opts
+ * ntfs_init_fs_context - Initialize sbi and opts
   *
   * This will called when mount/remount. We will first initialize
   * options so that if remount we can use just that.
@@ -1506,7 +1511,8 @@ static int __init init_ntfs_fs(void)
      if (IS_ENABLED(CONFIG_NTFS3_FS_POSIX_ACL))
          pr_info("ntfs3: Enabled Linux POSIX ACLs support\n");
      if (IS_ENABLED(CONFIG_NTFS3_64BIT_CLUSTER))
-        pr_notice("ntfs3: Warning: Activated 64 bits per cluster. 
Windows does not support this\n");
+        pr_notice(
+            "ntfs3: Warning: Activated 64 bits per cluster. Windows 
does not support this\n");
      if (IS_ENABLED(CONFIG_NTFS3_LZX_XPRESS))
          pr_info("ntfs3: Read-only LZX/Xpress compression included\n");

@@ -1549,7 +1555,9 @@ MODULE_DESCRIPTION("ntfs3 read/write filesystem");
  MODULE_INFO(behaviour, "Enabled Linux POSIX ACLs support");
  #endif
  #ifdef CONFIG_NTFS3_64BIT_CLUSTER
-MODULE_INFO(cluster, "Warning: Activated 64 bits per cluster. Windows 
does not support this");
+MODULE_INFO(
+    cluster,
+    "Warning: Activated 64 bits per cluster. Windows does not support 
this");
  #endif
  #ifdef CONFIG_NTFS3_LZX_XPRESS
  MODULE_INFO(compression, "Read-only lzx/xpress compression included");
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
index 95c479d7ebba..0a6d2ec8c340 100644
--- a/fs/ntfs3/xattr.c
+++ b/fs/ntfs3/xattr.c
@@ -23,8 +23,8 @@

  static inline size_t unpacked_ea_size(const struct EA_FULL *ea)
  {
-    return ea->size ? le32_to_cpu(ea->size)
-            : ALIGN(struct_size(ea, name,
+    return ea->size ? le32_to_cpu(ea->size) :
+                ALIGN(struct_size(ea, name,
                          1 + ea->name_len +
                              le16_to_cpu(ea->elength)),
                  4);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 10/11] fs/ntfs3: Add missed "nocase" in ntfs_show_options
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (8 preceding siblings ...)
  2023-02-15 13:39 ` [PATCH 09/11] fs/ntfs3: Code formatting and refactoring Konstantin Komarov
@ 2023-02-15 13:39 ` Konstantin Komarov
  2023-02-15 13:40 ` [PATCH 11/11] fs/ntfs3: Print details about mount fails Konstantin Komarov
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:39 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Sort processing ntfs3's mount options in same order they declared.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/super.c | 40 +++++++++++++++++++++-------------------
  1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 6a412826b43d..521ce31d67a1 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -270,11 +270,11 @@ static const struct fs_parameter_spec 
ntfs_fs_parameters[] = {
      fsparam_flag_no("hidden",        Opt_nohidden),
      fsparam_flag_no("hide_dot_files",    Opt_hide_dot_files),
      fsparam_flag_no("windows_names",    Opt_windows_names),
-    fsparam_flag_no("acl",            Opt_acl),
      fsparam_flag_no("showmeta",        Opt_showmeta),
+    fsparam_flag_no("acl",            Opt_acl),
+    fsparam_string("iocharset",        Opt_iocharset),
      fsparam_flag_no("prealloc",        Opt_prealloc),
      fsparam_flag_no("nocase",        Opt_nocase),
-    fsparam_string("iocharset",        Opt_iocharset),
      {}
  };

@@ -364,6 +364,9 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
      case Opt_windows_names:
          opts->windows_names = result.negated ? 0 : 1;
          break;
+    case Opt_showmeta:
+        opts->showmeta = result.negated ? 0 : 1;
+        break;
      case Opt_acl:
          if (!result.negated)
  #ifdef CONFIG_NTFS3_FS_POSIX_ACL
@@ -375,9 +378,6 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
          else
              fc->sb_flags &= ~SB_POSIXACL;
          break;
-    case Opt_showmeta:
-        opts->showmeta = result.negated ? 0 : 1;
-        break;
      case Opt_iocharset:
          kfree(opts->nls_name);
          opts->nls_name = param->string;
@@ -547,34 +547,36 @@ static int ntfs_show_options(struct seq_file *m, 
struct dentry *root)

      seq_printf(m, ",uid=%u", from_kuid_munged(user_ns, opts->fs_uid));
      seq_printf(m, ",gid=%u", from_kgid_munged(user_ns, opts->fs_gid));
-    if (opts->fmask)
-        seq_printf(m, ",fmask=%04o", opts->fs_fmask_inv ^ 0xffff);
      if (opts->dmask)
          seq_printf(m, ",dmask=%04o", opts->fs_dmask_inv ^ 0xffff);
-    if (opts->nls)
-        seq_printf(m, ",iocharset=%s", opts->nls->charset);
-    else
-        seq_puts(m, ",iocharset=utf8");
+    if (opts->fmask)
+        seq_printf(m, ",fmask=%04o", opts->fs_fmask_inv ^ 0xffff);
      if (opts->sys_immutable)
          seq_puts(m, ",sys_immutable");
      if (opts->discard)
          seq_puts(m, ",discard");
+    if (opts->force)
+        seq_puts(m, ",force");
      if (opts->sparse)
          seq_puts(m, ",sparse");
-    if (opts->showmeta)
-        seq_puts(m, ",showmeta");
      if (opts->nohidden)
          seq_puts(m, ",nohidden");
-    if (opts->windows_names)
-        seq_puts(m, ",windows_names");
      if (opts->hide_dot_files)
          seq_puts(m, ",hide_dot_files");
-    if (opts->force)
-        seq_puts(m, ",force");
-    if (opts->prealloc)
-        seq_puts(m, ",prealloc");
+    if (opts->windows_names)
+        seq_puts(m, ",windows_names");
+    if (opts->showmeta)
+        seq_puts(m, ",showmeta");
      if (sb->s_flags & SB_POSIXACL)
          seq_puts(m, ",acl");
+    if (opts->nls)
+        seq_printf(m, ",iocharset=%s", opts->nls->charset);
+    else
+        seq_puts(m, ",iocharset=utf8");
+    if (opts->prealloc)
+        seq_puts(m, ",prealloc");
+    if (opts->nocase)
+        seq_puts(m, ",nocase");

      return 0;
  }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 11/11] fs/ntfs3: Print details about mount fails
  2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
                   ` (9 preceding siblings ...)
  2023-02-15 13:39 ` [PATCH 10/11] fs/ntfs3: Add missed "nocase" in ntfs_show_options Konstantin Komarov
@ 2023-02-15 13:40 ` Konstantin Komarov
  10 siblings, 0 replies; 12+ messages in thread
From: Konstantin Komarov @ 2023-02-15 13:40 UTC (permalink / raw)
  To: ntfs3; +Cc: Linux Kernel Mailing List, linux-fsdevel

Added error mesages with error codes.
Minor refactoring and code formatting.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/frecord.c |   2 +-
  fs/ntfs3/fsntfs.c  |  40 +++++------
  fs/ntfs3/super.c   | 172 +++++++++++++++++++++++++++------------------
  3 files changed, 122 insertions(+), 92 deletions(-)

diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 481219f2a7cf..2bfcf1a989c9 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -3360,7 +3360,7 @@ int ni_write_inode(struct inode *inode, int sync, 
const char *hint)
      ni_unlock(ni);

      if (err) {
-        ntfs_err(sb, "%s r=%lx failed, %d.", hint, inode->i_ino, err);
+        ntfs_inode_err(inode, "%s failed, %d.", hint, err);
          ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
          return err;
      }
diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
index 0a82b1bf3ec2..28cc421102e5 100644
--- a/fs/ntfs3/fsntfs.c
+++ b/fs/ntfs3/fsntfs.c
@@ -223,7 +223,7 @@ int ntfs_extend_init(struct ntfs_sb_info *sbi)
      inode = ntfs_iget5(sb, &ref, &NAME_EXTEND);
      if (IS_ERR(inode)) {
          err = PTR_ERR(inode);
-        ntfs_err(sb, "Failed to load $Extend.");
+        ntfs_err(sb, "Failed to load $Extend (%d).", err);
          inode = NULL;
          goto out;
      }
@@ -282,7 +282,7 @@ int ntfs_loadlog_and_replay(struct ntfs_inode *ni, 
struct ntfs_sb_info *sbi)

      /* Check for 4GB. */
      if (ni->vfs_inode.i_size >= 0x100000000ull) {
-        ntfs_err(sb, "\x24LogFile is too big");
+        ntfs_err(sb, "\x24LogFile is large than 4G.");
          err = -EINVAL;
          goto out;
      }
@@ -1863,7 +1863,7 @@ int ntfs_security_init(struct ntfs_sb_info *sbi)
      inode = ntfs_iget5(sb, &ref, &NAME_SECURE);
      if (IS_ERR(inode)) {
          err = PTR_ERR(inode);
-        ntfs_err(sb, "Failed to load $Secure.");
+        ntfs_err(sb, "Failed to load $Secure (%d).", err);
          inode = NULL;
          goto out;
      }
@@ -1874,45 +1874,43 @@ int ntfs_security_init(struct ntfs_sb_info *sbi)

      attr = ni_find_attr(ni, NULL, &le, ATTR_ROOT, SDH_NAME,
                  ARRAY_SIZE(SDH_NAME), NULL, NULL);
-    if (!attr) {
-        err = -EINVAL;
-        goto out;
-    }
-
-    if(!(root_sdh = resident_data_ex(attr, sizeof(struct INDEX_ROOT))) ||
+    if (!attr ||
+        !(root_sdh = resident_data_ex(attr, sizeof(struct INDEX_ROOT))) ||
          root_sdh->type != ATTR_ZERO ||
          root_sdh->rule != NTFS_COLLATION_TYPE_SECURITY_HASH ||
          offsetof(struct INDEX_ROOT, ihdr) +
-            le32_to_cpu(root_sdh->ihdr.used) >
-            le32_to_cpu(attr->res.data_size)) {
+                le32_to_cpu(root_sdh->ihdr.used) >
+            le32_to_cpu(attr->res.data_size)) {
+        ntfs_err(sb, "$Secure::$SDH is corrupted.");
          err = -EINVAL;
          goto out;
      }

      err = indx_init(indx_sdh, sbi, attr, INDEX_MUTEX_SDH);
-    if (err)
+    if (err) {
+        ntfs_err(sb, "Failed to initialize $Secure::$SDH (%d).", err);
          goto out;
+    }

      attr = ni_find_attr(ni, attr, &le, ATTR_ROOT, SII_NAME,
                  ARRAY_SIZE(SII_NAME), NULL, NULL);
-    if (!attr) {
-        err = -EINVAL;
-        goto out;
-    }
-
-    if(!(root_sii = resident_data_ex(attr, sizeof(struct INDEX_ROOT))) ||
+    if (!attr ||
+        !(root_sii = resident_data_ex(attr, sizeof(struct INDEX_ROOT))) ||
          root_sii->type != ATTR_ZERO ||
          root_sii->rule != NTFS_COLLATION_TYPE_UINT ||
          offsetof(struct INDEX_ROOT, ihdr) +
-            le32_to_cpu(root_sii->ihdr.used) >
-            le32_to_cpu(attr->res.data_size)) {
+                le32_to_cpu(root_sii->ihdr.used) >
+            le32_to_cpu(attr->res.data_size)) {
+        ntfs_err(sb, "$Secure::$SII is corrupted.");
          err = -EINVAL;
          goto out;
      }

      err = indx_init(indx_sii, sbi, attr, INDEX_MUTEX_SII);
-    if (err)
+    if (err) {
+        ntfs_err(sb, "Failed to initialize $Secure::$SII (%d).", err);
          goto out;
+    }

      fnd_sii = fnd_get();
      if (!fnd_sii) {
diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 521ce31d67a1..e0f78b306f15 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -734,48 +734,81 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
      err = -EINVAL;
      boot = (struct NTFS_BOOT *)bh->b_data;

-    if (memcmp(boot->system_id, "NTFS    ", sizeof("NTFS    ") - 1))
+    if (memcmp(boot->system_id, "NTFS    ", sizeof("NTFS    ") - 1)) {
+        ntfs_err(sb, "Boot's signature is not NTFS.");
          goto out;
+    }

      /* 0x55AA is not mandaroty. Thanks Maxim Suhanov*/
      /*if (0x55 != boot->boot_magic[0] || 0xAA != boot->boot_magic[1])
       *    goto out;
       */

-    boot_sector_size = (u32)boot->bytes_per_sector[1] << 8;
-    if (boot->bytes_per_sector[0] || boot_sector_size < SECTOR_SIZE ||
+    boot_sector_size = ((u32)boot->bytes_per_sector[1] << 8) |
+               boot->bytes_per_sector[0];
+    if (boot_sector_size < SECTOR_SIZE ||
          !is_power_of_2(boot_sector_size)) {
+        ntfs_err(sb, "Invalid bytes per sector %u.", boot_sector_size);
          goto out;
      }

      /* cluster size: 512, 1K, 2K, 4K, ... 2M */
      sct_per_clst = true_sectors_per_clst(boot);
-    if ((int)sct_per_clst < 0)
-        goto out;
-    if (!is_power_of_2(sct_per_clst))
+    if ((int)sct_per_clst < 0 || !is_power_of_2(sct_per_clst)) {
+        ntfs_err(sb, "Invalid sectors per cluster %u.", sct_per_clst);
          goto out;
+    }
+
+    sbi->cluster_size = boot_sector_size * sct_per_clst;
+    sbi->cluster_bits = cluster_bits = blksize_bits(sbi->cluster_size);
+    sbi->cluster_mask = sbi->cluster_size - 1;
+    sbi->cluster_mask_inv = ~(u64)sbi->cluster_mask;

      mlcn = le64_to_cpu(boot->mft_clst);
      mlcn2 = le64_to_cpu(boot->mft2_clst);
      sectors = le64_to_cpu(boot->sectors_per_volume);

-    if (mlcn * sct_per_clst >= sectors)
+    if (mlcn * sct_per_clst >= sectors || mlcn2 * sct_per_clst >= 
sectors) {
+        ntfs_err(
+            sb,
+            "Start of MFT 0x%llx (0x%llx) is out of volume 0x%llx.",
+            mlcn, mlcn2, sectors);
          goto out;
+    }

-    if (mlcn2 * sct_per_clst >= sectors)
-        goto out;
+    sbi->record_size = record_size =
+        boot->record_size < 0 ? 1 << (-boot->record_size) :
+                          (u32)boot->record_size << cluster_bits;
+    sbi->record_bits = blksize_bits(record_size);
+    sbi->attr_size_tr = (5 * record_size >> 4); // ~320 bytes

      /* Check MFT record size. */
-    if ((boot->record_size < 0 &&
-         SECTOR_SIZE > (2U << (-boot->record_size))) ||
-        (boot->record_size >= 0 && !is_power_of_2(boot->record_size))) {
+    if (record_size < SECTOR_SIZE || !is_power_of_2(record_size)) {
+        ntfs_err(sb, "Invalid bytes per MFT record %u (%d).",
+             record_size, boot->record_size);
+        goto out;
+    }
+
+    if (record_size > MAXIMUM_BYTES_PER_MFT) {
+        ntfs_err(sb, "Unsupported bytes per MFT record %u.",
+             record_size);
          goto out;
      }

+    sbi->index_size = boot->index_size < 0 ?
+                    1u << (-boot->index_size) :
+                    (u32)boot->index_size << cluster_bits;
+
      /* Check index record size. */
-    if ((boot->index_size < 0 &&
-         SECTOR_SIZE > (2U << (-boot->index_size))) ||
-        (boot->index_size >= 0 && !is_power_of_2(boot->index_size))) {
+    if (sbi->index_size < SECTOR_SIZE || !is_power_of_2(sbi->index_size)) {
+        ntfs_err(sb, "Invalid bytes per index %u(%d).", sbi->index_size,
+             boot->index_size);
+        goto out;
+    }
+
+    if (sbi->index_size > MAXIMUM_BYTES_PER_INDEX) {
+        ntfs_err(sb, "Unsupported bytes per index %u.",
+             sbi->index_size);
          goto out;
      }

@@ -796,15 +829,15 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
          dev_size += sector_size - 1;
      }

-    sbi->cluster_size = boot_sector_size * sct_per_clst;
-    sbi->cluster_bits = blksize_bits(sbi->cluster_size);
-
      sbi->mft.lbo = mlcn << cluster_bits;
      sbi->mft.lbo2 = mlcn2 << cluster_bits;

      /* Compare boot's cluster and sector. */
-    if (sbi->cluster_size < boot_sector_size)
+    if (sbi->cluster_size < boot_sector_size) {
+        ntfs_err(sb, "Invalid bytes per cluster (%u).",
+             sbi->cluster_size);
          goto out;
+    }

      /* Compare boot's cluster and media sector. */
      if (sbi->cluster_size < sector_size) {
@@ -816,28 +849,11 @@ static int ntfs_init_from_boot(struct super_block 
*sb, u32 sector_size,
          goto out;
      }

-    sbi->cluster_mask = sbi->cluster_size - 1;
-    sbi->cluster_mask_inv = ~(u64)sbi->cluster_mask;
-    sbi->record_size = record_size = boot->record_size < 0
-                         ? 1 << (-boot->record_size)
-                         : (u32)boot->record_size
-                               << sbi->cluster_bits;
-
-    if (record_size > MAXIMUM_BYTES_PER_MFT || record_size < SECTOR_SIZE)
-        goto out;
-
-    sbi->record_bits = blksize_bits(record_size);
-    sbi->attr_size_tr = (5 * record_size >> 4); // ~320 bytes
-
      sbi->max_bytes_per_attr =
          record_size - ALIGN(MFTRECORD_FIXUP_OFFSET_1, 8) -
          ALIGN(((record_size >> SECTOR_SHIFT) * sizeof(short)), 8) -
          ALIGN(sizeof(enum ATTR_TYPE), 8);

-    sbi->index_size = boot->index_size < 0
-                  ? 1u << (-boot->index_size)
-                  : (u32)boot->index_size << sbi->cluster_bits;
-
      sbi->volume.ser_num = le64_to_cpu(boot->serial_num);

      /* Warning if RAW volume. */
@@ -928,6 +944,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      int err;
      struct ntfs_sb_info *sbi = sb->s_fs_info;
      struct block_device *bdev = sb->s_bdev;
+    struct ntfs_mount_options *options;
      struct inode *inode;
      struct ntfs_inode *ni;
      size_t i, tt, bad_len, bad_frags;
@@ -942,7 +959,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.high = 0;

      sbi->sb = sb;
-    sbi->options = fc->fs_private;
+    sbi->options = options = fc->fs_private;
      fc->fs_private = NULL;
      sb->s_flags |= SB_NODIRATIME;
      sb->s_magic = 0x7366746e; // "ntfs"
@@ -950,12 +967,12 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      sb->s_export_op = &ntfs_export_ops;
      sb->s_time_gran = NTFS_TIME_GRAN; // 100 nsec
      sb->s_xattr = ntfs_xattr_handlers;
-    sb->s_d_op = sbi->options->nocase ? &ntfs_dentry_ops : NULL;
+    sb->s_d_op = options->nocase ? &ntfs_dentry_ops : NULL;

-    sbi->options->nls = ntfs_load_nls(sbi->options->nls_name);
-    if (IS_ERR(sbi->options->nls)) {
-        sbi->options->nls = NULL;
-        errorf(fc, "Cannot load nls %s", sbi->options->nls_name);
+    options->nls = ntfs_load_nls(options->nls_name);
+    if (IS_ERR(options->nls)) {
+        options->nls = NULL;
+        errorf(fc, "Cannot load nls %s", options->nls_name);
          err = -EINVAL;
          goto out;
      }
@@ -980,8 +997,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_VOL);
      inode = ntfs_iget5(sb, &ref, &NAME_VOLUME);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $Volume.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $Volume (%d).", err);
          goto out;
      }

@@ -1007,13 +1024,9 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
      }

      attr = ni_find_attr(ni, attr, NULL, ATTR_VOL_INFO, NULL, 0, NULL, 
NULL);
-    if (!attr || is_attr_ext(attr)) {
-        err = -EINVAL;
-        goto put_inode_out;
-    }
-
-    info = resident_data_ex(attr, SIZEOF_ATTRIBUTE_VOLUME_INFO);
-    if (!info) {
+    if (!attr || is_attr_ext(attr) ||
+        !(info = resident_data_ex(attr, SIZEOF_ATTRIBUTE_VOLUME_INFO))) {
+        ntfs_err(sb, "$Volume is corrupted.");
          err = -EINVAL;
          goto put_inode_out;
      }
@@ -1028,13 +1041,13 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_MIRR);
      inode = ntfs_iget5(sb, &ref, &NAME_MIRROR);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $MFTMirr.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $MFTMirr (%d).", err);
          goto out;
      }

-    sbi->mft.recs_mirr =
-        ntfs_up_cluster(sbi, inode->i_size) >> sbi->record_bits;
+    sbi->mft.recs_mirr = ntfs_up_cluster(sbi, inode->i_size) >>
+                 sbi->record_bits;

      iput(inode);

@@ -1043,8 +1056,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_LOG);
      inode = ntfs_iget5(sb, &ref, &NAME_LOGFILE);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load \x24LogFile.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load \x24LogFile (%d).", err);
          goto out;
      }

@@ -1064,7 +1077,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
              goto out;
          }
      } else if (sbi->volume.flags & VOLUME_FLAG_DIRTY) {
-        if (!sb_rdonly(sb) && !sbi->options->force) {
+        if (!sb_rdonly(sb) && !options->force) {
              ntfs_warn(
                  sb,
                  "volume is dirty and \"force\" flag is not set!");
@@ -1079,8 +1092,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)

      inode = ntfs_iget5(sb, &ref, &NAME_MFT);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $MFT.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $MFT (%d).", err);
          goto out;
      }

@@ -1095,8 +1108,10 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
          goto put_inode_out;

      err = ni_load_all_mi(ni);
-    if (err)
+    if (err) {
+        ntfs_err(sb, "Failed to load $MFT's subrecords (%d).", err);
          goto put_inode_out;
+    }

      sbi->mft.ni = ni;

@@ -1105,8 +1120,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_BITMAP);
      inode = ntfs_iget5(sb, &ref, &NAME_BITMAP);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $Bitmap.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $Bitmap (%d).", err);
          goto out;
      }

@@ -1120,20 +1135,25 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
      /* Check bitmap boundary. */
      tt = sbi->used.bitmap.nbits;
      if (inode->i_size < bitmap_size(tt)) {
+        ntfs_err(sb, "$Bitmap is corrupted.");
          err = -EINVAL;
          goto put_inode_out;
      }

      err = wnd_init(&sbi->used.bitmap, sb, tt);
-    if (err)
+    if (err) {
+        ntfs_err(sb, "Failed to initialize $Bitmap (%d).", err);
          goto put_inode_out;
+    }

      iput(inode);

      /* Compute the MFT zone. */
      err = ntfs_refresh_zone(sbi);
-    if (err)
+    if (err) {
+        ntfs_err(sb, "Failed to initialize MFT zone (%d).", err);
          goto out;
+    }

      /* Load $BadClus. */
      ref.low = cpu_to_le32(MFT_REC_BADCLUST);
@@ -1178,8 +1198,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_ATTR);
      inode = ntfs_iget5(sb, &ref, &NAME_ATTRDEF);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $AttrDef -> %d", err);
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $AttrDef (%d)", err);
          goto out;
      }

@@ -1208,6 +1228,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)

          if (IS_ERR(page)) {
              err = PTR_ERR(page);
+            ntfs_err(sb, "Failed to read $AttrDef (%d).", err);
              goto put_inode_out;
          }
          memcpy(Add2Ptr(t, done), page_address(page),
@@ -1215,6 +1236,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
          ntfs_unmap_page(page);

          if (!idx && ATTR_STD != t->type) {
+            ntfs_err(sb, "$AttrDef is corrupted.");
              err = -EINVAL;
              goto put_inode_out;
          }
@@ -1249,13 +1271,14 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_UPCASE);
      inode = ntfs_iget5(sb, &ref, &NAME_UPCASE);
      if (IS_ERR(inode)) {
-        ntfs_err(sb, "Failed to load $UpCase.");
          err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load $UpCase (%d).", err);
          goto out;
      }

      if (inode->i_size != 0x10000 * sizeof(short)) {
          err = -EINVAL;
+        ntfs_err(sb, "$UpCase is corrupted.");
          goto put_inode_out;
      }

@@ -1266,6 +1289,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)

          if (IS_ERR(page)) {
              err = PTR_ERR(page);
+            ntfs_err(sb, "Failed to read $UpCase (%d).", err);
              goto put_inode_out;
          }

@@ -1291,23 +1315,31 @@ static int ntfs_fill_super(struct super_block 
*sb, struct fs_context *fc)
      if (is_ntfs3(sbi)) {
          /* Load $Secure. */
          err = ntfs_security_init(sbi);
-        if (err)
+        if (err) {
+            ntfs_err(sb, "Failed to initialize $Secure (%d).", err);
              goto out;
+        }

          /* Load $Extend. */
          err = ntfs_extend_init(sbi);
-        if (err)
+        if (err) {
+            ntfs_warn(sb, "Failed to initialize $Extend.");
              goto load_root;
+        }

-        /* Load $Extend\$Reparse. */
+        /* Load $Extend/$Reparse. */
          err = ntfs_reparse_init(sbi);
-        if (err)
+        if (err) {
+            ntfs_warn(sb, "Failed to initialize $Extend/$Reparse.");
              goto load_root;
+        }

-        /* Load $Extend\$ObjId. */
+        /* Load $Extend/$ObjId. */
          err = ntfs_objid_init(sbi);
-        if (err)
+        if (err) {
+            ntfs_warn(sb, "Failed to initialize $Extend/$ObjId.");
              goto load_root;
+        }
      }

  load_root:
@@ -1316,8 +1348,8 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
      ref.seq = cpu_to_le16(MFT_REC_ROOT);
      inode = ntfs_iget5(sb, &ref, &NAME_ROOT);
      if (IS_ERR(inode) || !inode->i_op) {
-        ntfs_err(sb, "Failed to load root.");
-        err = IS_ERR(inode) ? PTR_ERR(inode) : -EINVAL;
+        err = PTR_ERR(inode);
+        ntfs_err(sb, "Failed to load root (%d).", err);
          goto out;
      }

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-02-15 13:41 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-15 13:33 [PATCH 00/11] fs/ntfs3: Bugfix and refactoring Konstantin Komarov
2023-02-15 13:34 ` [PATCH 01/11] fs/ntfs3: Use bh_read to simplify code Konstantin Komarov
2023-02-15 13:34 ` [PATCH 02/11] fs/ntfs3: Remove noacsrules Konstantin Komarov
2023-02-15 13:35 ` [PATCH 03/11] fs/ntfs3: Fix ntfs_create_inode() Konstantin Komarov
2023-02-15 13:36 ` [PATCH 04/11] fs/ntfs3: Optimization in ntfs_set_state() Konstantin Komarov
2023-02-15 13:36 ` [PATCH 05/11] fs/ntfs3: Undo endian changes Konstantin Komarov
2023-02-15 13:37 ` [PATCH 06/11] fs/ntfs3: Undo critial modificatins to keep directory consistency Konstantin Komarov
2023-02-15 13:38 ` [PATCH 07/11] fs/ntfs3: Remove field sbi->used.bitmap.set_tail Konstantin Komarov
2023-02-15 13:38 ` [PATCH 08/11] fs/ntfs3: Changed ntfs_get_acl() to use dentry Konstantin Komarov
2023-02-15 13:39 ` [PATCH 09/11] fs/ntfs3: Code formatting and refactoring Konstantin Komarov
2023-02-15 13:39 ` [PATCH 10/11] fs/ntfs3: Add missed "nocase" in ntfs_show_options Konstantin Komarov
2023-02-15 13:40 ` [PATCH 11/11] fs/ntfs3: Print details about mount fails Konstantin Komarov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.