1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Squashfs - a compressed read only filesystem for Linux
5 * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
6 * Phillip Lougher <phillip@squashfs.org.uk>
12 * This file implements code to create and read inodes from disk.
14 * Inodes in Squashfs are identified by a 48-bit inode which encodes the
15 * location of the compressed metadata block containing the inode, and the byte
16 * offset into that block where the inode is placed (<block, offset>).
18 * To maximise compression there are different inodes for each file type
19 * (regular file, directory, device, etc.), the inode contents and length
20 * varying with the type.
22 * To further maximise compression, two types of regular file inode and
23 * directory inode are defined: inodes optimised for frequently occurring
24 * regular files and directories, and extended types where extra
25 * information has to be stored.
29 #include <linux/vfs.h>
30 #include <linux/xattr.h>
31 #include <linux/pagemap.h>
33 #include "squashfs_fs.h"
34 #include "squashfs_fs_sb.h"
35 #include "squashfs_fs_i.h"
40 * Initialise VFS inode with the base inode information common to all
41 * Squashfs inode types. Sqsh_ino contains the unswapped base inode
44 static int squashfs_new_inode(struct super_block
*sb
, struct inode
*inode
,
45 struct squashfs_base_inode
*sqsh_ino
)
51 err
= squashfs_get_id(sb
, le16_to_cpu(sqsh_ino
->uid
), &i_uid
);
55 err
= squashfs_get_id(sb
, le16_to_cpu(sqsh_ino
->guid
), &i_gid
);
59 i_uid_write(inode
, i_uid
);
60 i_gid_write(inode
, i_gid
);
61 inode
->i_ino
= le32_to_cpu(sqsh_ino
->inode_number
);
62 inode
->i_mtime
.tv_sec
= le32_to_cpu(sqsh_ino
->mtime
);
63 inode
->i_atime
.tv_sec
= inode
->i_mtime
.tv_sec
;
64 inode
->i_ctime
.tv_sec
= inode
->i_mtime
.tv_sec
;
65 inode
->i_mode
= le16_to_cpu(sqsh_ino
->mode
);
72 struct inode
*squashfs_iget(struct super_block
*sb
, long long ino
,
73 unsigned int ino_number
)
75 struct inode
*inode
= iget_locked(sb
, ino_number
);
78 TRACE("Entered squashfs_iget\n");
81 return ERR_PTR(-ENOMEM
);
82 if (!(inode
->i_state
& I_NEW
))
85 err
= squashfs_read_inode(inode
, ino
);
91 unlock_new_inode(inode
);
97 * Initialise VFS inode by reading inode from inode table (compressed
98 * metadata). The format and amount of data read depends on type.
100 int squashfs_read_inode(struct inode
*inode
, long long ino
)
102 struct super_block
*sb
= inode
->i_sb
;
103 struct squashfs_sb_info
*msblk
= sb
->s_fs_info
;
104 u64 block
= SQUASHFS_INODE_BLK(ino
) + msblk
->inode_table
;
105 int err
, type
, offset
= SQUASHFS_INODE_OFFSET(ino
);
106 union squashfs_inode squashfs_ino
;
107 struct squashfs_base_inode
*sqshb_ino
= &squashfs_ino
.base
;
108 int xattr_id
= SQUASHFS_INVALID_XATTR
;
110 TRACE("Entered squashfs_read_inode\n");
113 * Read inode base common to all inode types.
115 err
= squashfs_read_metadata(sb
, sqshb_ino
, &block
,
116 &offset
, sizeof(*sqshb_ino
));
120 err
= squashfs_new_inode(sb
, inode
, sqshb_ino
);
124 block
= SQUASHFS_INODE_BLK(ino
) + msblk
->inode_table
;
125 offset
= SQUASHFS_INODE_OFFSET(ino
);
127 type
= le16_to_cpu(sqshb_ino
->inode_type
);
129 case SQUASHFS_REG_TYPE
: {
130 unsigned int frag_offset
, frag
;
133 struct squashfs_reg_inode
*sqsh_ino
= &squashfs_ino
.reg
;
135 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
140 frag
= le32_to_cpu(sqsh_ino
->fragment
);
141 if (frag
!= SQUASHFS_INVALID_FRAG
) {
142 frag_offset
= le32_to_cpu(sqsh_ino
->offset
);
143 frag_size
= squashfs_frag_lookup(sb
, frag
, &frag_blk
);
149 frag_blk
= SQUASHFS_INVALID_BLK
;
155 inode
->i_size
= le32_to_cpu(sqsh_ino
->file_size
);
156 inode
->i_fop
= &generic_ro_fops
;
157 inode
->i_mode
|= S_IFREG
;
158 inode
->i_blocks
= ((inode
->i_size
- 1) >> 9) + 1;
159 squashfs_i(inode
)->fragment_block
= frag_blk
;
160 squashfs_i(inode
)->fragment_size
= frag_size
;
161 squashfs_i(inode
)->fragment_offset
= frag_offset
;
162 squashfs_i(inode
)->start
= le32_to_cpu(sqsh_ino
->start_block
);
163 squashfs_i(inode
)->block_list_start
= block
;
164 squashfs_i(inode
)->offset
= offset
;
165 inode
->i_data
.a_ops
= &squashfs_aops
;
167 TRACE("File inode %x:%x, start_block %llx, block_list_start "
168 "%llx, offset %x\n", SQUASHFS_INODE_BLK(ino
),
169 offset
, squashfs_i(inode
)->start
, block
, offset
);
172 case SQUASHFS_LREG_TYPE
: {
173 unsigned int frag_offset
, frag
;
176 struct squashfs_lreg_inode
*sqsh_ino
= &squashfs_ino
.lreg
;
178 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
183 frag
= le32_to_cpu(sqsh_ino
->fragment
);
184 if (frag
!= SQUASHFS_INVALID_FRAG
) {
185 frag_offset
= le32_to_cpu(sqsh_ino
->offset
);
186 frag_size
= squashfs_frag_lookup(sb
, frag
, &frag_blk
);
192 frag_blk
= SQUASHFS_INVALID_BLK
;
197 xattr_id
= le32_to_cpu(sqsh_ino
->xattr
);
198 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
199 inode
->i_size
= le64_to_cpu(sqsh_ino
->file_size
);
200 inode
->i_op
= &squashfs_inode_ops
;
201 inode
->i_fop
= &generic_ro_fops
;
202 inode
->i_mode
|= S_IFREG
;
203 inode
->i_blocks
= (inode
->i_size
-
204 le64_to_cpu(sqsh_ino
->sparse
) + 511) >> 9;
206 squashfs_i(inode
)->fragment_block
= frag_blk
;
207 squashfs_i(inode
)->fragment_size
= frag_size
;
208 squashfs_i(inode
)->fragment_offset
= frag_offset
;
209 squashfs_i(inode
)->start
= le64_to_cpu(sqsh_ino
->start_block
);
210 squashfs_i(inode
)->block_list_start
= block
;
211 squashfs_i(inode
)->offset
= offset
;
212 inode
->i_data
.a_ops
= &squashfs_aops
;
214 TRACE("File inode %x:%x, start_block %llx, block_list_start "
215 "%llx, offset %x\n", SQUASHFS_INODE_BLK(ino
),
216 offset
, squashfs_i(inode
)->start
, block
, offset
);
219 case SQUASHFS_DIR_TYPE
: {
220 struct squashfs_dir_inode
*sqsh_ino
= &squashfs_ino
.dir
;
222 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
227 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
228 inode
->i_size
= le16_to_cpu(sqsh_ino
->file_size
);
229 inode
->i_op
= &squashfs_dir_inode_ops
;
230 inode
->i_fop
= &squashfs_dir_ops
;
231 inode
->i_mode
|= S_IFDIR
;
232 squashfs_i(inode
)->start
= le32_to_cpu(sqsh_ino
->start_block
);
233 squashfs_i(inode
)->offset
= le16_to_cpu(sqsh_ino
->offset
);
234 squashfs_i(inode
)->dir_idx_cnt
= 0;
235 squashfs_i(inode
)->parent
= le32_to_cpu(sqsh_ino
->parent_inode
);
237 TRACE("Directory inode %x:%x, start_block %llx, offset %x\n",
238 SQUASHFS_INODE_BLK(ino
), offset
,
239 squashfs_i(inode
)->start
,
240 le16_to_cpu(sqsh_ino
->offset
));
243 case SQUASHFS_LDIR_TYPE
: {
244 struct squashfs_ldir_inode
*sqsh_ino
= &squashfs_ino
.ldir
;
246 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
251 xattr_id
= le32_to_cpu(sqsh_ino
->xattr
);
252 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
253 inode
->i_size
= le32_to_cpu(sqsh_ino
->file_size
);
254 inode
->i_op
= &squashfs_dir_inode_ops
;
255 inode
->i_fop
= &squashfs_dir_ops
;
256 inode
->i_mode
|= S_IFDIR
;
257 squashfs_i(inode
)->start
= le32_to_cpu(sqsh_ino
->start_block
);
258 squashfs_i(inode
)->offset
= le16_to_cpu(sqsh_ino
->offset
);
259 squashfs_i(inode
)->dir_idx_start
= block
;
260 squashfs_i(inode
)->dir_idx_offset
= offset
;
261 squashfs_i(inode
)->dir_idx_cnt
= le16_to_cpu(sqsh_ino
->i_count
);
262 squashfs_i(inode
)->parent
= le32_to_cpu(sqsh_ino
->parent_inode
);
264 TRACE("Long directory inode %x:%x, start_block %llx, offset "
265 "%x\n", SQUASHFS_INODE_BLK(ino
), offset
,
266 squashfs_i(inode
)->start
,
267 le16_to_cpu(sqsh_ino
->offset
));
270 case SQUASHFS_SYMLINK_TYPE
:
271 case SQUASHFS_LSYMLINK_TYPE
: {
272 struct squashfs_symlink_inode
*sqsh_ino
= &squashfs_ino
.symlink
;
274 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
279 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
280 inode
->i_size
= le32_to_cpu(sqsh_ino
->symlink_size
);
281 inode
->i_op
= &squashfs_symlink_inode_ops
;
282 inode_nohighmem(inode
);
283 inode
->i_data
.a_ops
= &squashfs_symlink_aops
;
284 inode
->i_mode
|= S_IFLNK
;
285 squashfs_i(inode
)->start
= block
;
286 squashfs_i(inode
)->offset
= offset
;
288 if (type
== SQUASHFS_LSYMLINK_TYPE
) {
291 err
= squashfs_read_metadata(sb
, NULL
, &block
,
292 &offset
, inode
->i_size
);
295 err
= squashfs_read_metadata(sb
, &xattr
, &block
,
296 &offset
, sizeof(xattr
));
299 xattr_id
= le32_to_cpu(xattr
);
302 TRACE("Symbolic link inode %x:%x, start_block %llx, offset "
303 "%x\n", SQUASHFS_INODE_BLK(ino
), offset
,
307 case SQUASHFS_BLKDEV_TYPE
:
308 case SQUASHFS_CHRDEV_TYPE
: {
309 struct squashfs_dev_inode
*sqsh_ino
= &squashfs_ino
.dev
;
312 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
317 if (type
== SQUASHFS_CHRDEV_TYPE
)
318 inode
->i_mode
|= S_IFCHR
;
320 inode
->i_mode
|= S_IFBLK
;
321 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
322 rdev
= le32_to_cpu(sqsh_ino
->rdev
);
323 init_special_inode(inode
, inode
->i_mode
, new_decode_dev(rdev
));
325 TRACE("Device inode %x:%x, rdev %x\n",
326 SQUASHFS_INODE_BLK(ino
), offset
, rdev
);
329 case SQUASHFS_LBLKDEV_TYPE
:
330 case SQUASHFS_LCHRDEV_TYPE
: {
331 struct squashfs_ldev_inode
*sqsh_ino
= &squashfs_ino
.ldev
;
334 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
339 if (type
== SQUASHFS_LCHRDEV_TYPE
)
340 inode
->i_mode
|= S_IFCHR
;
342 inode
->i_mode
|= S_IFBLK
;
343 xattr_id
= le32_to_cpu(sqsh_ino
->xattr
);
344 inode
->i_op
= &squashfs_inode_ops
;
345 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
346 rdev
= le32_to_cpu(sqsh_ino
->rdev
);
347 init_special_inode(inode
, inode
->i_mode
, new_decode_dev(rdev
));
349 TRACE("Device inode %x:%x, rdev %x\n",
350 SQUASHFS_INODE_BLK(ino
), offset
, rdev
);
353 case SQUASHFS_FIFO_TYPE
:
354 case SQUASHFS_SOCKET_TYPE
: {
355 struct squashfs_ipc_inode
*sqsh_ino
= &squashfs_ino
.ipc
;
357 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
362 if (type
== SQUASHFS_FIFO_TYPE
)
363 inode
->i_mode
|= S_IFIFO
;
365 inode
->i_mode
|= S_IFSOCK
;
366 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
367 init_special_inode(inode
, inode
->i_mode
, 0);
370 case SQUASHFS_LFIFO_TYPE
:
371 case SQUASHFS_LSOCKET_TYPE
: {
372 struct squashfs_lipc_inode
*sqsh_ino
= &squashfs_ino
.lipc
;
374 err
= squashfs_read_metadata(sb
, sqsh_ino
, &block
, &offset
,
379 if (type
== SQUASHFS_LFIFO_TYPE
)
380 inode
->i_mode
|= S_IFIFO
;
382 inode
->i_mode
|= S_IFSOCK
;
383 xattr_id
= le32_to_cpu(sqsh_ino
->xattr
);
384 inode
->i_op
= &squashfs_inode_ops
;
385 set_nlink(inode
, le32_to_cpu(sqsh_ino
->nlink
));
386 init_special_inode(inode
, inode
->i_mode
, 0);
390 ERROR("Unknown inode type %d in squashfs_iget!\n", type
);
394 if (xattr_id
!= SQUASHFS_INVALID_XATTR
&& msblk
->xattr_id_table
) {
395 err
= squashfs_xattr_lookup(sb
, xattr_id
,
396 &squashfs_i(inode
)->xattr_count
,
397 &squashfs_i(inode
)->xattr_size
,
398 &squashfs_i(inode
)->xattr
);
401 inode
->i_blocks
+= ((squashfs_i(inode
)->xattr_size
- 1) >> 9)
404 squashfs_i(inode
)->xattr_count
= 0;
409 ERROR("Unable to read inode 0x%llx\n", ino
);
414 const struct inode_operations squashfs_inode_ops
= {
415 .listxattr
= squashfs_listxattr