diff options
Diffstat (limited to 'fs/ubifs/lpt.c')
| -rw-r--r-- | fs/ubifs/lpt.c | 112 | 
1 files changed, 56 insertions, 56 deletions
diff --git a/fs/ubifs/lpt.c b/fs/ubifs/lpt.c index 72775d35b99..d46b19ec181 100644 --- a/fs/ubifs/lpt.c +++ b/fs/ubifs/lpt.c @@ -701,8 +701,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,  			alen = ALIGN(len, c->min_io_size);  			set_ltab(c, lnum, c->leb_size - alen, alen - len);  			memset(p, 0xff, alen - len); -			err = ubi_leb_change(c->ubi, lnum++, buf, alen, -					     UBI_SHORTTERM); +			err = ubifs_leb_change(c, lnum++, buf, alen);  			if (err)  				goto out;  			p = buf; @@ -732,8 +731,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,  				set_ltab(c, lnum, c->leb_size - alen,  					    alen - len);  				memset(p, 0xff, alen - len); -				err = ubi_leb_change(c->ubi, lnum++, buf, alen, -						     UBI_SHORTTERM); +				err = ubifs_leb_change(c, lnum++, buf, alen);  				if (err)  					goto out;  				p = buf; @@ -780,8 +778,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,  			alen = ALIGN(len, c->min_io_size);  			set_ltab(c, lnum, c->leb_size - alen, alen - len);  			memset(p, 0xff, alen - len); -			err = ubi_leb_change(c->ubi, lnum++, buf, alen, -					     UBI_SHORTTERM); +			err = ubifs_leb_change(c, lnum++, buf, alen);  			if (err)  				goto out;  			p = buf; @@ -806,7 +803,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,  		alen = ALIGN(len, c->min_io_size);  		set_ltab(c, lnum, c->leb_size - alen, alen - len);  		memset(p, 0xff, alen - len); -		err = ubi_leb_change(c->ubi, lnum++, buf, alen, UBI_SHORTTERM); +		err = ubifs_leb_change(c, lnum++, buf, alen);  		if (err)  			goto out;  		p = buf; @@ -826,7 +823,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,  	/* Write remaining buffer */  	memset(p, 0xff, alen - len); -	err = ubi_leb_change(c->ubi, lnum, buf, alen, UBI_SHORTTERM); +	err = ubifs_leb_change(c, lnum, buf, alen);  	if (err)  		goto out; @@ -926,7 +923,7 @@ static int check_lpt_crc(void *buf, int len)  	if (crc != calc_crc) {  		ubifs_err("invalid crc in LPT node: crc %hx calc %hx", crc,  			  calc_crc); -		dbg_dump_stack(); +		dump_stack();  		return -EINVAL;  	}  	return 0; @@ -949,7 +946,7 @@ static int check_lpt_type(uint8_t **addr, int *pos, int type)  	if (node_type != type) {  		ubifs_err("invalid type (%d) in LPT node type %d", node_type,  			  type); -		dbg_dump_stack(); +		dump_stack();  		return -EINVAL;  	}  	return 0; @@ -1222,7 +1219,7 @@ int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)  		if (c->big_lpt)  			nnode->num = calc_nnode_num_from_parent(c, parent, iip);  	} else { -		err = ubi_read(c->ubi, lnum, buf, offs, c->nnode_sz); +		err = ubifs_leb_read(c, lnum, buf, offs, c->nnode_sz, 1);  		if (err)  			goto out;  		err = ubifs_unpack_nnode(c, buf, nnode); @@ -1247,6 +1244,7 @@ int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)  out:  	ubifs_err("error %d reading nnode at %d:%d", err, lnum, offs); +	dump_stack();  	kfree(nnode);  	return err;  } @@ -1270,10 +1268,9 @@ static int read_pnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)  	lnum = branch->lnum;  	offs = branch->offs;  	pnode = kzalloc(sizeof(struct ubifs_pnode), GFP_NOFS); -	if (!pnode) { -		err = -ENOMEM; -		goto out; -	} +	if (!pnode) +		return -ENOMEM; +  	if (lnum == 0) {  		/*  		 * This pnode was not written which just means that the LEB @@ -1291,7 +1288,7 @@ static int read_pnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)  			lprops->flags = ubifs_categorize_lprops(c, lprops);  		}  	} else { -		err = ubi_read(c->ubi, lnum, buf, offs, c->pnode_sz); +		err = ubifs_leb_read(c, lnum, buf, offs, c->pnode_sz, 1);  		if (err)  			goto out;  		err = unpack_pnode(c, buf, pnode); @@ -1312,8 +1309,9 @@ static int read_pnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)  out:  	ubifs_err("error %d reading pnode at %d:%d", err, lnum, offs); -	dbg_dump_pnode(c, pnode, parent, iip); -	dbg_msg("calc num: %d", calc_pnode_num_from_parent(c, parent, iip)); +	ubifs_dump_pnode(c, pnode, parent, iip); +	dump_stack(); +	ubifs_err("calc num: %d", calc_pnode_num_from_parent(c, parent, iip));  	kfree(pnode);  	return err;  } @@ -1332,7 +1330,7 @@ static int read_ltab(struct ubifs_info *c)  	buf = vmalloc(c->ltab_sz);  	if (!buf)  		return -ENOMEM; -	err = ubi_read(c->ubi, c->ltab_lnum, buf, c->ltab_offs, c->ltab_sz); +	err = ubifs_leb_read(c, c->ltab_lnum, buf, c->ltab_offs, c->ltab_sz, 1);  	if (err)  		goto out;  	err = unpack_ltab(c, buf); @@ -1355,7 +1353,8 @@ static int read_lsave(struct ubifs_info *c)  	buf = vmalloc(c->lsave_sz);  	if (!buf)  		return -ENOMEM; -	err = ubi_read(c->ubi, c->lsave_lnum, buf, c->lsave_offs, c->lsave_sz); +	err = ubifs_leb_read(c, c->lsave_lnum, buf, c->lsave_offs, +			     c->lsave_sz, 1);  	if (err)  		goto out;  	err = unpack_lsave(c, buf); @@ -1738,16 +1737,23 @@ int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr)  	if (rd) {  		err = lpt_init_rd(c);  		if (err) -			return err; +			goto out_err;  	}  	if (wr) {  		err = lpt_init_wr(c);  		if (err) -			return err; +			goto out_err;  	}  	return 0; + +out_err: +	if (wr) +		ubifs_lpt_free(c, 1); +	if (rd) +		ubifs_lpt_free(c, 0); +	return err;  }  /** @@ -1815,8 +1821,8 @@ static struct ubifs_nnode *scan_get_nnode(struct ubifs_info *c,  		if (c->big_lpt)  			nnode->num = calc_nnode_num_from_parent(c, parent, iip);  	} else { -		err = ubi_read(c->ubi, branch->lnum, buf, branch->offs, -			       c->nnode_sz); +		err = ubifs_leb_read(c, branch->lnum, buf, branch->offs, +				     c->nnode_sz, 1);  		if (err)  			return ERR_PTR(err);  		err = ubifs_unpack_nnode(c, buf, nnode); @@ -1884,8 +1890,8 @@ static struct ubifs_pnode *scan_get_pnode(struct ubifs_info *c,  		ubifs_assert(branch->lnum >= c->lpt_first &&  			     branch->lnum <= c->lpt_last);  		ubifs_assert(branch->offs >= 0 && branch->offs < c->leb_size); -		err = ubi_read(c->ubi, branch->lnum, buf, branch->offs, -			       c->pnode_sz); +		err = ubifs_leb_read(c, branch->lnum, buf, branch->offs, +				     c->pnode_sz, 1);  		if (err)  			return ERR_PTR(err);  		err = unpack_pnode(c, buf, pnode); @@ -1984,12 +1990,11 @@ again:  				if (path[h].in_tree)  					continue; -				nnode = kmalloc(sz, GFP_NOFS); +				nnode = kmemdup(&path[h].nnode, sz, GFP_NOFS);  				if (!nnode) {  					err = -ENOMEM;  					goto out;  				} -				memcpy(nnode, &path[h].nnode, sz);  				parent = nnode->parent;  				parent->nbranch[nnode->iip].nnode = nnode;  				path[h].ptr.nnode = nnode; @@ -2002,12 +2007,11 @@ again:  				const size_t sz = sizeof(struct ubifs_pnode);  				struct ubifs_nnode *parent; -				pnode = kmalloc(sz, GFP_NOFS); +				pnode = kmemdup(&path[h].pnode, sz, GFP_NOFS);  				if (!pnode) {  					err = -ENOMEM;  					goto out;  				} -				memcpy(pnode, &path[h].pnode, sz);  				parent = pnode->parent;  				parent->nbranch[pnode->iip].pnode = pnode;  				path[h].ptr.pnode = pnode; @@ -2080,8 +2084,6 @@ out:  	return err;  } -#ifdef CONFIG_UBIFS_FS_DEBUG -  /**   * dbg_chk_pnode - check a pnode.   * @c: the UBIFS file-system description object @@ -2096,8 +2098,8 @@ static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,  	int i;  	if (pnode->num != col) { -		dbg_err("pnode num %d expected %d parent num %d iip %d", -			pnode->num, col, pnode->parent->num, pnode->iip); +		ubifs_err("pnode num %d expected %d parent num %d iip %d", +			  pnode->num, col, pnode->parent->num, pnode->iip);  		return -EINVAL;  	}  	for (i = 0; i < UBIFS_LPT_FANOUT; i++) { @@ -2111,14 +2113,14 @@ static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,  		if (lnum >= c->leb_cnt)  			continue;  		if (lprops->lnum != lnum) { -			dbg_err("bad LEB number %d expected %d", -				lprops->lnum, lnum); +			ubifs_err("bad LEB number %d expected %d", +				  lprops->lnum, lnum);  			return -EINVAL;  		}  		if (lprops->flags & LPROPS_TAKEN) {  			if (cat != LPROPS_UNCAT) { -				dbg_err("LEB %d taken but not uncat %d", -					lprops->lnum, cat); +				ubifs_err("LEB %d taken but not uncat %d", +					  lprops->lnum, cat);  				return -EINVAL;  			}  			continue; @@ -2130,8 +2132,8 @@ static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,  			case LPROPS_FRDI_IDX:  				break;  			default: -				dbg_err("LEB %d index but cat %d", -					lprops->lnum, cat); +				ubifs_err("LEB %d index but cat %d", +					  lprops->lnum, cat);  				return -EINVAL;  			}  		} else { @@ -2143,8 +2145,8 @@ static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,  			case LPROPS_FREEABLE:  				break;  			default: -				dbg_err("LEB %d not index but cat %d", -					lprops->lnum, cat); +				ubifs_err("LEB %d not index but cat %d", +					  lprops->lnum, cat);  				return -EINVAL;  			}  		} @@ -2184,24 +2186,24 @@ static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,  			break;  		}  		if (!found) { -			dbg_err("LEB %d cat %d not found in cat heap/list", -				lprops->lnum, cat); +			ubifs_err("LEB %d cat %d not found in cat heap/list", +				  lprops->lnum, cat);  			return -EINVAL;  		}  		switch (cat) {  		case LPROPS_EMPTY:  			if (lprops->free != c->leb_size) { -				dbg_err("LEB %d cat %d free %d dirty %d", -					lprops->lnum, cat, lprops->free, -					lprops->dirty); +				ubifs_err("LEB %d cat %d free %d dirty %d", +					  lprops->lnum, cat, lprops->free, +					  lprops->dirty);  				return -EINVAL;  			}  		case LPROPS_FREEABLE:  		case LPROPS_FRDI_IDX:  			if (lprops->free + lprops->dirty != c->leb_size) { -				dbg_err("LEB %d cat %d free %d dirty %d", -					lprops->lnum, cat, lprops->free, -					lprops->dirty); +				ubifs_err("LEB %d cat %d free %d dirty %d", +					  lprops->lnum, cat, lprops->free, +					  lprops->dirty);  				return -EINVAL;  			}  		} @@ -2225,7 +2227,7 @@ int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode,  	struct ubifs_cnode *cn;  	int num, iip = 0, err; -	if (!(ubifs_chk_flags & UBIFS_CHK_LPROPS)) +	if (!dbg_is_chk_lprops(c))  		return 0;  	while (cnode) { @@ -2235,9 +2237,9 @@ int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode,  			/* cnode is a nnode */  			num = calc_nnode_num(row, col);  			if (cnode->num != num) { -				dbg_err("nnode num %d expected %d " -					"parent num %d iip %d", cnode->num, num, -					(nnode ? nnode->num : 0), cnode->iip); +				ubifs_err("nnode num %d expected %d parent num %d iip %d", +					  cnode->num, num, +					  (nnode ? nnode->num : 0), cnode->iip);  				return -EINVAL;  			}  			nn = (struct ubifs_nnode *)cnode; @@ -2274,5 +2276,3 @@ int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode,  	}  	return 0;  } - -#endif /* CONFIG_UBIFS_FS_DEBUG */  | 
