Skip to content

Commit 062e27e

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus
* git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus: Squashfs: fix checkpatch.pl warnings Squashfs: fix filename typo Squashfs: update Kconfig and documentation for LZO Squashfs: fix block size use in LZO decompressor Squashfs: Add LZO compression support squashfs: fix filename in header comment Squashfs: Make XATTR config name consistent with other file systems squashfs: fix compiler inline warning
2 parents bf25db3 + 66048c3 commit 062e27e

File tree

9 files changed

+181
-21
lines changed

9 files changed

+181
-21
lines changed

Documentation/filesystems/squashfs.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ SQUASHFS 4.0 FILESYSTEM
22
=======================
33

44
Squashfs is a compressed read-only filesystem for Linux.
5-
It uses zlib compression to compress files, inodes and directories.
5+
It uses zlib/lzo compression to compress files, inodes and directories.
66
Inodes in the system are very small and all blocks are packed to minimise
77
data overhead. Block sizes greater than 4K are supported up to a maximum
88
of 1Mbytes (default block size 128K).

fs/squashfs/Kconfig

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ config SQUASHFS
55
help
66
Saying Y here includes support for SquashFS 4.0 (a Compressed
77
Read-Only File System). Squashfs is a highly compressed read-only
8-
filesystem for Linux. It uses zlib compression to compress both
8+
filesystem for Linux. It uses zlib/lzo compression to compress both
99
files, inodes and directories. Inodes in the system are very small
1010
and all blocks are packed to minimise data overhead. Block sizes
1111
greater than 4K are supported up to a maximum of 1 Mbytes (default
1212
block size 128K). SquashFS 4.0 supports 64 bit filesystems and files
1313
(larger than 4GB), full uid/gid information, hard links and
14-
timestamps.
14+
timestamps.
1515

1616
Squashfs is intended for general read-only filesystem use, for
1717
archival use (i.e. in cases where a .tar.gz file may be used), and in
@@ -26,7 +26,7 @@ config SQUASHFS
2626

2727
If unsure, say N.
2828

29-
config SQUASHFS_XATTRS
29+
config SQUASHFS_XATTR
3030
bool "Squashfs XATTR support"
3131
depends on SQUASHFS
3232
default n
@@ -37,9 +37,24 @@ config SQUASHFS_XATTRS
3737

3838
If unsure, say N.
3939

40-
config SQUASHFS_EMBEDDED
40+
config SQUASHFS_LZO
41+
bool "Include support for LZO compressed file systems"
42+
depends on SQUASHFS
43+
default n
44+
select LZO_DECOMPRESS
45+
help
46+
Saying Y here includes support for reading Squashfs file systems
47+
compressed with LZO compresssion. LZO compression is mainly
48+
aimed at embedded systems with slower CPUs where the overheads
49+
of zlib are too high.
4150

42-
bool "Additional option for memory-constrained systems"
51+
LZO is not the standard compression used in Squashfs and so most
52+
file systems will be readable without selecting this option.
53+
54+
If unsure, say N.
55+
56+
config SQUASHFS_EMBEDDED
57+
bool "Additional option for memory-constrained systems"
4358
depends on SQUASHFS
4459
default n
4560
help

fs/squashfs/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
obj-$(CONFIG_SQUASHFS) += squashfs.o
66
squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
77
squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
8-
squashfs-$(CONFIG_SQUASHFS_XATTRS) += xattr.o xattr_id.o
9-
8+
squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o
9+
squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o

fs/squashfs/decompressor.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = {
4040
NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
4141
};
4242

43+
#ifndef CONFIG_SQUASHFS_LZO
4344
static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = {
4445
NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
4546
};
47+
#endif
4648

4749
static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
4850
NULL, NULL, NULL, 0, "unknown", 0
@@ -51,7 +53,11 @@ static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
5153
static const struct squashfs_decompressor *decompressor[] = {
5254
&squashfs_zlib_comp_ops,
5355
&squashfs_lzma_unsupported_comp_ops,
56+
#ifdef CONFIG_SQUASHFS_LZO
57+
&squashfs_lzo_comp_ops,
58+
#else
5459
&squashfs_lzo_unsupported_comp_ops,
60+
#endif
5561
&squashfs_unknown_comp_ops
5662
};
5763

