xref: /kernel/linux/linux-5.10/fs/cramfs/inode.c (revision 8c2ecf20)
1/*
2 * Compressed rom filesystem for Linux.
3 *
4 * Copyright (C) 1999 Linus Torvalds.
5 *
6 * This file is released under the GPL.
7 */
8
9/*
10 * These are the VFS interfaces to the compressed rom filesystem.
11 * The actual compression is based on zlib, see the other files.
12 */
13
14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15
16#include <linux/module.h>
17#include <linux/fs.h>
18#include <linux/file.h>
19#include <linux/pagemap.h>
20#include <linux/pfn_t.h>
21#include <linux/ramfs.h>
22#include <linux/init.h>
23#include <linux/string.h>
24#include <linux/blkdev.h>
25#include <linux/mtd/mtd.h>
26#include <linux/mtd/super.h>
27#include <linux/fs_context.h>
28#include <linux/slab.h>
29#include <linux/vfs.h>
30#include <linux/mutex.h>
31#include <uapi/linux/cramfs_fs.h>
32#include <linux/uaccess.h>
33
34#include "internal.h"
35
36/*
37 * cramfs super-block data in memory
38 */
39struct cramfs_sb_info {
40	unsigned long magic;
41	unsigned long size;
42	unsigned long blocks;
43	unsigned long files;
44	unsigned long flags;
45	void *linear_virt_addr;
46	resource_size_t linear_phys_addr;
47	size_t mtd_point_size;
48};
49
50static inline struct cramfs_sb_info *CRAMFS_SB(struct super_block *sb)
51{
52	return sb->s_fs_info;
53}
54
55static const struct super_operations cramfs_ops;
56static const struct inode_operations cramfs_dir_inode_operations;
57static const struct file_operations cramfs_directory_operations;
58static const struct file_operations cramfs_physmem_fops;
59static const struct address_space_operations cramfs_aops;
60
61static DEFINE_MUTEX(read_mutex);
62
63
64/* These macros may change in future, to provide better st_ino semantics. */
65#define OFFSET(x)	((x)->i_ino)
66
67static unsigned long cramino(const struct cramfs_inode *cino, unsigned int offset)
68{
69	if (!cino->offset)
70		return offset + 1;
71	if (!cino->size)
72		return offset + 1;
73
74	/*
75	 * The file mode test fixes buggy mkcramfs implementations where
76	 * cramfs_inode->offset is set to a non zero value for entries
77	 * which did not contain data, like devices node and fifos.
78	 */
79	switch (cino->mode & S_IFMT) {
80	case S_IFREG:
81	case S_IFDIR:
82	case S_IFLNK:
83		return cino->offset << 2;
84	default:
85		break;
86	}
87	return offset + 1;
88}
89
90static struct inode *get_cramfs_inode(struct super_block *sb,
91	const struct cramfs_inode *cramfs_inode, unsigned int offset)
92{
93	struct inode *inode;
94	static struct timespec64 zerotime;
95
96	inode = iget_locked(sb, cramino(cramfs_inode, offset));
97	if (!inode)
98		return ERR_PTR(-ENOMEM);
99	if (!(inode->i_state & I_NEW))
100		return inode;
101
102	switch (cramfs_inode->mode & S_IFMT) {
103	case S_IFREG:
104		inode->i_fop = &generic_ro_fops;
105		inode->i_data.a_ops = &cramfs_aops;
106		if (IS_ENABLED(CONFIG_CRAMFS_MTD) &&
107		    CRAMFS_SB(sb)->flags & CRAMFS_FLAG_EXT_BLOCK_POINTERS &&
108		    CRAMFS_SB(sb)->linear_phys_addr)
109			inode->i_fop = &cramfs_physmem_fops;
110		break;
111	case S_IFDIR:
112		inode->i_op = &cramfs_dir_inode_operations;
113		inode->i_fop = &cramfs_directory_operations;
114		break;
115	case S_IFLNK:
116		inode->i_op = &page_symlink_inode_operations;
117		inode_nohighmem(inode);
118		inode->i_data.a_ops = &cramfs_aops;
119		break;
120	default:
121		init_special_inode(inode, cramfs_inode->mode,
122				old_decode_dev(cramfs_inode->size));
123	}
124
125	inode->i_mode = cramfs_inode->mode;
126	i_uid_write(inode, cramfs_inode->uid);
127	i_gid_write(inode, cramfs_inode->gid);
128
129	/* if the lower 2 bits are zero, the inode contains data */
130	if (!(inode->i_ino & 3)) {
131		inode->i_size = cramfs_inode->size;
132		inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
133	}
134
135	/* Struct copy intentional */
136	inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
137	/* inode->i_nlink is left 1 - arguably wrong for directories,
138	   but it's the best we can do without reading the directory
139	   contents.  1 yields the right result in GNU find, even
140	   without -noleaf option. */
141
142	unlock_new_inode(inode);
143
144	return inode;
145}
146
147/*
148 * We have our own block cache: don't fill up the buffer cache
149 * with the rom-image, because the way the filesystem is set
150 * up the accesses should be fairly regular and cached in the
151 * page cache and dentry tree anyway..
152 *
153 * This also acts as a way to guarantee contiguous areas of up to
154 * BLKS_PER_BUF*PAGE_SIZE, so that the caller doesn't need to
155 * worry about end-of-buffer issues even when decompressing a full
156 * page cache.
157 *
158 * Note: This is all optimized away at compile time when
159 *       CONFIG_CRAMFS_BLOCKDEV=n.
160 */
161#define READ_BUFFERS (2)
162/* NEXT_BUFFER(): Loop over [0..(READ_BUFFERS-1)]. */
163#define NEXT_BUFFER(_ix) ((_ix) ^ 1)
164
165/*
166 * BLKS_PER_BUF_SHIFT should be at least 2 to allow for "compressed"
167 * data that takes up more space than the original and with unlucky
168 * alignment.
169 */
170#define BLKS_PER_BUF_SHIFT	(2)
171#define BLKS_PER_BUF		(1 << BLKS_PER_BUF_SHIFT)
172#define BUFFER_SIZE		(BLKS_PER_BUF*PAGE_SIZE)
173
174static unsigned char read_buffers[READ_BUFFERS][BUFFER_SIZE];
175static unsigned buffer_blocknr[READ_BUFFERS];
176static struct super_block *buffer_dev[READ_BUFFERS];
177static int next_buffer;
178
179/*
180 * Populate our block cache and return a pointer to it.
181 */
182static void *cramfs_blkdev_read(struct super_block *sb, unsigned int offset,
183				unsigned int len)
184{
185	struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
186	struct page *pages[BLKS_PER_BUF];
187	unsigned i, blocknr, buffer;
188	unsigned long devsize;
189	char *data;
190
191	if (!len)
192		return NULL;
193	blocknr = offset >> PAGE_SHIFT;
194	offset &= PAGE_SIZE - 1;
195
196	/* Check if an existing buffer already has the data.. */
197	for (i = 0; i < READ_BUFFERS; i++) {
198		unsigned int blk_offset;
199
200		if (buffer_dev[i] != sb)
201			continue;
202		if (blocknr < buffer_blocknr[i])
203			continue;
204		blk_offset = (blocknr - buffer_blocknr[i]) << PAGE_SHIFT;
205		blk_offset += offset;
206		if (blk_offset > BUFFER_SIZE ||
207		    blk_offset + len > BUFFER_SIZE)
208			continue;
209		return read_buffers[i] + blk_offset;
210	}
211
212	devsize = mapping->host->i_size >> PAGE_SHIFT;
213
214	/* Ok, read in BLKS_PER_BUF pages completely first. */
215	for (i = 0; i < BLKS_PER_BUF; i++) {
216		struct page *page = NULL;
217
218		if (blocknr + i < devsize) {
219			page = read_mapping_page(mapping, blocknr + i, NULL);
220			/* synchronous error? */
221			if (IS_ERR(page))
222				page = NULL;
223		}
224		pages[i] = page;
225	}
226
227	for (i = 0; i < BLKS_PER_BUF; i++) {
228		struct page *page = pages[i];
229
230		if (page) {
231			wait_on_page_locked(page);
232			if (!PageUptodate(page)) {
233				/* asynchronous error */
234				put_page(page);
235				pages[i] = NULL;
236			}
237		}
238	}
239
240	buffer = next_buffer;
241	next_buffer = NEXT_BUFFER(buffer);
242	buffer_blocknr[buffer] = blocknr;
243	buffer_dev[buffer] = sb;
244
245	data = read_buffers[buffer];
246	for (i = 0; i < BLKS_PER_BUF; i++) {
247		struct page *page = pages[i];
248
249		if (page) {
250			memcpy(data, kmap(page), PAGE_SIZE);
251			kunmap(page);
252			put_page(page);
253		} else
254			memset(data, 0, PAGE_SIZE);
255		data += PAGE_SIZE;
256	}
257	return read_buffers[buffer] + offset;
258}
259
260/*
261 * Return a pointer to the linearly addressed cramfs image in memory.
262 */
263static void *cramfs_direct_read(struct super_block *sb, unsigned int offset,
264				unsigned int len)
265{
266	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
267
268	if (!len)
269		return NULL;
270	if (len > sbi->size || offset > sbi->size - len)
271		return page_address(ZERO_PAGE(0));
272	return sbi->linear_virt_addr + offset;
273}
274
275/*
276 * Returns a pointer to a buffer containing at least LEN bytes of
277 * filesystem starting at byte offset OFFSET into the filesystem.
278 */
279static void *cramfs_read(struct super_block *sb, unsigned int offset,
280			 unsigned int len)
281{
282	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
283
284	if (IS_ENABLED(CONFIG_CRAMFS_MTD) && sbi->linear_virt_addr)
285		return cramfs_direct_read(sb, offset, len);
286	else if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV))
287		return cramfs_blkdev_read(sb, offset, len);
288	else
289		return NULL;
290}
291
292/*
293 * For a mapping to be possible, we need a range of uncompressed and
294 * contiguous blocks. Return the offset for the first block and number of
295 * valid blocks for which that is true, or zero otherwise.
296 */
297static u32 cramfs_get_block_range(struct inode *inode, u32 pgoff, u32 *pages)
298{
299	struct cramfs_sb_info *sbi = CRAMFS_SB(inode->i_sb);
300	int i;
301	u32 *blockptrs, first_block_addr;
302
303	/*
304	 * We can dereference memory directly here as this code may be
305	 * reached only when there is a direct filesystem image mapping
306	 * available in memory.
307	 */
308	blockptrs = (u32 *)(sbi->linear_virt_addr + OFFSET(inode) + pgoff * 4);
309	first_block_addr = blockptrs[0] & ~CRAMFS_BLK_FLAGS;
310	i = 0;
311	do {
312		u32 block_off = i * (PAGE_SIZE >> CRAMFS_BLK_DIRECT_PTR_SHIFT);
313		u32 expect = (first_block_addr + block_off) |
314			     CRAMFS_BLK_FLAG_DIRECT_PTR |
315			     CRAMFS_BLK_FLAG_UNCOMPRESSED;
316		if (blockptrs[i] != expect) {
317			pr_debug("range: block %d/%d got %#x expects %#x\n",
318				 pgoff+i, pgoff + *pages - 1,
319				 blockptrs[i], expect);
320			if (i == 0)
321				return 0;
322			break;
323		}
324	} while (++i < *pages);
325
326	*pages = i;
327	return first_block_addr << CRAMFS_BLK_DIRECT_PTR_SHIFT;
328}
329
330#ifdef CONFIG_MMU
331
332/*
333 * Return true if the last page of a file in the filesystem image contains
334 * some other data that doesn't belong to that file. It is assumed that the
335 * last block is CRAMFS_BLK_FLAG_DIRECT_PTR | CRAMFS_BLK_FLAG_UNCOMPRESSED
336 * (verified by cramfs_get_block_range() and directly accessible in memory.
337 */
338static bool cramfs_last_page_is_shared(struct inode *inode)
339{
340	struct cramfs_sb_info *sbi = CRAMFS_SB(inode->i_sb);
341	u32 partial, last_page, blockaddr, *blockptrs;
342	char *tail_data;
343
344	partial = offset_in_page(inode->i_size);
345	if (!partial)
346		return false;
347	last_page = inode->i_size >> PAGE_SHIFT;
348	blockptrs = (u32 *)(sbi->linear_virt_addr + OFFSET(inode));
349	blockaddr = blockptrs[last_page] & ~CRAMFS_BLK_FLAGS;
350	blockaddr <<= CRAMFS_BLK_DIRECT_PTR_SHIFT;
351	tail_data = sbi->linear_virt_addr + blockaddr + partial;
352	return memchr_inv(tail_data, 0, PAGE_SIZE - partial) ? true : false;
353}
354
355static int cramfs_physmem_mmap(struct file *file, struct vm_area_struct *vma)
356{
357	struct inode *inode = file_inode(file);
358	struct cramfs_sb_info *sbi = CRAMFS_SB(inode->i_sb);
359	unsigned int pages, max_pages, offset;
360	unsigned long address, pgoff = vma->vm_pgoff;
361	char *bailout_reason;
362	int ret;
363
364	ret = generic_file_readonly_mmap(file, vma);
365	if (ret)
366		return ret;
367
368	/*
369	 * Now try to pre-populate ptes for this vma with a direct
370	 * mapping avoiding memory allocation when possible.
371	 */
372
373	/* Could COW work here? */
374	bailout_reason = "vma is writable";
375	if (vma->vm_flags & VM_WRITE)
376		goto bailout;
377
378	max_pages = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
379	bailout_reason = "beyond file limit";
380	if (pgoff >= max_pages)
381		goto bailout;
382	pages = min(vma_pages(vma), max_pages - pgoff);
383
384	offset = cramfs_get_block_range(inode, pgoff, &pages);
385	bailout_reason = "unsuitable block layout";
386	if (!offset)
387		goto bailout;
388	address = sbi->linear_phys_addr + offset;
389	bailout_reason = "data is not page aligned";
390	if (!PAGE_ALIGNED(address))
391		goto bailout;
392
393	/* Don't map the last page if it contains some other data */
394	if (pgoff + pages == max_pages && cramfs_last_page_is_shared(inode)) {
395		pr_debug("mmap: %s: last page is shared\n",
396			 file_dentry(file)->d_name.name);
397		pages--;
398	}
399
400	if (!pages) {
401		bailout_reason = "no suitable block remaining";
402		goto bailout;
403	}
404
405	if (pages == vma_pages(vma)) {
406		/*
407		 * The entire vma is mappable. remap_pfn_range() will
408		 * make it distinguishable from a non-direct mapping
409		 * in /proc/<pid>/maps by substituting the file offset
410		 * with the actual physical address.
411		 */
412		ret = remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT,
413				      pages * PAGE_SIZE, vma->vm_page_prot);
414	} else {
415		/*
416		 * Let's create a mixed map if we can't map it all.
417		 * The normal paging machinery will take care of the
418		 * unpopulated ptes via cramfs_readpage().
419		 */
420		int i;
421		vma->vm_flags |= VM_MIXEDMAP;
422		for (i = 0; i < pages && !ret; i++) {
423			vm_fault_t vmf;
424			unsigned long off = i * PAGE_SIZE;
425			pfn_t pfn = phys_to_pfn_t(address + off, PFN_DEV);
426			vmf = vmf_insert_mixed(vma, vma->vm_start + off, pfn);
427			if (vmf & VM_FAULT_ERROR)
428				ret = vm_fault_to_errno(vmf, 0);
429		}
430	}
431
432	if (!ret)
433		pr_debug("mapped %s[%lu] at 0x%08lx (%u/%lu pages) "
434			 "to vma 0x%08lx, page_prot 0x%llx\n",
435			 file_dentry(file)->d_name.name, pgoff,
436			 address, pages, vma_pages(vma), vma->vm_start,
437			 (unsigned long long)pgprot_val(vma->vm_page_prot));
438	return ret;
439
440bailout:
441	pr_debug("%s[%lu]: direct mmap impossible: %s\n",
442		 file_dentry(file)->d_name.name, pgoff, bailout_reason);
443	/* Didn't manage any direct map, but normal paging is still possible */
444	return 0;
445}
446
447#else /* CONFIG_MMU */
448
449static int cramfs_physmem_mmap(struct file *file, struct vm_area_struct *vma)
450{
451	return vma->vm_flags & (VM_SHARED | VM_MAYSHARE) ? 0 : -ENOSYS;
452}
453
454static unsigned long cramfs_physmem_get_unmapped_area(struct file *file,
455			unsigned long addr, unsigned long len,
456			unsigned long pgoff, unsigned long flags)
457{
458	struct inode *inode = file_inode(file);
459	struct super_block *sb = inode->i_sb;
460	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
461	unsigned int pages, block_pages, max_pages, offset;
462
463	pages = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
464	max_pages = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
465	if (pgoff >= max_pages || pages > max_pages - pgoff)
466		return -EINVAL;
467	block_pages = pages;
468	offset = cramfs_get_block_range(inode, pgoff, &block_pages);
469	if (!offset || block_pages != pages)
470		return -ENOSYS;
471	addr = sbi->linear_phys_addr + offset;
472	pr_debug("get_unmapped for %s ofs %#lx siz %lu at 0x%08lx\n",
473		 file_dentry(file)->d_name.name, pgoff*PAGE_SIZE, len, addr);
474	return addr;
475}
476
477static unsigned int cramfs_physmem_mmap_capabilities(struct file *file)
478{
479	return NOMMU_MAP_COPY | NOMMU_MAP_DIRECT |
480	       NOMMU_MAP_READ | NOMMU_MAP_EXEC;
481}
482
483#endif /* CONFIG_MMU */
484
485static const struct file_operations cramfs_physmem_fops = {
486	.llseek			= generic_file_llseek,
487	.read_iter		= generic_file_read_iter,
488	.splice_read		= generic_file_splice_read,
489	.mmap			= cramfs_physmem_mmap,
490#ifndef CONFIG_MMU
491	.get_unmapped_area	= cramfs_physmem_get_unmapped_area,
492	.mmap_capabilities	= cramfs_physmem_mmap_capabilities,
493#endif
494};
495
496static void cramfs_kill_sb(struct super_block *sb)
497{
498	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
499
500	if (IS_ENABLED(CONFIG_CRAMFS_MTD) && sb->s_mtd) {
501		if (sbi && sbi->mtd_point_size)
502			mtd_unpoint(sb->s_mtd, 0, sbi->mtd_point_size);
503		kill_mtd_super(sb);
504	} else if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV) && sb->s_bdev) {
505		kill_block_super(sb);
506	}
507	kfree(sbi);
508}
509
510static int cramfs_reconfigure(struct fs_context *fc)
511{
512	sync_filesystem(fc->root->d_sb);
513	fc->sb_flags |= SB_RDONLY;
514	return 0;
515}
516
517static int cramfs_read_super(struct super_block *sb, struct fs_context *fc,
518			     struct cramfs_super *super)
519{
520	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
521	unsigned long root_offset;
522	bool silent = fc->sb_flags & SB_SILENT;
523
524	/* We don't know the real size yet */
525	sbi->size = PAGE_SIZE;
526
527	/* Read the first block and get the superblock from it */
528	mutex_lock(&read_mutex);
529	memcpy(super, cramfs_read(sb, 0, sizeof(*super)), sizeof(*super));
530	mutex_unlock(&read_mutex);
531
532	/* Do sanity checks on the superblock */
533	if (super->magic != CRAMFS_MAGIC) {
534		/* check for wrong endianness */
535		if (super->magic == CRAMFS_MAGIC_WEND) {
536			if (!silent)
537				errorfc(fc, "wrong endianness");
538			return -EINVAL;
539		}
540
541		/* check at 512 byte offset */
542		mutex_lock(&read_mutex);
543		memcpy(super,
544		       cramfs_read(sb, 512, sizeof(*super)),
545		       sizeof(*super));
546		mutex_unlock(&read_mutex);
547		if (super->magic != CRAMFS_MAGIC) {
548			if (super->magic == CRAMFS_MAGIC_WEND && !silent)
549				errorfc(fc, "wrong endianness");
550			else if (!silent)
551				errorfc(fc, "wrong magic");
552			return -EINVAL;
553		}
554	}
555
556	/* get feature flags first */
557	if (super->flags & ~CRAMFS_SUPPORTED_FLAGS) {
558		errorfc(fc, "unsupported filesystem features");
559		return -EINVAL;
560	}
561
562	/* Check that the root inode is in a sane state */
563	if (!S_ISDIR(super->root.mode)) {
564		errorfc(fc, "root is not a directory");
565		return -EINVAL;
566	}
567	/* correct strange, hard-coded permissions of mkcramfs */
568	super->root.mode |= 0555;
569
570	root_offset = super->root.offset << 2;
571	if (super->flags & CRAMFS_FLAG_FSID_VERSION_2) {
572		sbi->size = super->size;
573		sbi->blocks = super->fsid.blocks;
574		sbi->files = super->fsid.files;
575	} else {
576		sbi->size = 1<<28;
577		sbi->blocks = 0;
578		sbi->files = 0;
579	}
580	sbi->magic = super->magic;
581	sbi->flags = super->flags;
582	if (root_offset == 0)
583		infofc(fc, "empty filesystem");
584	else if (!(super->flags & CRAMFS_FLAG_SHIFTED_ROOT_OFFSET) &&
585		 ((root_offset != sizeof(struct cramfs_super)) &&
586		  (root_offset != 512 + sizeof(struct cramfs_super))))
587	{
588		errorfc(fc, "bad root offset %lu", root_offset);
589		return -EINVAL;
590	}
591
592	return 0;
593}
594
595static int cramfs_finalize_super(struct super_block *sb,
596				 struct cramfs_inode *cramfs_root)
597{
598	struct inode *root;
599
600	/* Set it all up.. */
601	sb->s_flags |= SB_RDONLY;
602	sb->s_time_min = 0;
603	sb->s_time_max = 0;
604	sb->s_op = &cramfs_ops;
605	root = get_cramfs_inode(sb, cramfs_root, 0);
606	if (IS_ERR(root))
607		return PTR_ERR(root);
608	sb->s_root = d_make_root(root);
609	if (!sb->s_root)
610		return -ENOMEM;
611	return 0;
612}
613
614static int cramfs_blkdev_fill_super(struct super_block *sb, struct fs_context *fc)
615{
616	struct cramfs_sb_info *sbi;
617	struct cramfs_super super;
618	int i, err;
619
620	sbi = kzalloc(sizeof(struct cramfs_sb_info), GFP_KERNEL);
621	if (!sbi)
622		return -ENOMEM;
623	sb->s_fs_info = sbi;
624
625	/* Invalidate the read buffers on mount: think disk change.. */
626	for (i = 0; i < READ_BUFFERS; i++)
627		buffer_blocknr[i] = -1;
628
629	err = cramfs_read_super(sb, fc, &super);
630	if (err)
631		return err;
632	return cramfs_finalize_super(sb, &super.root);
633}
634
635static int cramfs_mtd_fill_super(struct super_block *sb, struct fs_context *fc)
636{
637	struct cramfs_sb_info *sbi;
638	struct cramfs_super super;
639	int err;
640
641	sbi = kzalloc(sizeof(struct cramfs_sb_info), GFP_KERNEL);
642	if (!sbi)
643		return -ENOMEM;
644	sb->s_fs_info = sbi;
645
646	/* Map only one page for now.  Will remap it when fs size is known. */
647	err = mtd_point(sb->s_mtd, 0, PAGE_SIZE, &sbi->mtd_point_size,
648			&sbi->linear_virt_addr, &sbi->linear_phys_addr);
649	if (err || sbi->mtd_point_size != PAGE_SIZE) {
650		pr_err("unable to get direct memory access to mtd:%s\n",
651		       sb->s_mtd->name);
652		return err ? : -ENODATA;
653	}
654
655	pr_info("checking physical address %pap for linear cramfs image\n",
656		&sbi->linear_phys_addr);
657	err = cramfs_read_super(sb, fc, &super);
658	if (err)
659		return err;
660
661	/* Remap the whole filesystem now */
662	pr_info("linear cramfs image on mtd:%s appears to be %lu KB in size\n",
663		sb->s_mtd->name, sbi->size/1024);
664	mtd_unpoint(sb->s_mtd, 0, PAGE_SIZE);
665	err = mtd_point(sb->s_mtd, 0, sbi->size, &sbi->mtd_point_size,
666			&sbi->linear_virt_addr, &sbi->linear_phys_addr);
667	if (err || sbi->mtd_point_size != sbi->size) {
668		pr_err("unable to get direct memory access to mtd:%s\n",
669		       sb->s_mtd->name);
670		return err ? : -ENODATA;
671	}
672
673	return cramfs_finalize_super(sb, &super.root);
674}
675
676static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf)
677{
678	struct super_block *sb = dentry->d_sb;
679	u64 id = 0;
680
681	if (sb->s_bdev)
682		id = huge_encode_dev(sb->s_bdev->bd_dev);
683	else if (sb->s_dev)
684		id = huge_encode_dev(sb->s_dev);
685
686	buf->f_type = CRAMFS_MAGIC;
687	buf->f_bsize = PAGE_SIZE;
688	buf->f_blocks = CRAMFS_SB(sb)->blocks;
689	buf->f_bfree = 0;
690	buf->f_bavail = 0;
691	buf->f_files = CRAMFS_SB(sb)->files;
692	buf->f_ffree = 0;
693	buf->f_fsid = u64_to_fsid(id);
694	buf->f_namelen = CRAMFS_MAXPATHLEN;
695	return 0;
696}
697
698/*
699 * Read a cramfs directory entry.
700 */
701static int cramfs_readdir(struct file *file, struct dir_context *ctx)
702{
703	struct inode *inode = file_inode(file);
704	struct super_block *sb = inode->i_sb;
705	char *buf;
706	unsigned int offset;
707
708	/* Offset within the thing. */
709	if (ctx->pos >= inode->i_size)
710		return 0;
711	offset = ctx->pos;
712	/* Directory entries are always 4-byte aligned */
713	if (offset & 3)
714		return -EINVAL;
715
716	buf = kmalloc(CRAMFS_MAXPATHLEN, GFP_KERNEL);
717	if (!buf)
718		return -ENOMEM;
719
720	while (offset < inode->i_size) {
721		struct cramfs_inode *de;
722		unsigned long nextoffset;
723		char *name;
724		ino_t ino;
725		umode_t mode;
726		int namelen;
727
728		mutex_lock(&read_mutex);
729		de = cramfs_read(sb, OFFSET(inode) + offset, sizeof(*de)+CRAMFS_MAXPATHLEN);
730		name = (char *)(de+1);
731
732		/*
733		 * Namelengths on disk are shifted by two
734		 * and the name padded out to 4-byte boundaries
735		 * with zeroes.
736		 */
737		namelen = de->namelen << 2;
738		memcpy(buf, name, namelen);
739		ino = cramino(de, OFFSET(inode) + offset);
740		mode = de->mode;
741		mutex_unlock(&read_mutex);
742		nextoffset = offset + sizeof(*de) + namelen;
743		for (;;) {
744			if (!namelen) {
745				kfree(buf);
746				return -EIO;
747			}
748			if (buf[namelen-1])
749				break;
750			namelen--;
751		}
752		if (!dir_emit(ctx, buf, namelen, ino, mode >> 12))
753			break;
754
755		ctx->pos = offset = nextoffset;
756	}
757	kfree(buf);
758	return 0;
759}
760
761/*
762 * Lookup and fill in the inode data..
763 */
764static struct dentry *cramfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
765{
766	unsigned int offset = 0;
767	struct inode *inode = NULL;
768	int sorted;
769
770	mutex_lock(&read_mutex);
771	sorted = CRAMFS_SB(dir->i_sb)->flags & CRAMFS_FLAG_SORTED_DIRS;
772	while (offset < dir->i_size) {
773		struct cramfs_inode *de;
774		char *name;
775		int namelen, retval;
776		int dir_off = OFFSET(dir) + offset;
777
778		de = cramfs_read(dir->i_sb, dir_off, sizeof(*de)+CRAMFS_MAXPATHLEN);
779		name = (char *)(de+1);
780
781		/* Try to take advantage of sorted directories */
782		if (sorted && (dentry->d_name.name[0] < name[0]))
783			break;
784
785		namelen = de->namelen << 2;
786		offset += sizeof(*de) + namelen;
787
788		/* Quick check that the name is roughly the right length */
789		if (((dentry->d_name.len + 3) & ~3) != namelen)
790			continue;
791
792		for (;;) {
793			if (!namelen) {
794				inode = ERR_PTR(-EIO);
795				goto out;
796			}
797			if (name[namelen-1])
798				break;
799			namelen--;
800		}
801		if (namelen != dentry->d_name.len)
802			continue;
803		retval = memcmp(dentry->d_name.name, name, namelen);
804		if (retval > 0)
805			continue;
806		if (!retval) {
807			inode = get_cramfs_inode(dir->i_sb, de, dir_off);
808			break;
809		}
810		/* else (retval < 0) */
811		if (sorted)
812			break;
813	}
814out:
815	mutex_unlock(&read_mutex);
816	return d_splice_alias(inode, dentry);
817}
818
819static int cramfs_readpage(struct file *file, struct page *page)
820{
821	struct inode *inode = page->mapping->host;
822	u32 maxblock;
823	int bytes_filled;
824	void *pgdata;
825
826	maxblock = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
827	bytes_filled = 0;
828	pgdata = kmap(page);
829
830	if (page->index < maxblock) {
831		struct super_block *sb = inode->i_sb;
832		u32 blkptr_offset = OFFSET(inode) + page->index * 4;
833		u32 block_ptr, block_start, block_len;
834		bool uncompressed, direct;
835
836		mutex_lock(&read_mutex);
837		block_ptr = *(u32 *) cramfs_read(sb, blkptr_offset, 4);
838		uncompressed = (block_ptr & CRAMFS_BLK_FLAG_UNCOMPRESSED);
839		direct = (block_ptr & CRAMFS_BLK_FLAG_DIRECT_PTR);
840		block_ptr &= ~CRAMFS_BLK_FLAGS;
841
842		if (direct) {
843			/*
844			 * The block pointer is an absolute start pointer,
845			 * shifted by 2 bits. The size is included in the
846			 * first 2 bytes of the data block when compressed,
847			 * or PAGE_SIZE otherwise.
848			 */
849			block_start = block_ptr << CRAMFS_BLK_DIRECT_PTR_SHIFT;
850			if (uncompressed) {
851				block_len = PAGE_SIZE;
852				/* if last block: cap to file length */
853				if (page->index == maxblock - 1)
854					block_len =
855						offset_in_page(inode->i_size);
856			} else {
857				block_len = *(u16 *)
858					cramfs_read(sb, block_start, 2);
859				block_start += 2;
860			}
861		} else {
862			/*
863			 * The block pointer indicates one past the end of
864			 * the current block (start of next block). If this
865			 * is the first block then it starts where the block
866			 * pointer table ends, otherwise its start comes
867			 * from the previous block's pointer.
868			 */
869			block_start = OFFSET(inode) + maxblock * 4;
870			if (page->index)
871				block_start = *(u32 *)
872					cramfs_read(sb, blkptr_offset - 4, 4);
873			/* Beware... previous ptr might be a direct ptr */
874			if (unlikely(block_start & CRAMFS_BLK_FLAG_DIRECT_PTR)) {
875				/* See comments on earlier code. */
876				u32 prev_start = block_start;
877				block_start = prev_start & ~CRAMFS_BLK_FLAGS;
878				block_start <<= CRAMFS_BLK_DIRECT_PTR_SHIFT;
879				if (prev_start & CRAMFS_BLK_FLAG_UNCOMPRESSED) {
880					block_start += PAGE_SIZE;
881				} else {
882					block_len = *(u16 *)
883						cramfs_read(sb, block_start, 2);
884					block_start += 2 + block_len;
885				}
886			}
887			block_start &= ~CRAMFS_BLK_FLAGS;
888			block_len = block_ptr - block_start;
889		}
890
891		if (block_len == 0)
892			; /* hole */
893		else if (unlikely(block_len > 2*PAGE_SIZE ||
894				  (uncompressed && block_len > PAGE_SIZE))) {
895			mutex_unlock(&read_mutex);
896			pr_err("bad data blocksize %u\n", block_len);
897			goto err;
898		} else if (uncompressed) {
899			memcpy(pgdata,
900			       cramfs_read(sb, block_start, block_len),
901			       block_len);
902			bytes_filled = block_len;
903		} else {
904			bytes_filled = cramfs_uncompress_block(pgdata,
905				 PAGE_SIZE,
906				 cramfs_read(sb, block_start, block_len),
907				 block_len);
908		}
909		mutex_unlock(&read_mutex);
910		if (unlikely(bytes_filled < 0))
911			goto err;
912	}
913
914	memset(pgdata + bytes_filled, 0, PAGE_SIZE - bytes_filled);
915	flush_dcache_page(page);
916	kunmap(page);
917	SetPageUptodate(page);
918	unlock_page(page);
919	return 0;
920
921err:
922	kunmap(page);
923	ClearPageUptodate(page);
924	SetPageError(page);
925	unlock_page(page);
926	return 0;
927}
928
929static const struct address_space_operations cramfs_aops = {
930	.readpage = cramfs_readpage
931};
932
933/*
934 * Our operations:
935 */
936
937/*
938 * A directory can only readdir
939 */
940static const struct file_operations cramfs_directory_operations = {
941	.llseek		= generic_file_llseek,
942	.read		= generic_read_dir,
943	.iterate_shared	= cramfs_readdir,
944};
945
946static const struct inode_operations cramfs_dir_inode_operations = {
947	.lookup		= cramfs_lookup,
948};
949
950static const struct super_operations cramfs_ops = {
951	.statfs		= cramfs_statfs,
952};
953
954static int cramfs_get_tree(struct fs_context *fc)
955{
956	int ret = -ENOPROTOOPT;
957
958	if (IS_ENABLED(CONFIG_CRAMFS_MTD)) {
959		ret = get_tree_mtd(fc, cramfs_mtd_fill_super);
960		if (!ret)
961			return 0;
962	}
963	if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV))
964		ret = get_tree_bdev(fc, cramfs_blkdev_fill_super);
965	return ret;
966}
967
968static const struct fs_context_operations cramfs_context_ops = {
969	.get_tree	= cramfs_get_tree,
970	.reconfigure	= cramfs_reconfigure,
971};
972
973/*
974 * Set up the filesystem mount context.
975 */
976static int cramfs_init_fs_context(struct fs_context *fc)
977{
978	fc->ops = &cramfs_context_ops;
979	return 0;
980}
981
982static struct file_system_type cramfs_fs_type = {
983	.owner		= THIS_MODULE,
984	.name		= "cramfs",
985	.init_fs_context = cramfs_init_fs_context,
986	.kill_sb	= cramfs_kill_sb,
987	.fs_flags	= FS_REQUIRES_DEV,
988};
989MODULE_ALIAS_FS("cramfs");
990
991static int __init init_cramfs_fs(void)
992{
993	int rv;
994
995	rv = cramfs_uncompress_init();
996	if (rv < 0)
997		return rv;
998	rv = register_filesystem(&cramfs_fs_type);
999	if (rv < 0)
1000		cramfs_uncompress_exit();
1001	return rv;
1002}
1003
1004static void __exit exit_cramfs_fs(void)
1005{
1006	cramfs_uncompress_exit();
1007	unregister_filesystem(&cramfs_fs_type);
1008}
1009
1010module_init(init_cramfs_fs)
1011module_exit(exit_cramfs_fs)
1012MODULE_LICENSE("GPL");
1013