Commit 062e27ec1b49d12bdb1ecc94d74b5fee5a5775db
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
Showing 9 changed files Side-by-side Diff
Documentation/filesystems/squashfs.txt
... | ... | @@ -2,7 +2,7 @@ |
2 | 2 | ======================= |
3 | 3 | |
4 | 4 | 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. | |
6 | 6 | Inodes in the system are very small and all blocks are packed to minimise |
7 | 7 | data overhead. Block sizes greater than 4K are supported up to a maximum |
8 | 8 | of 1Mbytes (default block size 128K). |
fs/squashfs/Kconfig
... | ... | @@ -5,13 +5,13 @@ |
5 | 5 | help |
6 | 6 | Saying Y here includes support for SquashFS 4.0 (a Compressed |
7 | 7 | 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 | |
9 | 9 | files, inodes and directories. Inodes in the system are very small |
10 | 10 | and all blocks are packed to minimise data overhead. Block sizes |
11 | 11 | greater than 4K are supported up to a maximum of 1 Mbytes (default |
12 | 12 | block size 128K). SquashFS 4.0 supports 64 bit filesystems and files |
13 | 13 | (larger than 4GB), full uid/gid information, hard links and |
14 | - timestamps. | |
14 | + timestamps. | |
15 | 15 | |
16 | 16 | Squashfs is intended for general read-only filesystem use, for |
17 | 17 | archival use (i.e. in cases where a .tar.gz file may be used), and in |
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | |
27 | 27 | If unsure, say N. |
28 | 28 | |
29 | -config SQUASHFS_XATTRS | |
29 | +config SQUASHFS_XATTR | |
30 | 30 | bool "Squashfs XATTR support" |
31 | 31 | depends on SQUASHFS |
32 | 32 | default n |
33 | 33 | |
... | ... | @@ -37,9 +37,24 @@ |
37 | 37 | |
38 | 38 | If unsure, say N. |
39 | 39 | |
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. | |
41 | 50 | |
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" | |
43 | 58 | depends on SQUASHFS |
44 | 59 | default n |
45 | 60 | help |
fs/squashfs/Makefile
... | ... | @@ -5,5 +5,6 @@ |
5 | 5 | obj-$(CONFIG_SQUASHFS) += squashfs.o |
6 | 6 | squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o |
7 | 7 | squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o |
8 | -squashfs-$(CONFIG_SQUASHFS_XATTRS) += xattr.o xattr_id.o | |
8 | +squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o | |
9 | +squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o |
fs/squashfs/decompressor.c
... | ... | @@ -40,9 +40,11 @@ |
40 | 40 | NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0 |
41 | 41 | }; |
42 | 42 | |
43 | +#ifndef CONFIG_SQUASHFS_LZO | |
43 | 44 | static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = { |
44 | 45 | NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0 |
45 | 46 | }; |
47 | +#endif | |
46 | 48 | |
47 | 49 | static const struct squashfs_decompressor squashfs_unknown_comp_ops = { |
48 | 50 | NULL, NULL, NULL, 0, "unknown", 0 |
49 | 51 | |
... | ... | @@ -51,7 +53,11 @@ |
51 | 53 | static const struct squashfs_decompressor *decompressor[] = { |
52 | 54 | &squashfs_zlib_comp_ops, |
53 | 55 | &squashfs_lzma_unsupported_comp_ops, |
56 | +#ifdef CONFIG_SQUASHFS_LZO | |
57 | + &squashfs_lzo_comp_ops, | |
58 | +#else | |
54 | 59 | &squashfs_lzo_unsupported_comp_ops, |
60 | +#endif | |
55 | 61 | &squashfs_unknown_comp_ops |
56 | 62 | }; |
57 | 63 |
fs/squashfs/lzo_wrapper.c
1 | +/* | |
2 | + * Squashfs - a compressed read only filesystem for Linux | |
3 | + * | |
4 | + * Copyright (c) 2010 LG Electronics | |
5 | + * Chan Jeong <chan.jeong@lge.com> | |
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
fs/squashfs/squashfs_fs.h
... | ... | @@ -274,7 +274,7 @@ |
274 | 274 | __le16 uid; |
275 | 275 | __le16 guid; |
276 | 276 | __le32 mtime; |
277 | - __le32 inode_number; | |
277 | + __le32 inode_number; | |
278 | 278 | }; |
279 | 279 | |
280 | 280 | struct squashfs_ipc_inode { |
... | ... | @@ -283,7 +283,7 @@ |
283 | 283 | __le16 uid; |
284 | 284 | __le16 guid; |
285 | 285 | __le32 mtime; |
286 | - __le32 inode_number; | |
286 | + __le32 inode_number; | |
287 | 287 | __le32 nlink; |
288 | 288 | }; |
289 | 289 | |
... | ... | @@ -293,7 +293,7 @@ |
293 | 293 | __le16 uid; |
294 | 294 | __le16 guid; |
295 | 295 | __le32 mtime; |
296 | - __le32 inode_number; | |
296 | + __le32 inode_number; | |
297 | 297 | __le32 nlink; |
298 | 298 | __le32 xattr; |
299 | 299 | }; |
... | ... | @@ -304,7 +304,7 @@ |
304 | 304 | __le16 uid; |
305 | 305 | __le16 guid; |
306 | 306 | __le32 mtime; |
307 | - __le32 inode_number; | |
307 | + __le32 inode_number; | |
308 | 308 | __le32 nlink; |
309 | 309 | __le32 rdev; |
310 | 310 | }; |
... | ... | @@ -315,7 +315,7 @@ |
315 | 315 | __le16 uid; |
316 | 316 | __le16 guid; |
317 | 317 | __le32 mtime; |
318 | - __le32 inode_number; | |
318 | + __le32 inode_number; | |
319 | 319 | __le32 nlink; |
320 | 320 | __le32 rdev; |
321 | 321 | __le32 xattr; |
... | ... | @@ -327,7 +327,7 @@ |
327 | 327 | __le16 uid; |
328 | 328 | __le16 guid; |
329 | 329 | __le32 mtime; |
330 | - __le32 inode_number; | |
330 | + __le32 inode_number; | |
331 | 331 | __le32 nlink; |
332 | 332 | __le32 symlink_size; |
333 | 333 | char symlink[0]; |
... | ... | @@ -339,7 +339,7 @@ |
339 | 339 | __le16 uid; |
340 | 340 | __le16 guid; |
341 | 341 | __le32 mtime; |
342 | - __le32 inode_number; | |
342 | + __le32 inode_number; | |
343 | 343 | __le32 start_block; |
344 | 344 | __le32 fragment; |
345 | 345 | __le32 offset; |
... | ... | @@ -353,7 +353,7 @@ |
353 | 353 | __le16 uid; |
354 | 354 | __le16 guid; |
355 | 355 | __le32 mtime; |
356 | - __le32 inode_number; | |
356 | + __le32 inode_number; | |
357 | 357 | __le64 start_block; |
358 | 358 | __le64 file_size; |
359 | 359 | __le64 sparse; |
... | ... | @@ -370,7 +370,7 @@ |
370 | 370 | __le16 uid; |
371 | 371 | __le16 guid; |
372 | 372 | __le32 mtime; |
373 | - __le32 inode_number; | |
373 | + __le32 inode_number; | |
374 | 374 | __le32 start_block; |
375 | 375 | __le32 nlink; |
376 | 376 | __le16 file_size; |
... | ... | @@ -384,7 +384,7 @@ |
384 | 384 | __le16 uid; |
385 | 385 | __le16 guid; |
386 | 386 | __le32 mtime; |
387 | - __le32 inode_number; | |
387 | + __le32 inode_number; | |
388 | 388 | __le32 nlink; |
389 | 389 | __le32 file_size; |
390 | 390 | __le32 start_block; |
fs/squashfs/xattr.c
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 | * along with this program; if not, write to the Free Software |
19 | 19 | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
20 | 20 | * |
21 | - * xattr_id.c | |
21 | + * xattr.c | |
22 | 22 | */ |
23 | 23 | |
24 | 24 | #include <linux/init.h> |
... | ... | @@ -295,7 +295,7 @@ |
295 | 295 | .get = squashfs_security_get |
296 | 296 | }; |
297 | 297 | |
298 | -static inline const struct xattr_handler *squashfs_xattr_handler(int type) | |
298 | +static const struct xattr_handler *squashfs_xattr_handler(int type) | |
299 | 299 | { |
300 | 300 | if (type & ~(SQUASHFS_XATTR_PREFIX_MASK | SQUASHFS_XATTR_VALUE_OOL)) |
301 | 301 | /* ignore unrecognised type */ |
fs/squashfs/xattr.h
... | ... | @@ -21,7 +21,7 @@ |
21 | 21 | * xattr.h |
22 | 22 | */ |
23 | 23 | |
24 | -#ifdef CONFIG_SQUASHFS_XATTRS | |
24 | +#ifdef CONFIG_SQUASHFS_XATTR | |
25 | 25 | extern __le64 *squashfs_read_xattr_id_table(struct super_block *, u64, |
26 | 26 | u64 *, int *); |
27 | 27 | extern int squashfs_xattr_lookup(struct super_block *, unsigned int, int *, |