fs/ntfs3: Redesign ntfs_create_inode to return error code instead of inode
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Tue, 16 Apr 2024 06:52:47 +0000 (09:52 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Tue, 23 Apr 2024 06:34:24 +0000 (09:34 +0300)
As Al Viro correctly pointed out, there is no need to return
the whole structure to check the error.
https://lore.kernel.org/ntfs3/20240322023515.GK538574@ZenIV/

Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/inode.c
fs/ntfs3/namei.c
fs/ntfs3/ntfs_fs.h

index 502a527e51cd1cac119ed83380320488cdbc1c7e..8fdcf37b31864ce8f5f3b23090f41b28778eca7f 100644 (file)
@@ -1216,11 +1216,10 @@ out:
  *
  * NOTE: if fnd != NULL (ntfs_atomic_open) then @dir is locked
  */
-struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
-                               struct dentry *dentry,
-                               const struct cpu_str *uni, umode_t mode,
-                               dev_t dev, const char *symname, u32 size,
-                               struct ntfs_fnd *fnd)
+int ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
+                     struct dentry *dentry, const struct cpu_str *uni,
+                     umode_t mode, dev_t dev, const char *symname, u32 size,
+                     struct ntfs_fnd *fnd)
 {
        int err;
        struct super_block *sb = dir->i_sb;
@@ -1245,6 +1244,9 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
        struct REPARSE_DATA_BUFFER *rp = NULL;
        bool rp_inserted = false;
 
+       /* New file will be resident or non resident. */
+       const bool new_file_resident = 1;
+
        if (!fnd)
                ni_lock_dir(dir_ni);
 
@@ -1484,7 +1486,7 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
                attr->size = cpu_to_le32(SIZEOF_RESIDENT);
                attr->name_off = SIZEOF_RESIDENT_LE;
                attr->res.data_off = SIZEOF_RESIDENT_LE;
-       } else if (S_ISREG(mode)) {
+       } else if (!new_file_resident && S_ISREG(mode)) {
                /*
                 * Regular file. Create empty non resident data attribute.
                 */
@@ -1721,12 +1723,10 @@ out1:
        if (!fnd)
                ni_unlock(dir_ni);
 
-       if (err)
-               return ERR_PTR(err);
-
-       unlock_new_inode(inode);
+       if (!err)
+               unlock_new_inode(inode);
 
-       return inode;
+       return err;
 }
 
 int ntfs_link_inode(struct inode *inode, struct dentry *dentry)
index edb6a714124611dc2d1479564fc82fd1976c2b8e..71498421ce60b1aca3c945acd21fb6a34306cf17 100644 (file)
@@ -107,12 +107,8 @@ static struct dentry *ntfs_lookup(struct inode *dir, struct dentry *dentry,
 static int ntfs_create(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, bool excl)
 {
-       struct inode *inode;
-
-       inode = ntfs_create_inode(idmap, dir, dentry, NULL, S_IFREG | mode, 0,
-                                 NULL, 0, NULL);
-
-       return IS_ERR(inode) ? PTR_ERR(inode) : 0;
+       return ntfs_create_inode(idmap, dir, dentry, NULL, S_IFREG | mode, 0,
+                                NULL, 0, NULL);
 }
 
 /*
@@ -123,12 +119,8 @@ static int ntfs_create(struct mnt_idmap *idmap, struct inode *dir,
 static int ntfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
-       struct inode *inode;
-
-       inode = ntfs_create_inode(idmap, dir, dentry, NULL, mode, rdev, NULL, 0,
-                                 NULL);
-
-       return IS_ERR(inode) ? PTR_ERR(inode) : 0;
+       return ntfs_create_inode(idmap, dir, dentry, NULL, mode, rdev, NULL, 0,
+                                NULL);
 }
 
 /*
@@ -200,15 +192,12 @@ static int ntfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, const char *symname)
 {
        u32 size = strlen(symname);
-       struct inode *inode;
 
        if (unlikely(ntfs3_forced_shutdown(dir->i_sb)))
                return -EIO;
 
-       inode = ntfs_create_inode(idmap, dir, dentry, NULL, S_IFLNK | 0777, 0,
-                                 symname, size, NULL);
-
-       return IS_ERR(inode) ? PTR_ERR(inode) : 0;
+       return ntfs_create_inode(idmap, dir, dentry, NULL, S_IFLNK | 0777, 0,
+                                symname, size, NULL);
 }
 
 /*
@@ -217,12 +206,8 @@ static int ntfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
 static int ntfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
-       struct inode *inode;
-
-       inode = ntfs_create_inode(idmap, dir, dentry, NULL, S_IFDIR | mode, 0,
-                                 NULL, 0, NULL);
-
-       return IS_ERR(inode) ? PTR_ERR(inode) : 0;
+       return ntfs_create_inode(idmap, dir, dentry, NULL, S_IFDIR | mode, 0,
+                                NULL, 0, NULL);
 }
 
 /*
index 79356fd29a14141de34ed006517b153fd9e4872b..3db6a61f61dcf45f7c572df29cc541bea8f92fcb 100644 (file)
@@ -714,11 +714,10 @@ int ntfs_sync_inode(struct inode *inode);
 int ntfs_flush_inodes(struct super_block *sb, struct inode *i1,
                      struct inode *i2);
 int inode_write_data(struct inode *inode, const void *data, size_t bytes);
-struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
-                               struct dentry *dentry,
-                               const struct cpu_str *uni, umode_t mode,
-                               dev_t dev, const char *symname, u32 size,
-                               struct ntfs_fnd *fnd);
+int ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
+                     struct dentry *dentry, const struct cpu_str *uni,
+                     umode_t mode, dev_t dev, const char *symname, u32 size,
+                     struct ntfs_fnd *fnd);
 int ntfs_link_inode(struct inode *inode, struct dentry *dentry);
 int ntfs_unlink_inode(struct inode *dir, const struct dentry *dentry);
 void ntfs_evict_inode(struct inode *inode);