| .. | .. | 
|---|
 | 1 | +// SPDX-License-Identifier: GPL-2.0-only  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * This file is part of UBIFS. | 
|---|
| 3 | 4 |   * | 
|---|
| 4 | 5 |   * Copyright (C) 2006-2008 Nokia Corporation. | 
|---|
| 5 |  | - *  | 
|---|
| 6 |  | - * This program is free software; you can redistribute it and/or modify it  | 
|---|
| 7 |  | - * under the terms of the GNU General Public License version 2 as published by  | 
|---|
| 8 |  | - * the Free Software Foundation.  | 
|---|
| 9 |  | - *  | 
|---|
| 10 |  | - * This program is distributed in the hope that it will be useful, but WITHOUT  | 
|---|
| 11 |  | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  | 
|---|
| 12 |  | - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  | 
|---|
| 13 |  | - * more details.  | 
|---|
| 14 |  | - *  | 
|---|
| 15 |  | - * You should have received a copy of the GNU General Public License along with  | 
|---|
| 16 |  | - * this program; if not, write to the Free Software Foundation, Inc., 51  | 
|---|
| 17 |  | - * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA  | 
|---|
| 18 | 6 |   * | 
|---|
| 19 | 7 |   * Authors: Adrian Hunter | 
|---|
| 20 | 8 |   *          Artem Bityutskiy (Битюцкий Артём) | 
|---|
| .. | .. | 
|---|
| 619 | 607 |  } | 
|---|
| 620 | 608 |   | 
|---|
| 621 | 609 |  /** | 
|---|
| 622 |  | - * pnode_lookup - lookup a pnode in the LPT.  | 
|---|
| 623 |  | - * @c: UBIFS file-system description object  | 
|---|
| 624 |  | - * @i: pnode number (0 to (main_lebs - 1) / UBIFS_LPT_FANOUT))  | 
|---|
| 625 |  | - *  | 
|---|
| 626 |  | - * This function returns a pointer to the pnode on success or a negative  | 
|---|
| 627 |  | - * error code on failure.  | 
|---|
| 628 |  | - */  | 
|---|
| 629 |  | -static struct ubifs_pnode *pnode_lookup(struct ubifs_info *c, int i)  | 
|---|
| 630 |  | -{  | 
|---|
| 631 |  | -	int err, h, iip, shft;  | 
|---|
| 632 |  | -	struct ubifs_nnode *nnode;  | 
|---|
| 633 |  | -  | 
|---|
| 634 |  | -	if (!c->nroot) {  | 
|---|
| 635 |  | -		err = ubifs_read_nnode(c, NULL, 0);  | 
|---|
| 636 |  | -		if (err)  | 
|---|
| 637 |  | -			return ERR_PTR(err);  | 
|---|
| 638 |  | -	}  | 
|---|
| 639 |  | -	i <<= UBIFS_LPT_FANOUT_SHIFT;  | 
|---|
| 640 |  | -	nnode = c->nroot;  | 
|---|
| 641 |  | -	shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT;  | 
|---|
| 642 |  | -	for (h = 1; h < c->lpt_hght; h++) {  | 
|---|
| 643 |  | -		iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));  | 
|---|
| 644 |  | -		shft -= UBIFS_LPT_FANOUT_SHIFT;  | 
|---|
| 645 |  | -		nnode = ubifs_get_nnode(c, nnode, iip);  | 
|---|
| 646 |  | -		if (IS_ERR(nnode))  | 
|---|
| 647 |  | -			return ERR_CAST(nnode);  | 
|---|
| 648 |  | -	}  | 
|---|
| 649 |  | -	iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));  | 
|---|
| 650 |  | -	return ubifs_get_pnode(c, nnode, iip);  | 
|---|
| 651 |  | -}  | 
|---|
| 652 |  | -  | 
|---|
| 653 |  | -/**  | 
|---|
| 654 | 610 |   * add_pnode_dirt - add dirty space to LPT LEB properties. | 
|---|
| 655 | 611 |   * @c: UBIFS file-system description object | 
|---|
| 656 | 612 |   * @pnode: pnode for which to add dirt | 
|---|
| .. | .. | 
|---|
| 702 | 658 |  { | 
|---|
| 703 | 659 |  	struct ubifs_pnode *pnode; | 
|---|
| 704 | 660 |   | 
|---|
| 705 |  | -	pnode = pnode_lookup(c, 0);  | 
|---|
 | 661 | +	pnode = ubifs_pnode_lookup(c, 0);  | 
|---|
| 706 | 662 |  	if (IS_ERR(pnode)) | 
|---|
| 707 | 663 |  		return PTR_ERR(pnode); | 
|---|
| 708 | 664 |   | 
|---|
| .. | .. | 
|---|
| 956 | 912 |  	struct ubifs_pnode *pnode; | 
|---|
| 957 | 913 |  	struct ubifs_nbranch *branch; | 
|---|
| 958 | 914 |   | 
|---|
| 959 |  | -	pnode = pnode_lookup(c, node_num);  | 
|---|
 | 915 | +	pnode = ubifs_pnode_lookup(c, node_num);  | 
|---|
| 960 | 916 |  	if (IS_ERR(pnode)) | 
|---|
| 961 | 917 |  		return PTR_ERR(pnode); | 
|---|
| 962 | 918 |  	branch = &pnode->parent->nbranch[pnode->iip]; | 
|---|
| .. | .. | 
|---|
| 1279 | 1235 |  	if (err) | 
|---|
| 1280 | 1236 |  		goto out; | 
|---|
| 1281 | 1237 |   | 
|---|
 | 1238 | +	err = ubifs_lpt_calc_hash(c, c->mst_node->hash_lpt);  | 
|---|
 | 1239 | +	if (err)  | 
|---|
 | 1240 | +		goto out;  | 
|---|
 | 1241 | +  | 
|---|
| 1282 | 1242 |  	/* Copy the LPT's own lprops for end commit to write */ | 
|---|
| 1283 | 1243 |  	memcpy(c->ltab_cmt, c->ltab, | 
|---|
| 1284 | 1244 |  	       sizeof(struct ubifs_lpt_lprops) * c->lpt_lebs); | 
|---|
| .. | .. | 
|---|
| 1558 | 1518 |  		struct ubifs_nbranch *branch; | 
|---|
| 1559 | 1519 |   | 
|---|
| 1560 | 1520 |  		cond_resched(); | 
|---|
| 1561 |  | -		pnode = pnode_lookup(c, i);  | 
|---|
 | 1521 | +		pnode = ubifs_pnode_lookup(c, i);  | 
