forked from ska-sa/roach2_uboot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
UBIFS: Implement read-only UBIFS support in U-Boot
The U-Boot UBIFS implementation is largely a direct copy from the current Linux version (2.6.29-rc6). As already done in the UBI version we have an "abstraction layer" to redefine or remove some OS calls (e.g. mutex_lock() ...). This makes it possible to use the original Linux code with very little changes. And by this we can better update to later Linux versions. I removed some of the Linux features that are not used in the U-Boot version (e.g. garbage-collection, write support). Signed-off-by: Stefan Roese <[email protected]> CC: Artem Bityutskiy <[email protected]> CC: Adrian Hunter <[email protected]>
- Loading branch information
Showing
30 changed files
with
17,067 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# | ||
# (C) Copyright 2006 | ||
# Wolfgang Denk, DENX Software Engineering, [email protected]. | ||
# | ||
# (C) Copyright 2003 | ||
# Pavel Bartusek, Sysgo Real-Time Solutions AG, [email protected] | ||
# | ||
# | ||
# See file CREDITS for list of people who contributed to this | ||
# project. | ||
# | ||
# This program is free software; you can redistribute it and/or | ||
# modify it under the terms of the GNU General Public License as | ||
# published by the Free Software Foundation; either version 2 of | ||
# the License, or (at your option) any later version. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program; if not, write to the Free Software | ||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
# MA 02111-1307 USA | ||
# | ||
|
||
include $(TOPDIR)/config.mk | ||
|
||
LIB = $(obj)libubifs.a | ||
|
||
COBJS-$(CONFIG_CMD_UBIFS) := ubifs.o io.o super.o sb.o master.o lpt.o | ||
COBJS-$(CONFIG_CMD_UBIFS) += lpt_commit.o scan.o lprops.o | ||
COBJS-$(CONFIG_CMD_UBIFS) += tnc.o tnc_misc.o debug.o crc16.o budget.o | ||
COBJS-$(CONFIG_CMD_UBIFS) += log.o orphan.o recovery.o replay.o | ||
|
||
SRCS := $(AOBJS:.o=.S) $(COBJS-y:.o=.c) | ||
OBJS := $(addprefix $(obj),$(AOBJS) $(COBJS-y)) | ||
|
||
all: $(LIB) $(AOBJS) | ||
|
||
$(LIB): $(obj).depend $(OBJS) | ||
$(AR) $(ARFLAGS) $@ $(OBJS) | ||
|
||
######################################################################### | ||
|
||
# defines $(obj).depend target | ||
include $(SRCTREE)/rules.mk | ||
|
||
sinclude $(obj).depend | ||
|
||
######################################################################### |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
/* | ||
* This file is part of UBIFS. | ||
* | ||
* Copyright (C) 2006-2008 Nokia Corporation. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along with | ||
* this program; if not, write to the Free Software Foundation, Inc., 51 | ||
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
* | ||
* Authors: Adrian Hunter | ||
* Artem Bityutskiy (Битюцкий Артём) | ||
*/ | ||
|
||
/* | ||
* This file implements the budgeting sub-system which is responsible for UBIFS | ||
* space management. | ||
* | ||
* Factors such as compression, wasted space at the ends of LEBs, space in other | ||
* journal heads, the effect of updates on the index, and so on, make it | ||
* impossible to accurately predict the amount of space needed. Consequently | ||
* approximations are used. | ||
*/ | ||
|
||
#include "ubifs.h" | ||
#include <linux/math64.h> | ||
|
||
/** | ||
* ubifs_calc_min_idx_lebs - calculate amount of eraseblocks for the index. | ||
* @c: UBIFS file-system description object | ||
* | ||
* This function calculates and returns the number of eraseblocks which should | ||
* be kept for index usage. | ||
*/ | ||
int ubifs_calc_min_idx_lebs(struct ubifs_info *c) | ||
{ | ||
int idx_lebs, eff_leb_size = c->leb_size - c->max_idx_node_sz; | ||
long long idx_size; | ||
|
||
idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx; | ||
|
||
/* And make sure we have thrice the index size of space reserved */ | ||
idx_size = idx_size + (idx_size << 1); | ||
|
||
/* | ||
* We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes' | ||
* pair, nor similarly the two variables for the new index size, so we | ||
* have to do this costly 64-bit division on fast-path. | ||
*/ | ||
idx_size += eff_leb_size - 1; | ||
idx_lebs = div_u64(idx_size, eff_leb_size); | ||
/* | ||
* The index head is not available for the in-the-gaps method, so add an | ||
* extra LEB to compensate. | ||
*/ | ||
idx_lebs += 1; | ||
if (idx_lebs < MIN_INDEX_LEBS) | ||
idx_lebs = MIN_INDEX_LEBS; | ||
return idx_lebs; | ||
} | ||
|
||
/** | ||
* ubifs_reported_space - calculate reported free space. | ||
* @c: the UBIFS file-system description object | ||
* @free: amount of free space | ||
* | ||
* This function calculates amount of free space which will be reported to | ||
* user-space. User-space application tend to expect that if the file-system | ||
* (e.g., via the 'statfs()' call) reports that it has N bytes available, they | ||
* are able to write a file of size N. UBIFS attaches node headers to each data | ||
* node and it has to write indexing nodes as well. This introduces additional | ||
* overhead, and UBIFS has to report slightly less free space to meet the above | ||
* expectations. | ||
* | ||
* This function assumes free space is made up of uncompressed data nodes and | ||
* full index nodes (one per data node, tripled because we always allow enough | ||
* space to write the index thrice). | ||
* | ||
* Note, the calculation is pessimistic, which means that most of the time | ||
* UBIFS reports less space than it actually has. | ||
*/ | ||
long long ubifs_reported_space(const struct ubifs_info *c, long long free) | ||
{ | ||
int divisor, factor, f; | ||
|
||
/* | ||
* Reported space size is @free * X, where X is UBIFS block size | ||
* divided by UBIFS block size + all overhead one data block | ||
* introduces. The overhead is the node header + indexing overhead. | ||
* | ||
* Indexing overhead calculations are based on the following formula: | ||
* I = N/(f - 1) + 1, where I - number of indexing nodes, N - number | ||
* of data nodes, f - fanout. Because effective UBIFS fanout is twice | ||
* as less than maximum fanout, we assume that each data node | ||
* introduces 3 * @c->max_idx_node_sz / (@c->fanout/2 - 1) bytes. | ||
* Note, the multiplier 3 is because UBIFS reserves thrice as more space | ||
* for the index. | ||
*/ | ||
f = c->fanout > 3 ? c->fanout >> 1 : 2; | ||
factor = UBIFS_BLOCK_SIZE; | ||
divisor = UBIFS_MAX_DATA_NODE_SZ; | ||
divisor += (c->max_idx_node_sz * 3) / (f - 1); | ||
free *= factor; | ||
return div_u64(free, divisor); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* crc16.c | ||
* | ||
* This source code is licensed under the GNU General Public License, | ||
* Version 2. See the file COPYING for more details. | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include "crc16.h" | ||
|
||
/** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */ | ||
u16 const crc16_table[256] = { | ||
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, | ||
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, | ||
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, | ||
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, | ||
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, | ||
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, | ||
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, | ||
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, | ||
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, | ||
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, | ||
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, | ||
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, | ||
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, | ||
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, | ||
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, | ||
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, | ||
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, | ||
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, | ||
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, | ||
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, | ||
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, | ||
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, | ||
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, | ||
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, | ||
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, | ||
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, | ||
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, | ||
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, | ||
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, | ||
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, | ||
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, | ||
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 | ||
}; | ||
|
||
/** | ||
* crc16 - compute the CRC-16 for the data buffer | ||
* @crc: previous CRC value | ||
* @buffer: data pointer | ||
* @len: number of bytes in the buffer | ||
* | ||
* Returns the updated CRC value. | ||
*/ | ||
u16 crc16(u16 crc, u8 const *buffer, size_t len) | ||
{ | ||
while (len--) | ||
crc = crc16_byte(crc, *buffer++); | ||
return crc; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* crc16.h - CRC-16 routine | ||
* | ||
* Implements the standard CRC-16: | ||
* Width 16 | ||
* Poly 0x8005 (x^16 + x^15 + x^2 + 1) | ||
* Init 0 | ||
* | ||
* Copyright (c) 2005 Ben Gardner <[email protected]> | ||
* | ||
* This source code is licensed under the GNU General Public License, | ||
* Version 2. See the file COPYING for more details. | ||
*/ | ||
|
||
#ifndef __CRC16_H | ||
#define __CRC16_H | ||
|
||
#include <linux/types.h> | ||
|
||
extern u16 const crc16_table[256]; | ||
|
||
extern u16 crc16(u16 crc, const u8 *buffer, size_t len); | ||
|
||
static inline u16 crc16_byte(u16 crc, const u8 data) | ||
{ | ||
return (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff]; | ||
} | ||
|
||
#endif /* __CRC16_H */ | ||
|
Oops, something went wrong.