fs/squashfs/lzo_wrapper.c

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* Squashfs - a compressed read only filesystem for Linux
3+
*
4+
* Copyright (c) 2010 LG Electronics
5+
* Chan Jeong <[email protected]>
6+
*
7+
* This program is free software; you can redistribute it and/or
8+
* modify it under the terms of the GNU General Public License
9+
* as published by the Free Software Foundation; either version 2,
10+
* or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program; if not, write to the Free Software
19+
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20+
*
21+
* lzo_wrapper.c
22+
*/
23+
24+
#include <linux/mutex.h>
25+
#include <linux/buffer_head.h>
26+
#include <linux/slab.h>
27+
#include <linux/vmalloc.h>
28+
#include <linux/lzo.h>
29+
30+
#include "squashfs_fs.h"
31+
#include "squashfs_fs_sb.h"
32+
#include "squashfs_fs_i.h"
33+
#include "squashfs.h"
34+
#include "decompressor.h"
35+
36+
struct squashfs_lzo {
37+
void *input;
38+
void *output;
39+
};
40+
41+
static void *lzo_init(struct squashfs_sb_info *msblk)
42+
{
43+
int block_size = max_t(int, msblk->block_size, SQUASHFS_METADATA_SIZE);
44+
45+
struct squashfs_lzo *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
46+
if (stream == NULL)
47+
goto failed;
48+
stream->input = vmalloc(block_size);
49+
if (stream->input == NULL)
50+
goto failed;
51+
stream->output = vmalloc(block_size);
52+
if (stream->output == NULL)
53+
goto failed2;
54+
55+
return stream;
56+
57+
failed2:
58+
vfree(stream->input);
59+
failed:
60+
ERROR("Failed to allocate lzo workspace\n");
61+
kfree(stream);
62+
return NULL;
63+
}
64+
65+
66+
static void lzo_free(void *strm)
67+
{
68+
struct squashfs_lzo *stream = strm;
69+
70+
if (stream) {
71+
vfree(stream->input);
72+
vfree(stream->output);
73+
}
74+
kfree(stream);
75+
}
76+
77+
78+
static int lzo_uncompress(struct squashfs_sb_info *msblk, void **buffer,
79+
struct buffer_head **bh, int b, int offset, int length, int srclength,
80+
int pages)
81+
{
82+
struct squashfs_lzo *stream = msblk->stream;
83+
void *buff = stream->input;
84+
int avail, i, bytes = length, res;
85+
size_t out_len = srclength;
86+
87+
mutex_lock(&msblk->read_data_mutex);
88+
89+
for (i = 0; i < b; i++) {
90+
wait_on_buffer(bh[i]);
91+
if (!buffer_uptodate(bh[i]))
92+
goto block_release;
93+
94+
avail = min(bytes, msblk->devblksize - offset);
95+
memcpy(buff, bh[i]->b_data + offset, avail);
96+
buff += avail;
97+
bytes -= avail;
98+
offset = 0;
99+
put_bh(bh[i]);
100+
}
101+
102+
res = lzo1x_decompress_safe(stream->input, (size_t)length,
103+
stream->output, &out_len);
104+
if (res != LZO_E_OK)
105+
goto failed;
106+
107+
res = bytes = (int)out_len;
108+
for (i = 0, buff = stream->output; bytes && i < pages; i++) {
109+
avail = min_t(int, bytes, PAGE_CACHE_SIZE);
110+
memcpy(buffer[i], buff, avail);
111+
buff += avail;
112+
bytes -= avail;
113+
}
114+
115+
mutex_unlock(&msblk->read_data_mutex);
116+
return res;
117+
118+
block_release:
119+
for (; i < b; i++)
120+
put_bh(bh[i]);
121+
122+
failed:
123+
mutex_unlock(&msblk->read_data_mutex);
124+
125+
ERROR("lzo decompression failed, data probably corrupt\n");
126+
return -EIO;
127+
}
128+
129+
const struct squashfs_decompressor squashfs_lzo_comp_ops = {
130+
.init = lzo_init,
131+
.free = lzo_free,
132+
.decompress = lzo_uncompress,
133+
.id = LZO_COMPRESSION,
134+
.name = "lzo",
135+
.supported = 1
136+
};

fs/squashfs/squashfs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,6 @@ extern const struct xattr_handler *squashfs_xattr_handlers[];
104104

105105
/* zlib_wrapper.c */
106106
extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
107+
108+
/* lzo_wrapper.c */
109+
extern const struct squashfs_decompressor squashfs_lzo_comp_ops;

