squashfs: make squashfs_cache_init() return ERR_PTR(-ENOMEM)
authorPhillip Lougher <phillip@squashfs.org.uk>
Sun, 29 Dec 2024 23:37:49 +0000 (23:37 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 25 Jan 2025 06:45:34 +0000 (22:45 -0800)
Patch series "squashfs: reduce memory usage and update docs".

This patchset reduces the amount of memory that Squashfs uses when
CONFIG_FILE_DIRECT is configured, and updates various out of date
information in the documentation and Kconfig.

This patch (of 4):

Make squashfs_cache_init() return an ERR_PTR(-ENOMEM) on failure rather
than NULL.

This tidies up some calling code, but, it also allows NULL to be returned
as a valid result when a cache hasn't be allocated.

Link: https://lkml.kernel.org/r/20241229233752.54481-1-phillip@squashfs.org.uk
Link: https://lkml.kernel.org/r/20241229233752.54481-2-phillip@squashfs.org.uk
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/squashfs/cache.c
fs/squashfs/super.c

index 5062326d0efb7123f08a1c45d53532e570dbe174..4db0d2b0aab8f5139bee7d5d0bbb953a18b6aaa7 100644 (file)
@@ -224,11 +224,15 @@ struct squashfs_cache *squashfs_cache_init(char *name, int entries,
        int block_size)
 {
        int i, j;
-       struct squashfs_cache *cache = kzalloc(sizeof(*cache), GFP_KERNEL);
+       struct squashfs_cache *cache;
 
+       if (entries == 0)
+               return NULL;
+
+       cache = kzalloc(sizeof(*cache), GFP_KERNEL);
        if (cache == NULL) {
                ERROR("Failed to allocate %s cache\n", name);
-               return NULL;
+               return ERR_PTR(-ENOMEM);
        }
 
        cache->entry = kcalloc(entries, sizeof(*(cache->entry)), GFP_KERNEL);
@@ -281,7 +285,7 @@ struct squashfs_cache *squashfs_cache_init(char *name, int entries,
 
 cleanup:
        squashfs_cache_delete(cache);
-       return NULL;
+       return ERR_PTR(-ENOMEM);
 }
 
 
index 269c6d61bc297fe63e7457f15efa1b51686f81fd..fedae8dbc5de502da02260d121c28c9ac02791a1 100644 (file)
@@ -314,26 +314,29 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
        sb->s_flags |= SB_RDONLY;
        sb->s_op = &squashfs_super_ops;
 
-       err = -ENOMEM;
-
        msblk->block_cache = squashfs_cache_init("metadata",
                        SQUASHFS_CACHED_BLKS, SQUASHFS_METADATA_SIZE);
-       if (msblk->block_cache == NULL)
+       if (IS_ERR(msblk->block_cache)) {
+               err = PTR_ERR(msblk->block_cache);
                goto failed_mount;
+       }
 
        /* Allocate read_page block */
        msblk->read_page = squashfs_cache_init("data",
                msblk->max_thread_num, msblk->block_size);
-       if (msblk->read_page == NULL) {
+       if (IS_ERR(msblk->read_page)) {
                errorf(fc, "Failed to allocate read_page block");
+               err = PTR_ERR(msblk->read_page);
                goto failed_mount;
        }
 
        if (msblk->devblksize == PAGE_SIZE) {
                struct inode *cache = new_inode(sb);
 
-               if (cache == NULL)
+               if (cache == NULL) {
+                       err = -ENOMEM;
                        goto failed_mount;
+               }
 
                set_nlink(cache, 1);
                cache->i_size = OFFSET_MAX;
@@ -406,8 +409,8 @@ handle_fragments:
 
        msblk->fragment_cache = squashfs_cache_init("fragment",
                min(SQUASHFS_CACHED_FRAGMENTS, fragments), msblk->block_size);
-       if (msblk->fragment_cache == NULL) {
-               err = -ENOMEM;
+       if (IS_ERR(msblk->fragment_cache)) {
+               err = PTR_ERR(msblk->fragment_cache);
                goto failed_mount;
        }