brintos

brintos / linux-shallow public Read only

0
0
Text · 1.9 KiB · 6f16188 Raw
92 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 20134 * Phillip Lougher <phillip@squashfs.org.uk>5 */6 7#include <linux/types.h>8#include <linux/mutex.h>9#include <linux/slab.h>10#include <linux/bio.h>11 12#include "squashfs_fs.h"13#include "squashfs_fs_sb.h"14#include "decompressor.h"15#include "squashfs.h"16 17/*18 * This file implements single-threaded decompression in the19 * decompressor framework20 */21 22struct squashfs_stream {23	void		*stream;24	struct mutex	mutex;25};26 27static void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,28						void *comp_opts)29{30	struct squashfs_stream *stream;31	int err = -ENOMEM;32 33	stream = kmalloc(sizeof(*stream), GFP_KERNEL);34	if (stream == NULL)35		goto out;36 37	stream->stream = msblk->decompressor->init(msblk, comp_opts);38	if (IS_ERR(stream->stream)) {39		err = PTR_ERR(stream->stream);40		goto out;41	}42 43	kfree(comp_opts);44	mutex_init(&stream->mutex);45	return stream;46 47out:48	kfree(stream);49	return ERR_PTR(err);50}51 52static void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)53{54	struct squashfs_stream *stream = msblk->stream;55 56	if (stream) {57		msblk->decompressor->free(stream->stream);58		kfree(stream);59	}60}61 62static int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,63			int offset, int length,64			struct squashfs_page_actor *output)65{66	int res;67	struct squashfs_stream *stream = msblk->stream;68 69	mutex_lock(&stream->mutex);70	res = msblk->decompressor->decompress(msblk, stream->stream, bio,71		offset, length, output);72	mutex_unlock(&stream->mutex);73 74	if (res < 0)75		ERROR("%s decompression failed, data probably corrupt\n",76			msblk->decompressor->name);77 78	return res;79}80 81static int squashfs_max_decompressors(void)82{83	return 1;84}85 86const struct squashfs_decompressor_thread_ops squashfs_decompressor_single = {87	.create = squashfs_decompressor_create,88	.destroy = squashfs_decompressor_destroy,89	.decompress = squashfs_decompress,90	.max_decompressors = squashfs_max_decompressors,91};92