|---|
| 1562 | 1522 |  		if (IS_ERR(pnode)) | 
|---|
| 1563 | 1523 |  			return PTR_ERR(pnode); | 
|---|
| 1564 | 1524 |  		branch = &pnode->parent->nbranch[pnode->iip]; | 
|---|
| .. | .. | 
|---|
| 1636 | 1596 |  	if (!dbg_is_chk_lprops(c)) | 
|---|
| 1637 | 1597 |  		return 0; | 
|---|
| 1638 | 1598 |   | 
|---|
| 1639 |  | -	buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);  | 
|---|
 | 1599 | +	buf = p = __vmalloc(c->leb_size, GFP_NOFS);  | 
|---|
| 1640 | 1600 |  	if (!buf) { | 
|---|
| 1641 | 1601 |  		ubifs_err(c, "cannot allocate memory for ltab checking"); | 
|---|
| 1642 | 1602 |  		return 0; | 
|---|
| .. | .. | 
|---|
| 1710 | 1670 |  	for (i = 0; i < cnt; i++) { | 
|---|
| 1711 | 1671 |  		struct ubifs_pnode *pnode; | 
|---|
| 1712 | 1672 |   | 
|---|
| 1713 |  | -		pnode = pnode_lookup(c, i);  | 
|---|
 | 1673 | +		pnode = ubifs_pnode_lookup(c, i);  | 
|---|
| 1714 | 1674 |  		if (IS_ERR(pnode)) | 
|---|
| 1715 | 1675 |  			return PTR_ERR(pnode); | 
|---|
| 1716 | 1676 |  		cond_resched(); | 
|---|
| .. | .. | 
|---|
| 1885 | 1845 |  	void *buf, *p; | 
|---|
| 1886 | 1846 |   | 
|---|
| 1887 | 1847 |  	pr_err("(pid %d) start dumping LEB %d\n", current->pid, lnum); | 
|---|
| 1888 |  | -	buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);  | 
|---|
 | 1848 | +	buf = p = __vmalloc(c->leb_size, GFP_NOFS);  | 
|---|
| 1889 | 1849 |  	if (!buf) { | 
|---|
| 1890 | 1850 |  		ubifs_err(c, "cannot allocate memory to dump LPT"); | 
|---|
| 1891 | 1851 |  		return; | 
|---|