fs/squashfs/squashfs_fs.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ struct squashfs_base_inode {
274274
__le16 uid;
275275
__le16 guid;
276276
__le32 mtime;
277-
__le32 inode_number;
277+
__le32 inode_number;
278278
};
279279

280280
struct squashfs_ipc_inode {
@@ -283,7 +283,7 @@ struct squashfs_ipc_inode {
283283
__le16 uid;
284284
__le16 guid;
285285
__le32 mtime;
286-
__le32 inode_number;
286+
__le32 inode_number;
287287
__le32 nlink;
288288
};
289289

@@ -293,7 +293,7 @@ struct squashfs_lipc_inode {
293293
__le16 uid;
294294
__le16 guid;
295295
__le32 mtime;
296-
__le32 inode_number;
296+
__le32 inode_number;
297297
__le32 nlink;
298298
__le32 xattr;
299299
};
@@ -304,7 +304,7 @@ struct squashfs_dev_inode {
304304
__le16 uid;
305305
__le16 guid;
306306
__le32 mtime;
307-
__le32 inode_number;
307+
__le32 inode_number;
308308
__le32 nlink;
309309
__le32 rdev;
310310
};
@@ -315,7 +315,7 @@ struct squashfs_ldev_inode {
315315
__le16 uid;
316316
__le16 guid;
317317
__le32 mtime;
318-
__le32 inode_number;
318+
__le32 inode_number;
319319
__le32 nlink;
320320
__le32 rdev;
321321
__le32 xattr;
@@ -327,7 +327,7 @@ struct squashfs_symlink_inode {
327327
__le16 uid;
328328
__le16 guid;
329329
__le32 mtime;
330-
__le32 inode_number;
330+
__le32 inode_number;
331331
__le32 nlink;
332332
__le32 symlink_size;
333333
char symlink[0];
@@ -339,7 +339,7 @@ struct squashfs_reg_inode {
339339
__le16 uid;
340340
__le16 guid;
341341
__le32 mtime;
342-
__le32 inode_number;
342+
__le32 inode_number;
343343
__le32 start_block;
344344
__le32 fragment;
345345
__le32 offset;
@@ -353,7 +353,7 @@ struct squashfs_lreg_inode {
353353
__le16 uid;
354354
__le16 guid;
355355
__le32 mtime;
356-
__le32 inode_number;
356+
__le32 inode_number;
357357
__le64 start_block;
358358
__le64 file_size;
359359
__le64 sparse;
@@ -370,7 +370,7 @@ struct squashfs_dir_inode {
370370
__le16 uid;
371371
__le16 guid;
372372
__le32 mtime;
373-
__le32 inode_number;
373+
__le32 inode_number;
374374
__le32 start_block;
375375
__le32 nlink;
376376
__le16 file_size;
@@ -384,7 +384,7 @@ struct squashfs_ldir_inode {
384384
__le16 uid;
385385
__le16 guid;
386386
__le32 mtime;
387-
__le32 inode_number;
387+
__le32 inode_number;
388388
__le32 nlink;
389389
__le32 file_size;
390390
__le32 start_block;

fs/squashfs/xattr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* along with this program; if not, write to the Free Software
1919
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2020
*
21-
* xattr_id.c
21+
* xattr.c
2222
*/
2323

2424
#include <linux/init.h>
@@ -295,7 +295,7 @@ static const struct xattr_handler squashfs_xattr_security_handler = {
295295
.get = squashfs_security_get
296296
};
297297

298-
static inline const struct xattr_handler *squashfs_xattr_handler(int type)
298+
static const struct xattr_handler *squashfs_xattr_handler(int type)
299299
{
300300
if (type & ~(SQUASHFS_XATTR_PREFIX_MASK | SQUASHFS_XATTR_VALUE_OOL))
301301
/* ignore unrecognised type */

fs/squashfs/xattr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* xattr.h
2222
*/
2323

24-
#ifdef CONFIG_SQUASHFS_XATTRS
24+
#ifdef CONFIG_SQUASHFS_XATTR
2525
extern __le64 *squashfs_read_xattr_id_table(struct super_block *, u64,
2626
u64 *, int *);
2727
extern int squashfs_xattr_lookup(struct super_block *, unsigned int, int *,

0 commit comments

Comments
 (0)