xref: /openbmc/u-boot/fs/ubifs/ubifs.c (revision 679f82c3)
1 /*
2  * This file is part of UBIFS.
3  *
4  * Copyright (C) 2006-2008 Nokia Corporation.
5  *
6  * (C) Copyright 2008-2010
7  * Stefan Roese, DENX Software Engineering, sr@denx.de.
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License version 2 as published by
11  * the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along with
19  * this program; if not, write to the Free Software Foundation, Inc., 51
20  * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  * Authors: Artem Bityutskiy (Битюцкий Артём)
23  *          Adrian Hunter
24  */
25 
26 #include <common.h>
27 #include <memalign.h>
28 #include "ubifs.h"
29 #include <u-boot/zlib.h>
30 
31 #include <linux/err.h>
32 #include <linux/lzo.h>
33 
34 DECLARE_GLOBAL_DATA_PTR;
35 
36 /* compress.c */
37 
38 /*
39  * We need a wrapper for zunzip() because the parameters are
40  * incompatible with the lzo decompressor.
41  */
42 static int gzip_decompress(const unsigned char *in, size_t in_len,
43 			   unsigned char *out, size_t *out_len)
44 {
45 	return zunzip(out, *out_len, (unsigned char *)in,
46 		      (unsigned long *)out_len, 0, 0);
47 }
48 
49 /* Fake description object for the "none" compressor */
50 static struct ubifs_compressor none_compr = {
51 	.compr_type = UBIFS_COMPR_NONE,
52 	.name = "none",
53 	.capi_name = "",
54 	.decompress = NULL,
55 };
56 
57 static struct ubifs_compressor lzo_compr = {
58 	.compr_type = UBIFS_COMPR_LZO,
59 #ifndef __UBOOT__
60 	.comp_mutex = &lzo_mutex,
61 #endif
62 	.name = "lzo",
63 	.capi_name = "lzo",
64 	.decompress = lzo1x_decompress_safe,
65 };
66 
67 static struct ubifs_compressor zlib_compr = {
68 	.compr_type = UBIFS_COMPR_ZLIB,
69 #ifndef __UBOOT__
70 	.comp_mutex = &deflate_mutex,
71 	.decomp_mutex = &inflate_mutex,
72 #endif
73 	.name = "zlib",
74 	.capi_name = "deflate",
75 	.decompress = gzip_decompress,
76 };
77 
78 /* All UBIFS compressors */
79 struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
80 
81 
82 #ifdef __UBOOT__
83 /* from mm/util.c */
84 
85 /**
86  * kmemdup - duplicate region of memory
87  *
88  * @src: memory region to duplicate
89  * @len: memory region length
90  * @gfp: GFP mask to use
91  */
92 void *kmemdup(const void *src, size_t len, gfp_t gfp)
93 {
94 	void *p;
95 
96 	p = kmalloc(len, gfp);
97 	if (p)
98 		memcpy(p, src, len);
99 	return p;
100 }
101 
102 struct crypto_comp {
103 	int compressor;
104 };
105 
106 static inline struct crypto_comp *crypto_alloc_comp(const char *alg_name,
107 						u32 type, u32 mask)
108 {
109 	struct ubifs_compressor *comp;
110 	struct crypto_comp *ptr;
111 	int i = 0;
112 
113 	ptr = malloc_cache_aligned(sizeof(struct crypto_comp));
114 	while (i < UBIFS_COMPR_TYPES_CNT) {
115 		comp = ubifs_compressors[i];
116 		if (!comp) {
117 			i++;
118 			continue;
119 		}
120 		if (strncmp(alg_name, comp->capi_name, strlen(alg_name)) == 0) {
121 			ptr->compressor = i;
122 			return ptr;
123 		}
124 		i++;
125 	}
126 	if (i >= UBIFS_COMPR_TYPES_CNT) {
127 		ubifs_err("invalid compression type %s", alg_name);
128 		free (ptr);
129 		return NULL;
130 	}
131 	return ptr;
132 }
133 static inline int crypto_comp_decompress(struct crypto_comp *tfm,
134 				const u8 *src, unsigned int slen,
135 				u8 *dst, unsigned int *dlen)
136 {
137 	struct ubifs_compressor *compr = ubifs_compressors[tfm->compressor];
138 	int err;
139 
140 	if (compr->compr_type == UBIFS_COMPR_NONE) {
141 		memcpy(dst, src, slen);
142 		*dlen = slen;
143 		return 0;
144 	}
145 
146 	err = compr->decompress(src, slen, dst, (size_t *)dlen);
147 	if (err)
148 		ubifs_err("cannot decompress %d bytes, compressor %s, "
149 			  "error %d", slen, compr->name, err);
150 
151 	return err;
152 
153 	return 0;
154 }
155 
156 /* from shrinker.c */
157 
158 /* Global clean znode counter (for all mounted UBIFS instances) */
159 atomic_long_t ubifs_clean_zn_cnt;
160 
161 #endif
162 
163 /**
164  * ubifs_decompress - decompress data.
165  * @in_buf: data to decompress
166  * @in_len: length of the data to decompress
167  * @out_buf: output buffer where decompressed data should
168  * @out_len: output length is returned here
169  * @compr_type: type of compression
170  *
171  * This function decompresses data from buffer @in_buf into buffer @out_buf.
172  * The length of the uncompressed data is returned in @out_len. This functions
173  * returns %0 on success or a negative error code on failure.
174  */
175 int ubifs_decompress(const void *in_buf, int in_len, void *out_buf,
176 		     int *out_len, int compr_type)
177 {
178 	int err;
179 	struct ubifs_compressor *compr;
180 
181 	if (unlikely(compr_type < 0 || compr_type >= UBIFS_COMPR_TYPES_CNT)) {
182 		ubifs_err("invalid compression type %d", compr_type);
183 		return -EINVAL;
184 	}
185 
186 	compr = ubifs_compressors[compr_type];
187 
188 	if (unlikely(!compr->capi_name)) {
189 		ubifs_err("%s compression is not compiled in", compr->name);
190 		return -EINVAL;
191 	}
192 
193 	if (compr_type == UBIFS_COMPR_NONE) {
194 		memcpy(out_buf, in_buf, in_len);
195 		*out_len = in_len;
196 		return 0;
197 	}
198 
199 	if (compr->decomp_mutex)
200 		mutex_lock(compr->decomp_mutex);
201 	err = crypto_comp_decompress(compr->cc, in_buf, in_len, out_buf,
202 				     (unsigned int *)out_len);
203 	if (compr->decomp_mutex)
204 		mutex_unlock(compr->decomp_mutex);
205 	if (err)
206 		ubifs_err("cannot decompress %d bytes, compressor %s, error %d",
207 			  in_len, compr->name, err);
208 
209 	return err;
210 }
211 
212 /**
213  * compr_init - initialize a compressor.
214  * @compr: compressor description object
215  *
216  * This function initializes the requested compressor and returns zero in case
217  * of success or a negative error code in case of failure.
218  */
219 static int __init compr_init(struct ubifs_compressor *compr)
220 {
221 	ubifs_compressors[compr->compr_type] = compr;
222 
223 #ifdef CONFIG_NEEDS_MANUAL_RELOC
224 	ubifs_compressors[compr->compr_type]->name += gd->reloc_off;
225 	ubifs_compressors[compr->compr_type]->capi_name += gd->reloc_off;
226 	ubifs_compressors[compr->compr_type]->decompress += gd->reloc_off;
227 #endif
228 
229 	if (compr->capi_name) {
230 		compr->cc = crypto_alloc_comp(compr->capi_name, 0, 0);
231 		if (IS_ERR(compr->cc)) {
232 			ubifs_err("cannot initialize compressor %s, error %ld",
233 				  compr->name, PTR_ERR(compr->cc));
234 			return PTR_ERR(compr->cc);
235 		}
236 	}
237 
238 	return 0;
239 }
240 
241 /**
242  * ubifs_compressors_init - initialize UBIFS compressors.
243  *
244  * This function initializes the compressor which were compiled in. Returns
245  * zero in case of success and a negative error code in case of failure.
246  */
247 int __init ubifs_compressors_init(void)
248 {
249 	int err;
250 
251 	err = compr_init(&lzo_compr);
252 	if (err)
253 		return err;
254 
255 	err = compr_init(&zlib_compr);
256 	if (err)
257 		return err;
258 
259 	err = compr_init(&none_compr);
260 	if (err)
261 		return err;
262 
263 	return 0;
264 }
265 
266 /*
267  * ubifsls...
268  */
269 
270 static int filldir(struct ubifs_info *c, const char *name, int namlen,
271 		   u64 ino, unsigned int d_type)
272 {
273 	struct inode *inode;
274 	char filetime[32];
275 
276 	switch (d_type) {
277 	case UBIFS_ITYPE_REG:
278 		printf("\t");
279 		break;
280 	case UBIFS_ITYPE_DIR:
281 		printf("<DIR>\t");
282 		break;
283 	case UBIFS_ITYPE_LNK:
284 		printf("<LNK>\t");
285 		break;
286 	default:
287 		printf("other\t");
288 		break;
289 	}
290 
291 	inode = ubifs_iget(c->vfs_sb, ino);
292 	if (IS_ERR(inode)) {
293 		printf("%s: Error in ubifs_iget(), ino=%lld ret=%p!\n",
294 		       __func__, ino, inode);
295 		return -1;
296 	}
297 	ctime_r((time_t *)&inode->i_mtime, filetime);
298 	printf("%9lld  %24.24s  ", inode->i_size, filetime);
299 #ifndef __UBOOT__
300 	ubifs_iput(inode);
301 #endif
302 
303 	printf("%s\n", name);
304 
305 	return 0;
306 }
307 
308 static int ubifs_printdir(struct file *file, void *dirent)
309 {
310 	int err, over = 0;
311 	struct qstr nm;
312 	union ubifs_key key;
313 	struct ubifs_dent_node *dent;
314 	struct inode *dir = file->f_path.dentry->d_inode;
315 	struct ubifs_info *c = dir->i_sb->s_fs_info;
316 
317 	dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, file->f_pos);
318 
319 	if (file->f_pos > UBIFS_S_KEY_HASH_MASK || file->f_pos == 2)
320 		/*
321 		 * The directory was seek'ed to a senseless position or there
322 		 * are no more entries.
323 		 */
324 		return 0;
325 
326 	if (file->f_pos == 1) {
327 		/* Find the first entry in TNC and save it */
328 		lowest_dent_key(c, &key, dir->i_ino);
329 		nm.name = NULL;
330 		dent = ubifs_tnc_next_ent(c, &key, &nm);
331 		if (IS_ERR(dent)) {
332 			err = PTR_ERR(dent);
333 			goto out;
334 		}
335 
336 		file->f_pos = key_hash_flash(c, &dent->key);
337 		file->private_data = dent;
338 	}
339 
340 	dent = file->private_data;
341 	if (!dent) {
342 		/*
343 		 * The directory was seek'ed to and is now readdir'ed.
344 		 * Find the entry corresponding to @file->f_pos or the
345 		 * closest one.
346 		 */
347 		dent_key_init_hash(c, &key, dir->i_ino, file->f_pos);
348 		nm.name = NULL;
349 		dent = ubifs_tnc_next_ent(c, &key, &nm);
350 		if (IS_ERR(dent)) {
351 			err = PTR_ERR(dent);
352 			goto out;
353 		}
354 		file->f_pos = key_hash_flash(c, &dent->key);
355 		file->private_data = dent;
356 	}
357 
358 	while (1) {
359 		dbg_gen("feed '%s', ino %llu, new f_pos %#x",
360 			dent->name, (unsigned long long)le64_to_cpu(dent->inum),
361 			key_hash_flash(c, &dent->key));
362 		ubifs_assert(le64_to_cpu(dent->ch.sqnum) > ubifs_inode(dir)->creat_sqnum);
363 
364 		nm.len = le16_to_cpu(dent->nlen);
365 		over = filldir(c, (char *)dent->name, nm.len,
366 			       le64_to_cpu(dent->inum), dent->type);
367 		if (over)
368 			return 0;
369 
370 		/* Switch to the next entry */
371 		key_read(c, &dent->key, &key);
372 		nm.name = (char *)dent->name;
373 		dent = ubifs_tnc_next_ent(c, &key, &nm);
374 		if (IS_ERR(dent)) {
375 			err = PTR_ERR(dent);
376 			goto out;
377 		}
378 
379 		kfree(file->private_data);
380 		file->f_pos = key_hash_flash(c, &dent->key);
381 		file->private_data = dent;
382 		cond_resched();
383 	}
384 
385 out:
386 	if (err != -ENOENT) {
387 		ubifs_err("cannot find next direntry, error %d", err);
388 		return err;
389 	}
390 
391 	kfree(file->private_data);
392 	file->private_data = NULL;
393 	file->f_pos = 2;
394 	return 0;
395 }
396 
397 static int ubifs_finddir(struct super_block *sb, char *dirname,
398 			 unsigned long root_inum, unsigned long *inum)
399 {
400 	int err;
401 	struct qstr nm;
402 	union ubifs_key key;
403 	struct ubifs_dent_node *dent;
404 	struct ubifs_info *c;
405 	struct file *file;
406 	struct dentry *dentry;
407 	struct inode *dir;
408 	int ret = 0;
409 
410 	file = kzalloc(sizeof(struct file), 0);
411 	dentry = kzalloc(sizeof(struct dentry), 0);
412 	dir = kzalloc(sizeof(struct inode), 0);
413 	if (!file || !dentry || !dir) {
414 		printf("%s: Error, no memory for malloc!\n", __func__);
415 		err = -ENOMEM;
416 		goto out;
417 	}
418 
419 	dir->i_sb = sb;
420 	file->f_path.dentry = dentry;
421 	file->f_path.dentry->d_parent = dentry;
422 	file->f_path.dentry->d_inode = dir;
423 	file->f_path.dentry->d_inode->i_ino = root_inum;
424 	c = sb->s_fs_info;
425 
426 	dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, file->f_pos);
427 
428 	/* Find the first entry in TNC and save it */
429 	lowest_dent_key(c, &key, dir->i_ino);
430 	nm.name = NULL;
431 	dent = ubifs_tnc_next_ent(c, &key, &nm);
432 	if (IS_ERR(dent)) {
433 		err = PTR_ERR(dent);
434 		goto out;
435 	}
436 
437 	file->f_pos = key_hash_flash(c, &dent->key);
438 	file->private_data = dent;
439 
440 	while (1) {
441 		dbg_gen("feed '%s', ino %llu, new f_pos %#x",
442 			dent->name, (unsigned long long)le64_to_cpu(dent->inum),
443 			key_hash_flash(c, &dent->key));
444 		ubifs_assert(le64_to_cpu(dent->ch.sqnum) > ubifs_inode(dir)->creat_sqnum);
445 
446 		nm.len = le16_to_cpu(dent->nlen);
447 		if ((strncmp(dirname, (char *)dent->name, nm.len) == 0) &&
448 		    (strlen(dirname) == nm.len)) {
449 			*inum = le64_to_cpu(dent->inum);
450 			ret = 1;
451 			goto out_free;
452 		}
453 
454 		/* Switch to the next entry */
455 		key_read(c, &dent->key, &key);
456 		nm.name = (char *)dent->name;
457 		dent = ubifs_tnc_next_ent(c, &key, &nm);
458 		if (IS_ERR(dent)) {
459 			err = PTR_ERR(dent);
460 			goto out;
461 		}
462 
463 		kfree(file->private_data);
464 		file->f_pos = key_hash_flash(c, &dent->key);
465 		file->private_data = dent;
466 		cond_resched();
467 	}
468 
469 out:
470 	if (err != -ENOENT)
471 		ubifs_err("cannot find next direntry, error %d", err);
472 
473 out_free:
474 	if (file->private_data)
475 		kfree(file->private_data);
476 	if (file)
477 		free(file);
478 	if (dentry)
479 		free(dentry);
480 	if (dir)
481 		free(dir);
482 
483 	return ret;
484 }
485 
486 static unsigned long ubifs_findfile(struct super_block *sb, char *filename)
487 {
488 	int ret;
489 	char *next;
490 	char fpath[128];
491 	char symlinkpath[128];
492 	char *name = fpath;
493 	unsigned long root_inum = 1;
494 	unsigned long inum;
495 	int symlink_count = 0; /* Don't allow symlink recursion */
496 	char link_name[64];
497 
498 	strcpy(fpath, filename);
499 
500 	/* Remove all leading slashes */
501 	while (*name == '/')
502 		name++;
503 
504 	/*
505 	 * Handle root-direcoty ('/')
506 	 */
507 	inum = root_inum;
508 	if (!name || *name == '\0')
509 		return inum;
510 
511 	for (;;) {
512 		struct inode *inode;
513 		struct ubifs_inode *ui;
514 
515 		/* Extract the actual part from the pathname.  */
516 		next = strchr(name, '/');
517 		if (next) {
518 			/* Remove all leading slashes.  */
519 			while (*next == '/')
520 				*(next++) = '\0';
521 		}
522 
523 		ret = ubifs_finddir(sb, name, root_inum, &inum);
524 		if (!ret)
525 			return 0;
526 		inode = ubifs_iget(sb, inum);
527 
528 		if (!inode)
529 			return 0;
530 		ui = ubifs_inode(inode);
531 
532 		if ((inode->i_mode & S_IFMT) == S_IFLNK) {
533 			char buf[128];
534 
535 			/* We have some sort of symlink recursion, bail out */
536 			if (symlink_count++ > 8) {
537 				printf("Symlink recursion, aborting\n");
538 				return 0;
539 			}
540 			memcpy(link_name, ui->data, ui->data_len);
541 			link_name[ui->data_len] = '\0';
542 
543 			if (link_name[0] == '/') {
544 				/* Absolute path, redo everything without
545 				 * the leading slash */
546 				next = name = link_name + 1;
547 				root_inum = 1;
548 				continue;
549 			}
550 			/* Relative to cur dir */
551 			sprintf(buf, "%s/%s",
552 					link_name, next == NULL ? "" : next);
553 			memcpy(symlinkpath, buf, sizeof(buf));
554 			next = name = symlinkpath;
555 			continue;
556 		}
557 
558 		/*
559 		 * Check if directory with this name exists
560 		 */
561 
562 		/* Found the node!  */
563 		if (!next || *next == '\0')
564 			return inum;
565 
566 		root_inum = inum;
567 		name = next;
568 	}
569 
570 	return 0;
571 }
572 
573 int ubifs_ls(char *filename)
574 {
575 	struct ubifs_info *c = ubifs_sb->s_fs_info;
576 	struct file *file;
577 	struct dentry *dentry;
578 	struct inode *dir;
579 	void *dirent = NULL;
580 	unsigned long inum;
581 	int ret = 0;
582 
583 	c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
584 	inum = ubifs_findfile(ubifs_sb, filename);
585 	if (!inum) {
586 		ret = -1;
587 		goto out;
588 	}
589 
590 	file = kzalloc(sizeof(struct file), 0);
591 	dentry = kzalloc(sizeof(struct dentry), 0);
592 	dir = kzalloc(sizeof(struct inode), 0);
593 	if (!file || !dentry || !dir) {
594 		printf("%s: Error, no memory for malloc!\n", __func__);
595 		ret = -ENOMEM;
596 		goto out_mem;
597 	}
598 
599 	dir->i_sb = ubifs_sb;
600 	file->f_path.dentry = dentry;
601 	file->f_path.dentry->d_parent = dentry;
602 	file->f_path.dentry->d_inode = dir;
603 	file->f_path.dentry->d_inode->i_ino = inum;
604 	file->f_pos = 1;
605 	file->private_data = NULL;
606 	ubifs_printdir(file, dirent);
607 
608 out_mem:
609 	if (file)
610 		free(file);
611 	if (dentry)
612 		free(dentry);
613 	if (dir)
614 		free(dir);
615 
616 out:
617 	ubi_close_volume(c->ubi);
618 	return ret;
619 }
620 
621 /*
622  * ubifsload...
623  */
624 
625 /* file.c */
626 
627 static inline void *kmap(struct page *page)
628 {
629 	return page->addr;
630 }
631 
632 static int read_block(struct inode *inode, void *addr, unsigned int block,
633 		      struct ubifs_data_node *dn)
634 {
635 	struct ubifs_info *c = inode->i_sb->s_fs_info;
636 	int err, len, out_len;
637 	union ubifs_key key;
638 	unsigned int dlen;
639 
640 	data_key_init(c, &key, inode->i_ino, block);
641 	err = ubifs_tnc_lookup(c, &key, dn);
642 	if (err) {
643 		if (err == -ENOENT)
644 			/* Not found, so it must be a hole */
645 			memset(addr, 0, UBIFS_BLOCK_SIZE);
646 		return err;
647 	}
648 
649 	ubifs_assert(le64_to_cpu(dn->ch.sqnum) > ubifs_inode(inode)->creat_sqnum);
650 
651 	len = le32_to_cpu(dn->size);
652 	if (len <= 0 || len > UBIFS_BLOCK_SIZE)
653 		goto dump;
654 
655 	dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
656 	out_len = UBIFS_BLOCK_SIZE;
657 	err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
658 			       le16_to_cpu(dn->compr_type));
659 	if (err || len != out_len)
660 		goto dump;
661 
662 	/*
663 	 * Data length can be less than a full block, even for blocks that are
664 	 * not the last in the file (e.g., as a result of making a hole and
665 	 * appending data). Ensure that the remainder is zeroed out.
666 	 */
667 	if (len < UBIFS_BLOCK_SIZE)
668 		memset(addr + len, 0, UBIFS_BLOCK_SIZE - len);
669 
670 	return 0;
671 
672 dump:
673 	ubifs_err("bad data node (block %u, inode %lu)",
674 		  block, inode->i_ino);
675 	ubifs_dump_node(c, dn);
676 	return -EINVAL;
677 }
678 
679 static int do_readpage(struct ubifs_info *c, struct inode *inode,
680 		       struct page *page, int last_block_size)
681 {
682 	void *addr;
683 	int err = 0, i;
684 	unsigned int block, beyond;
685 	struct ubifs_data_node *dn;
686 	loff_t i_size = inode->i_size;
687 
688 	dbg_gen("ino %lu, pg %lu, i_size %lld",
689 		inode->i_ino, page->index, i_size);
690 
691 	addr = kmap(page);
692 
693 	block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
694 	beyond = (i_size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
695 	if (block >= beyond) {
696 		/* Reading beyond inode */
697 		memset(addr, 0, PAGE_CACHE_SIZE);
698 		goto out;
699 	}
700 
701 	dn = kmalloc(UBIFS_MAX_DATA_NODE_SZ, GFP_NOFS);
702 	if (!dn)
703 		return -ENOMEM;
704 
705 	i = 0;
706 	while (1) {
707 		int ret;
708 
709 		if (block >= beyond) {
710 			/* Reading beyond inode */
711 			err = -ENOENT;
712 			memset(addr, 0, UBIFS_BLOCK_SIZE);
713 		} else {
714 			/*
715 			 * Reading last block? Make sure to not write beyond
716 			 * the requested size in the destination buffer.
717 			 */
718 			if (((block + 1) == beyond) || last_block_size) {
719 				void *buff;
720 				int dlen;
721 
722 				/*
723 				 * We need to buffer the data locally for the
724 				 * last block. This is to not pad the
725 				 * destination area to a multiple of
726 				 * UBIFS_BLOCK_SIZE.
727 				 */
728 				buff = malloc_cache_aligned(UBIFS_BLOCK_SIZE);
729 				if (!buff) {
730 					printf("%s: Error, malloc fails!\n",
731 					       __func__);
732 					err = -ENOMEM;
733 					break;
734 				}
735 
736 				/* Read block-size into temp buffer */
737 				ret = read_block(inode, buff, block, dn);
738 				if (ret) {
739 					err = ret;
740 					if (err != -ENOENT) {
741 						free(buff);
742 						break;
743 					}
744 				}
745 
746 				if (last_block_size)
747 					dlen = last_block_size;
748 				else
749 					dlen = le32_to_cpu(dn->size);
750 
751 				/* Now copy required size back to dest */
752 				memcpy(addr, buff, dlen);
753 
754 				free(buff);
755 			} else {
756 				ret = read_block(inode, addr, block, dn);
757 				if (ret) {
758 					err = ret;
759 					if (err != -ENOENT)
760 						break;
761 				}
762 			}
763 		}
764 		if (++i >= UBIFS_BLOCKS_PER_PAGE)
765 			break;
766 		block += 1;
767 		addr += UBIFS_BLOCK_SIZE;
768 	}
769 	if (err) {
770 		if (err == -ENOENT) {
771 			/* Not found, so it must be a hole */
772 			dbg_gen("hole");
773 			goto out_free;
774 		}
775 		ubifs_err("cannot read page %lu of inode %lu, error %d",
776 			  page->index, inode->i_ino, err);
777 		goto error;
778 	}
779 
780 out_free:
781 	kfree(dn);
782 out:
783 	return 0;
784 
785 error:
786 	kfree(dn);
787 	return err;
788 }
789 
790 int ubifs_load(char *filename, u32 addr, u32 size)
791 {
792 	struct ubifs_info *c = ubifs_sb->s_fs_info;
793 	unsigned long inum;
794 	struct inode *inode;
795 	struct page page;
796 	int err = 0;
797 	int i;
798 	int count;
799 	int last_block_size = 0;
800 
801 	c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
802 	/* ubifs_findfile will resolve symlinks, so we know that we get
803 	 * the real file here */
804 	inum = ubifs_findfile(ubifs_sb, filename);
805 	if (!inum) {
806 		err = -1;
807 		goto out;
808 	}
809 
810 	/*
811 	 * Read file inode
812 	 */
813 	inode = ubifs_iget(ubifs_sb, inum);
814 	if (IS_ERR(inode)) {
815 		printf("%s: Error reading inode %ld!\n", __func__, inum);
816 		err = PTR_ERR(inode);
817 		goto out;
818 	}
819 
820 	/*
821 	 * If no size was specified or if size bigger than filesize
822 	 * set size to filesize
823 	 */
824 	if ((size == 0) || (size > inode->i_size))
825 		size = inode->i_size;
826 
827 	count = (size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
828 	printf("Loading file '%s' to addr 0x%08x with size %d (0x%08x)...\n",
829 	       filename, addr, size, size);
830 
831 	page.addr = (void *)addr;
832 	page.index = 0;
833 	page.inode = inode;
834 	for (i = 0; i < count; i++) {
835 		/*
836 		 * Make sure to not read beyond the requested size
837 		 */
838 		if (((i + 1) == count) && (size < inode->i_size))
839 			last_block_size = size - (i * PAGE_SIZE);
840 
841 		err = do_readpage(c, inode, &page, last_block_size);
842 		if (err)
843 			break;
844 
845 		page.addr += PAGE_SIZE;
846 		page.index++;
847 	}
848 
849 	if (err)
850 		printf("Error reading file '%s'\n", filename);
851 	else {
852 		setenv_hex("filesize", size);
853 		printf("Done\n");
854 	}
855 
856 	ubifs_iput(inode);
857 
858 out:
859 	ubi_close_volume(c->ubi);
860 	return err;
861 }
862