[PATCH 3/3] fs: Use iget_locked() rather than squashfs specific function

Sascha Hauer s.hauer at pengutronix.de
Mon Aug 10 07:12:12 EDT 2020


Use iget_locked() to let the core allocate the inode. This properly
initializes all fields in the new inode, especially it adds the new
inode to the list of all inodes for the filesystem. This prevents a NULL
pointer derefence when iput() removes the inode from that list.

This fixes squashfs support which is broken since 43902e5763 ("fs: free
inodes we no longer need")

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 fs/squashfs/inode.c    | 18 +-----------------
 fs/squashfs/squashfs.h |  1 -
 2 files changed, 1 insertion(+), 18 deletions(-)

diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c
index 470536e589..64155d47db 100644
--- a/fs/squashfs/inode.c
+++ b/fs/squashfs/inode.c
@@ -44,22 +44,6 @@
 #include "squashfs_fs_i.h"
 #include "squashfs.h"
 
-struct inode *iget_locked_squashfs(struct super_block *sb, unsigned long ino)
-{
-	struct inode *inode;
-	struct squashfs_inode_info *ei;
-
-	ei = malloc(sizeof(struct squashfs_inode_info));
-	inode = &ei->vfs_inode;
-	if (inode) {
-		inode->i_ino = ino;
-		inode->i_sb = sb;
-		inode->i_state = I_SYNC | I_NEW;
-	}
-
-	return inode;
-}
-
 /*
  * Initialise VFS inode with the base inode information common to all
  * Squashfs inode types.  Sqsh_ino contains the unswapped base inode
@@ -94,7 +78,7 @@ static int squashfs_new_inode(struct super_block *sb, struct inode *inode,
 struct inode *squashfs_iget(struct super_block *sb, long long ino,
 				unsigned int ino_number)
 {
-	struct inode *inode = iget_locked_squashfs(sb, ino_number);
+	struct inode *inode = iget_locked(sb, ino_number);
 	int err;
 
 	TRACE("Entered squashfs_iget\n");
diff --git a/fs/squashfs/squashfs.h b/fs/squashfs/squashfs.h
index 31c9bc454e..825df2aedd 100644
--- a/fs/squashfs/squashfs.h
+++ b/fs/squashfs/squashfs.h
@@ -52,7 +52,6 @@ static inline struct squashfs_page *squashfs_page(struct page *page)
 
 #define WARNING(s, args...)	pr_warn("SQUASHFS: "s, ## args)
 
-struct inode *iget_locked_squashfs(struct super_block *sb, unsigned long ino);
 char *squashfs_devread(struct squashfs_sb_info *fs, int byte_offset,
 		int byte_len);
 extern int squashfs_mount(struct fs_device_d *fsdev,
-- 
2.28.0




More information about the barebox mailing list