Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
4cbb9b80
Commit
4cbb9b80
authored
May 23, 2006
by
Thomas Gleixner
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of /home/tglx/work/kernel/git/mtd-2.6/
Signed-off-by:
Thomas Gleixner
<
tglx@linutronix.de
>
parents
6dfc6d25
9fe4854c
Changes
32
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
357 additions
and
415 deletions
+357
-415
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/chips/cfi_cmdset_0001.c
+3
-3
drivers/mtd/chips/cfi_cmdset_0020.c
drivers/mtd/chips/cfi_cmdset_0020.c
+2
-3
drivers/mtd/devices/doc2000.c
drivers/mtd/devices/doc2000.c
+1
-1
drivers/mtd/devices/doc2001.c
drivers/mtd/devices/doc2001.c
+1
-1
drivers/mtd/devices/doc2001plus.c
drivers/mtd/devices/doc2001plus.c
+1
-1
drivers/mtd/mtdconcat.c
drivers/mtd/mtdconcat.c
+5
-5
drivers/mtd/mtdpart.c
drivers/mtd/mtdpart.c
+1
-1
drivers/mtd/nand/au1550nd.c
drivers/mtd/nand/au1550nd.c
+2
-2
drivers/mtd/nand/diskonchip.c
drivers/mtd/nand/diskonchip.c
+8
-8
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nand_base.c
+32
-32
drivers/mtd/nand/nand_bbt.c
drivers/mtd/nand/nand_bbt.c
+15
-15
drivers/mtd/nand/nandsim.c
drivers/mtd/nand/nandsim.c
+1
-1
drivers/mtd/nand/rtc_from4.c
drivers/mtd/nand/rtc_from4.c
+1
-1
drivers/mtd/onenand/onenand_base.c
drivers/mtd/onenand/onenand_base.c
+37
-37
drivers/mtd/onenand/onenand_bbt.c
drivers/mtd/onenand/onenand_bbt.c
+2
-2
fs/jffs2/dir.c
fs/jffs2/dir.c
+20
-20
fs/jffs2/erase.c
fs/jffs2/erase.c
+2
-2
fs/jffs2/file.c
fs/jffs2/file.c
+4
-4
fs/jffs2/fs.c
fs/jffs2/fs.c
+4
-16
fs/jffs2/gc.c
fs/jffs2/gc.c
+19
-32
fs/jffs2/nodelist.c
fs/jffs2/nodelist.c
+10
-3
fs/jffs2/nodelist.h
fs/jffs2/nodelist.h
+49
-26
fs/jffs2/nodemgmt.c
fs/jffs2/nodemgmt.c
+20
-15
fs/jffs2/os-linux.h
fs/jffs2/os-linux.h
+2
-12
fs/jffs2/scan.c
fs/jffs2/scan.c
+8
-16
fs/jffs2/summary.c
fs/jffs2/summary.c
+10
-20
fs/jffs2/wbuf.c
fs/jffs2/wbuf.c
+10
-42
fs/jffs2/write.c
fs/jffs2/write.c
+39
-46
fs/jffs2/xattr.c
fs/jffs2/xattr.c
+30
-30
fs/jffs2/xattr.h
fs/jffs2/xattr.h
+7
-7
include/linux/mtd/mtd.h
include/linux/mtd/mtd.h
+5
-2
include/mtd/mtd-abi.h
include/mtd/mtd-abi.h
+6
-9
No files found.
drivers/mtd/chips/cfi_cmdset_0001.c
View file @
4cbb9b80
...
...
@@ -545,12 +545,12 @@ static int cfi_intelext_partition_fixup(struct mtd_info *mtd,
if
(
extp
->
MinorVersion
>=
'4'
)
{
struct
cfi_intelext_programming_regioninfo
*
prinfo
;
prinfo
=
(
struct
cfi_intelext_programming_regioninfo
*
)
&
extp
->
extra
[
offs
];
MTD_PROGREGION_SIZE
(
mtd
)
=
cfi
->
interleave
<<
prinfo
->
ProgRegShift
;
mtd
->
writesize
=
cfi
->
interleave
<<
prinfo
->
ProgRegShift
;
MTD_PROGREGION_CTRLMODE_VALID
(
mtd
)
=
cfi
->
interleave
*
prinfo
->
ControlValid
;
MTD_PROGREGION_CTRLMODE_INVALID
(
mtd
)
=
cfi
->
interleave
*
prinfo
->
ControlInvalid
;
mtd
->
flags
|=
MTD_PROGRAM_REGIONS
;
mtd
->
flags
&=
~
MTD_BIT_WRITEABLE
;
printk
(
KERN_DEBUG
"%s: program region size/ctrl_valid/ctrl_inval = %d/%d/%d
\n
"
,
map
->
name
,
MTD_PROGREGION_SIZE
(
mtd
)
,
map
->
name
,
mtd
->
writesize
,
MTD_PROGREGION_CTRLMODE_VALID
(
mtd
),
MTD_PROGREGION_CTRLMODE_INVALID
(
mtd
));
}
...
...
drivers/mtd/chips/cfi_cmdset_0020.c
View file @
4cbb9b80
...
...
@@ -238,9 +238,8 @@ static struct mtd_info *cfi_staa_setup(struct map_info *map)
mtd
->
unlock
=
cfi_staa_unlock
;
mtd
->
suspend
=
cfi_staa_suspend
;
mtd
->
resume
=
cfi_staa_resume
;
mtd
->
flags
=
MTD_CAP_NORFLASH
;
mtd
->
flags
|=
MTD_ECC
;
/* FIXME: Not all STMicro flashes have this */
mtd
->
eccsize
=
8
;
/* FIXME: Should be 0 for STMicro flashes w/out ECC */
mtd
->
flags
=
MTD_CAP_NORFLASH
&
~
MTD_BIT_WRITEABLE
;
mtd
->
writesize
=
8
;
/* FIXME: Should be 0 for STMicro flashes w/out ECC */
map
->
fldrv
=
&
cfi_staa_chipdrv
;
__module_get
(
THIS_MODULE
);
mtd
->
name
=
map
->
name
;
...
...
drivers/mtd/devices/doc2000.c
View file @
4cbb9b80
...
...
@@ -579,7 +579,7 @@ void DoC2k_init(struct mtd_info *mtd)
mtd
->
ecctype
=
MTD_ECC_RS_DiskOnChip
;
mtd
->
size
=
0
;
mtd
->
erasesize
=
0
;
mtd
->
oobblock
=
512
;
mtd
->
writesize
=
512
;
mtd
->
oobsize
=
16
;
mtd
->
owner
=
THIS_MODULE
;
mtd
->
erase
=
doc_erase
;
...
...
drivers/mtd/devices/doc2001.c
View file @
4cbb9b80
...
...
@@ -361,7 +361,7 @@ void DoCMil_init(struct mtd_info *mtd)
/* FIXME: erase size is not always 8KiB */
mtd
->
erasesize
=
0x2000
;
mtd
->
oobblock
=
512
;
mtd
->
writesize
=
512
;
mtd
->
oobsize
=
16
;
mtd
->
owner
=
THIS_MODULE
;
mtd
->
erase
=
doc_erase
;
...
...
drivers/mtd/devices/doc2001plus.c
View file @
4cbb9b80
...
...
@@ -483,7 +483,7 @@ void DoCMilPlus_init(struct mtd_info *mtd)
mtd
->
size
=
0
;
mtd
->
erasesize
=
0
;
mtd
->
oobblock
=
512
;
mtd
->
writesize
=
512
;
mtd
->
oobsize
=
16
;
mtd
->
owner
=
THIS_MODULE
;
mtd
->
erase
=
doc_erase
;
...
...
drivers/mtd/mtdconcat.c
View file @
4cbb9b80
...
...
@@ -278,9 +278,9 @@ concat_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
return
-
EINVAL
;
/* Check alignment */
if
(
mtd
->
oobblock
>
1
)
{
if
(
mtd
->
writesize
>
1
)
{
loff_t
__to
=
to
;
if
(
do_div
(
__to
,
mtd
->
oobblock
)
||
(
total_len
%
mtd
->
oobblock
))
if
(
do_div
(
__to
,
mtd
->
writesize
)
||
(
total_len
%
mtd
->
writesize
))
return
-
EINVAL
;
}
...
...
@@ -334,7 +334,7 @@ concat_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
*
retlen
+=
retsize
;
total_len
-=
wsize
;
if
(
concat
->
mtd
.
type
==
MTD_NANDFLASH
&&
eccbuf
)
eccbuf
+=
mtd
->
oobavail
*
(
wsize
/
mtd
->
oobblock
);
eccbuf
+=
mtd
->
oobavail
*
(
wsize
/
mtd
->
writesize
);
if
(
total_len
==
0
)
break
;
...
...
@@ -833,7 +833,7 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c
concat
->
mtd
.
flags
=
subdev
[
0
]
->
flags
;
concat
->
mtd
.
size
=
subdev
[
0
]
->
size
;
concat
->
mtd
.
erasesize
=
subdev
[
0
]
->
erasesize
;
concat
->
mtd
.
oobblock
=
subdev
[
0
]
->
oobblock
;
concat
->
mtd
.
writesize
=
subdev
[
0
]
->
writesize
;
concat
->
mtd
.
oobsize
=
subdev
[
0
]
->
oobsize
;
concat
->
mtd
.
ecctype
=
subdev
[
0
]
->
ecctype
;
concat
->
mtd
.
eccsize
=
subdev
[
0
]
->
eccsize
;
...
...
@@ -881,7 +881,7 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c
subdev
[
i
]
->
flags
&
MTD_WRITEABLE
;
}
concat
->
mtd
.
size
+=
subdev
[
i
]
->
size
;
if
(
concat
->
mtd
.
oobblock
!=
subdev
[
i
]
->
oobblock
||
if
(
concat
->
mtd
.
writesize
!=
subdev
[
i
]
->
writesize
||
concat
->
mtd
.
oobsize
!=
subdev
[
i
]
->
oobsize
||
concat
->
mtd
.
ecctype
!=
subdev
[
i
]
->
ecctype
||
concat
->
mtd
.
eccsize
!=
subdev
[
i
]
->
eccsize
||
...
...
drivers/mtd/mtdpart.c
View file @
4cbb9b80
...
...
@@ -398,7 +398,7 @@ int add_mtd_partitions(struct mtd_info *master,
slave
->
mtd
.
type
=
master
->
type
;
slave
->
mtd
.
flags
=
master
->
flags
&
~
parts
[
i
].
mask_flags
;
slave
->
mtd
.
size
=
parts
[
i
].
size
;
slave
->
mtd
.
oobblock
=
master
->
oobblock
;
slave
->
mtd
.
writesize
=
master
->
writesize
;
slave
->
mtd
.
oobsize
=
master
->
oobsize
;
slave
->
mtd
.
oobavail
=
master
->
oobavail
;
slave
->
mtd
.
ecctype
=
master
->
ecctype
;
...
...
drivers/mtd/nand/au1550nd.c
View file @
4cbb9b80
...
...
@@ -356,9 +356,9 @@ static void au1550_command(struct mtd_info *mtd, unsigned command, int column, i
if
(
command
==
NAND_CMD_SEQIN
)
{
int
readcmd
;
if
(
column
>=
mtd
->
oobblock
)
{
if
(
column
>=
mtd
->
writesize
)
{
/* OOB area */
column
-=
mtd
->
oobblock
;
column
-=
mtd
->
writesize
;
readcmd
=
NAND_CMD_READOOB
;
}
else
if
(
column
<
256
)
{
/* First 256 bytes --> READ0 */
...
...
drivers/mtd/nand/diskonchip.c
View file @
4cbb9b80
...
...
@@ -761,9 +761,9 @@ static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int colu
if
(
command
==
NAND_CMD_SEQIN
)
{
int
readcmd
;
if
(
column
>=
mtd
->
oobblock
)
{
if
(
column
>=
mtd
->
writesize
)
{
/* OOB area */
column
-=
mtd
->
oobblock
;
column
-=
mtd
->
writesize
;
readcmd
=
NAND_CMD_READOOB
;
}
else
if
(
column
<
256
)
{
/* First 256 bytes --> READ0 */
...
...
@@ -1093,8 +1093,8 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch
size_t
retlen
;
for
(
offs
=
0
;
offs
<
mtd
->
size
;
offs
+=
mtd
->
erasesize
)
{
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
oobblock
,
&
retlen
,
buf
);
if
(
retlen
!=
mtd
->
oobblock
)
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
writesize
,
&
retlen
,
buf
);
if
(
retlen
!=
mtd
->
writesize
)
continue
;
if
(
ret
)
{
printk
(
KERN_WARNING
"ECC error scanning DOC at 0x%x
\n
"
,
offs
);
...
...
@@ -1118,8 +1118,8 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const ch
/* Only one mediaheader was found. We want buf to contain a
mediaheader on return, so we'll have to re-read the one we found. */
offs
=
doc
->
mh0_page
<<
this
->
page_shift
;
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
oobblock
,
&
retlen
,
buf
);
if
(
retlen
!=
mtd
->
oobblock
)
{
ret
=
mtd
->
read
(
mtd
,
offs
,
mtd
->
writesize
,
&
retlen
,
buf
);
if
(
retlen
!=
mtd
->
writesize
)
{
/* Insanity. Give up. */
printk
(
KERN_ERR
"Read DiskOnChip Media Header once, but can't reread it???
\n
"
);
return
0
;
...
...
@@ -1139,7 +1139,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio
unsigned
blocks
,
maxblocks
;
int
offs
,
numheaders
;
buf
=
kmalloc
(
mtd
->
oobblock
,
GFP_KERNEL
);
buf
=
kmalloc
(
mtd
->
writesize
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"DiskOnChip mediaheader kmalloc failed!
\n
"
);
return
0
;
...
...
@@ -1247,7 +1247,7 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti
if
(
inftl_bbt_write
)
end
-=
(
INFTL_BBT_RESERVED_BLOCKS
<<
this
->
phys_erase_shift
);
buf
=
kmalloc
(
mtd
->
oobblock
,
GFP_KERNEL
);
buf
=
kmalloc
(
mtd
->
writesize
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"DiskOnChip mediaheader kmalloc failed!
\n
"
);
return
0
;
...
...
drivers/mtd/nand/nand_base.c
View file @
4cbb9b80
...
...
@@ -572,9 +572,9 @@ static void nand_command(struct mtd_info *mtd, unsigned command, int column,
if
(
command
==
NAND_CMD_SEQIN
)
{
int
readcmd
;
if
(
column
>=
mtd
->
oobblock
)
{
if
(
column
>=
mtd
->
writesize
)
{
/* OOB area */
column
-=
mtd
->
oobblock
;
column
-=
mtd
->
writesize
;
readcmd
=
NAND_CMD_READOOB
;
}
else
if
(
column
<
256
)
{
/* First 256 bytes --> READ0 */
...
...
@@ -670,7 +670,7 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned command, int column,
/* Emulate NAND_CMD_READOOB */
if
(
command
==
NAND_CMD_READOOB
)
{
column
+=
mtd
->
oobblock
;
column
+=
mtd
->
writesize
;
command
=
NAND_CMD_READ0
;
}
...
...
@@ -895,7 +895,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this, int pag
/* No ecc, write all */
case
NAND_ECC_NONE
:
printk
(
KERN_WARNING
"Writing data without ECC to NAND-FLASH is not recommended
\n
"
);
this
->
write_buf
(
mtd
,
this
->
data_poi
,
mtd
->
oobblock
);
this
->
write_buf
(
mtd
,
this
->
data_poi
,
mtd
->
writesize
);
break
;
/* Software ecc 3/256, write all */
...
...
@@ -906,7 +906,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this, int pag
oob_buf
[
oob_config
[
eccidx
]]
=
ecc_code
[
i
];
datidx
+=
this
->
ecc
.
size
;
}
this
->
write_buf
(
mtd
,
this
->
data_poi
,
mtd
->
oobblock
);
this
->
write_buf
(
mtd
,
this
->
data_poi
,
mtd
->
writesize
);
break
;
default:
eccbytes
=
this
->
ecc
.
bytes
;
...
...
@@ -1167,9 +1167,9 @@ int nand_do_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
page
=
realpage
&
this
->
pagemask
;
/* Get raw starting column */
col
=
from
&
(
mtd
->
oobblock
-
1
);
col
=
from
&
(
mtd
->
writesize
-
1
);
end
=
mtd
->
oobblock
;
end
=
mtd
->
writesize
;
ecc
=
this
->
ecc
.
size
;
eccbytes
=
this
->
ecc
.
bytes
;
...
...
@@ -1327,7 +1327,7 @@ int nand_do_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
buf
[
read
++
]
=
data_poi
[
j
];
this
->
pagebuf
=
realpage
;
}
else
read
+=
mtd
->
oobblock
;
read
+=
mtd
->
writesize
;
/* Apply delay or wait for ready/busy pin
* Do this before the AUTOINCR check, so no problems
...
...
@@ -1485,7 +1485,7 @@ int nand_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len, s
int
chip
=
(
int
)(
from
>>
this
->
chip_shift
);
int
sndcmd
=
1
;
int
cnt
=
0
;
int
pagesize
=
mtd
->
oobblock
+
mtd
->
oobsize
;
int
pagesize
=
mtd
->
writesize
+
mtd
->
oobsize
;
int
blockcheck
=
(
1
<<
(
this
->
phys_erase_shift
-
this
->
page_shift
))
-
1
;
/* Do not allow reads past end of device */
...
...
@@ -1587,7 +1587,7 @@ static uint8_t *nand_prepare_oobbuf(struct mtd_info *mtd, uint8_t *fsbuf, struct
return
this
->
oob_buf
;
}
#define NOTALIGNED(x) (x & (mtd->
oobblock
-1)) != 0
#define NOTALIGNED(x) (x & (mtd->
writesize
-1)) != 0
/**
* nand_write - [MTD Interface] compability function for nand_write_ecc
...
...
@@ -1700,7 +1700,7 @@ static int nand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
/* Next oob page */
oob
+=
mtd
->
oobsize
;
/* Update written bytes count */
written
+=
mtd
->
oobblock
;
written
+=
mtd
->
writesize
;
if
(
written
==
len
)
goto
cmp
;
...
...
@@ -1811,7 +1811,7 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, size_t *r
if
(
NAND_MUST_PAD
(
this
))
{
/* Write out desired data */
this
->
cmdfunc
(
mtd
,
NAND_CMD_SEQIN
,
mtd
->
oobblock
,
page
&
this
->
pagemask
);
this
->
cmdfunc
(
mtd
,
NAND_CMD_SEQIN
,
mtd
->
writesize
,
page
&
this
->
pagemask
);
/* prepad 0xff for partial programming */
this
->
write_buf
(
mtd
,
ffchars
,
column
);
/* write data */
...
...
@@ -1820,7 +1820,7 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, size_t *r
this
->
write_buf
(
mtd
,
ffchars
,
mtd
->
oobsize
-
(
len
+
column
));
}
else
{
/* Write out desired data */
this
->
cmdfunc
(
mtd
,
NAND_CMD_SEQIN
,
mtd
->
oobblock
+
column
,
page
&
this
->
pagemask
);
this
->
cmdfunc
(
mtd
,
NAND_CMD_SEQIN
,
mtd
->
writesize
+
column
,
page
&
this
->
pagemask
);
/* write data */
this
->
write_buf
(
mtd
,
buf
,
len
);
}
...
...
@@ -1953,7 +1953,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
/* If the given tuple is >= pagesize then
* write it out from the iov
*/
if
((
vecs
->
iov_len
-
len
)
>=
mtd
->
oobblock
)
{
if
((
vecs
->
iov_len
-
len
)
>=
mtd
->
writesize
)
{
/* Calc number of pages we can write
* out of this iov in one go */
numpages
=
(
vecs
->
iov_len
-
len
)
>>
this
->
page_shift
;
...
...
@@ -1973,8 +1973,8 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
&
oobbuf
[
oob
],
oobsel
,
i
!=
numpages
);
if
(
ret
)
goto
out
;
this
->
data_poi
+=
mtd
->
oobblock
;
len
+=
mtd
->
oobblock
;
this
->
data_poi
+=
mtd
->
writesize
;
len
+=
mtd
->
writesize
;
oob
+=
mtd
->
oobsize
;
page
++
;
}
...
...
@@ -1989,7 +1989,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
* tuple until we have a full page to write
*/
int
cnt
=
0
;
while
(
cnt
<
mtd
->
oobblock
)
{
while
(
cnt
<
mtd
->
writesize
)
{
if
(
vecs
->
iov_base
!=
NULL
&&
vecs
->
iov_len
)
this
->
data_buf
[
cnt
++
]
=
((
uint8_t
*
)
vecs
->
iov_base
)[
len
++
];
/* Check, if we have to switch to the next tuple */
...
...
@@ -2015,7 +2015,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
if
(
ret
)
goto
out
;
written
+=
mtd
->
oobblock
*
numpages
;
written
+=
mtd
->
writesize
*
numpages
;
/* All done ? */
if
(
!
count
)
break
;
...
...
@@ -2351,7 +2351,7 @@ static int nand_allocate_kmem(struct mtd_info *mtd, struct nand_chip *this)
}
if
(
!
this
->
data_buf
)
{
len
=
mtd
->
oobblock
+
mtd
->
oobsize
;
len
=
mtd
->
writesize
+
mtd
->
oobsize
;
this
->
data_buf
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
!
this
->
data_buf
)
goto
outerr
;
...
...
@@ -2455,10 +2455,10 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
/* The 4th id byte is the important one */
extid
=
this
->
read_byte
(
mtd
);
/* Calc pagesize */
mtd
->
oobblock
=
1024
<<
(
extid
&
0x3
);
mtd
->
writesize
=
1024
<<
(
extid
&
0x3
);
extid
>>=
2
;
/* Calc oobsize */
mtd
->
oobsize
=
(
8
<<
(
extid
&
0x01
))
*
(
mtd
->
oobblock
>>
9
);
mtd
->
oobsize
=
(
8
<<
(
extid
&
0x01
))
*
(
mtd
->
writesize
>>
9
);
extid
>>=
2
;
/* Calc blocksize. Blocksize is multiples of 64KiB */
mtd
->
erasesize
=
(
64
*
1024
)
<<
(
extid
&
0x03
);
...
...
@@ -2471,8 +2471,8 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
* Old devices have this data hardcoded in the device id table
*/
mtd
->
erasesize
=
nand_flash_ids
[
i
].
erasesize
;
mtd
->
oobblock
=
nand_flash_ids
[
i
].
pagesize
;
mtd
->
oobsize
=
mtd
->
oobblock
/
32
;
mtd
->
writesize
=
nand_flash_ids
[
i
].
pagesize
;
mtd
->
oobsize
=
mtd
->
writesize
/
32
;
busw
=
nand_flash_ids
[
i
].
options
&
NAND_BUSWIDTH_16
;
}
...
...
@@ -2497,7 +2497,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
}
/* Calculate the address shift from the page size */
this
->
page_shift
=
ffs
(
mtd
->
oobblock
)
-
1
;
this
->
page_shift
=
ffs
(
mtd
->
writesize
)
-
1
;
/* Convert chipsize to number of pages per chip -1. */
this
->
pagemask
=
(
this
->
chipsize
>>
this
->
page_shift
)
-
1
;
...
...
@@ -2506,7 +2506,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
this
->
chip_shift
=
ffs
(
this
->
chipsize
)
-
1
;
/* Set the bad block position */
this
->
badblockpos
=
mtd
->
oobblock
>
512
?
this
->
badblockpos
=
mtd
->
writesize
>
512
?
NAND_LARGE_BADBLOCK_POS
:
NAND_SMALL_BADBLOCK_POS
;
/* Get chip options, preserve non chip based options */
...
...
@@ -2531,7 +2531,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
this
->
erase_cmd
=
single_erase_cmd
;
/* Do not replace user supplied command function ! */
if
(
mtd
->
oobblock
>
512
&&
this
->
cmdfunc
==
nand_command
)
if
(
mtd
->
writesize
>
512
&&
this
->
cmdfunc
==
nand_command
)
this
->
cmdfunc
=
nand_command_lp
;
printk
(
KERN_INFO
"NAND device: Manufacturer ID:"
...
...
@@ -2657,11 +2657,11 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
"Hardware ECC not possible
\n
"
);
BUG
();
}
if
(
mtd
->
oobblock
>=
this
->
ecc
.
size
)
if
(
mtd
->
writesize
>=
this
->
ecc
.
size
)
break
;
printk
(
KERN_WARNING
"%d byte HW ECC not possible on "
"%d byte page size, fallback to SW ECC
\n
"
,
this
->
ecc
.
size
,
mtd
->
oobblock
);
this
->
ecc
.
size
,
mtd
->
writesize
);
this
->
ecc
.
mode
=
NAND_ECC_SOFT
;
case
NAND_ECC_SOFT
:
...
...
@@ -2674,7 +2674,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
case
NAND_ECC_NONE
:
printk
(
KERN_WARNING
"NAND_ECC_NONE selected by board driver. "
"This is not recommended !!
\n
"
);
this
->
ecc
.
size
=
mtd
->
oobblock
;
this
->
ecc
.
size
=
mtd
->
writesize
;
this
->
ecc
.
bytes
=
0
;
break
;
default:
...
...
@@ -2687,8 +2687,8 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
* Set the number of read / write steps for one page depending on ECC
* mode
*/
this
->
ecc
.
steps
=
mtd
->
oobblock
/
this
->
ecc
.
size
;
if
(
this
->
ecc
.
steps
*
this
->
ecc
.
size
!=
mtd
->
oobblock
)
{
this
->
ecc
.
steps
=
mtd
->
writesize
/
this
->
ecc
.
size
;
if
(
this
->
ecc
.
steps
*
this
->
ecc
.
size
!=
mtd
->
writesize
)
{
printk
(
KERN_WARNING
"Invalid ecc parameters
\n
"
);
BUG
();
}
...
...
@@ -2706,7 +2706,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
/* Fill in remaining MTD driver data */
mtd
->
type
=
MTD_NANDFLASH
;
mtd
->
flags
=
MTD_CAP_NANDFLASH
|
MTD_ECC
;
mtd
->
flags
=
MTD_CAP_NANDFLASH
;
mtd
->
ecctype
=
MTD_ECC_SW
;
mtd
->
erase
=
nand_erase
;
mtd
->
point
=
NULL
;
...
...
drivers/mtd/nand/nand_bbt.c
View file @
4cbb9b80
...
...
@@ -247,15 +247,15 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_des
/* Read the primary version, if available */
if
(
td
->
options
&
NAND_BBT_VERSION
)
{
nand_read_raw
(
mtd
,
buf
,
td
->
pages
[
0
]
<<
this
->
page_shift
,
mtd
->
oobblock
,
mtd
->
oobsize
);
td
->
version
[
0
]
=
buf
[
mtd
->
oobblock
+
td
->
veroffs
];
nand_read_raw
(
mtd
,
buf
,
td
->
pages
[
0
]
<<
this
->
page_shift
,
mtd
->
writesize
,
mtd
->
oobsize
);
td
->
version
[
0
]
=
buf
[
mtd
->
writesize
+
td
->
veroffs
];
printk
(
KERN_DEBUG
"Bad block table at page %d, version 0x%02X
\n
"
,
td
->
pages
[
0
],
td
->
version
[
0
]);
}
/* Read the mirror version, if available */
if
(
md
&&
(
md
->
options
&
NAND_BBT_VERSION
))
{
nand_read_raw
(
mtd
,
buf
,
md
->
pages
[
0
]
<<
this
->
page_shift
,
mtd
->
oobblock
,
mtd
->
oobsize
);
md
->
version
[
0
]
=
buf
[
mtd
->
oobblock
+
md
->
veroffs
];
nand_read_raw
(
mtd
,
buf
,
md
->
pages
[
0
]
<<
this
->
page_shift
,
mtd
->
writesize
,
mtd
->
oobsize
);
md
->
version
[
0
]
=
buf
[
mtd
->
writesize
+
md
->
veroffs
];
printk
(
KERN_DEBUG
"Bad block table at page %d, version 0x%02X
\n
"
,
md
->
pages
[
0
],
md
->
version
[
0
]);
}
...
...
@@ -298,8 +298,8 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
readlen
=
bd
->
len
;
}
else
{
/* Full page content should be read */
scanlen
=
mtd
->
oobblock
+
mtd
->
oobsize
;
readlen
=
len
*
mtd
->
oobblock
;
scanlen
=
mtd
->
writesize
+
mtd
->
oobsize
;
readlen
=
len
*
mtd
->
writesize
;
ooblen
=
len
*
mtd
->
oobsize
;
}
...
...
@@ -334,7 +334,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
/* Read the full oob until read_oob is fixed to
* handle single byte reads for 16 bit buswidth */
ret
=
mtd
->
read_oob
(
mtd
,
from
+
j
*
mtd
->
oobblock
,
mtd
->
oobsize
,
&
retlen
,
buf
);
ret
=
mtd
->
read_oob
(
mtd
,
from
+
j
*
mtd
->
writesize
,
mtd
->
oobsize
,
&
retlen
,
buf
);
if
(
ret
)
return
ret
;
...
...
@@ -345,7 +345,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
break
;
}
}
else
{
if
(
check_pattern
(
&
buf
[
j
*
scanlen
],
scanlen
,
mtd
->
oobblock
,
bd
))
{
if
(
check_pattern
(
&
buf
[
j
*
scanlen
],
scanlen
,
mtd
->
writesize
,
bd
))
{
this
->
bbt
[
i
>>
3
]
|=
0x03
<<
(
i
&
0x6
);
printk
(
KERN_WARNING
"Bad eraseblock %d at 0x%08x
\n
"
,
i
>>
1
,
(
unsigned
int
)
from
);
...
...
@@ -381,7 +381,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
struct
nand_chip
*
this
=
mtd
->
priv
;
int
i
,
chips
;
int
bits
,
startblock
,
block
,
dir
;
int
scanlen
=
mtd
->
oobblock
+
mtd
->
oobsize
;
int
scanlen
=
mtd
->
writesize
+
mtd
->
oobsize
;
int
bbtblocks
;
/* Search direction top -> down ? */
...
...
@@ -414,11 +414,11 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
for
(
block
=
0
;
block
<
td
->
maxblocks
;
block
++
)
{
int
actblock
=
startblock
+
dir
*
block
;
/* Read first page */
nand_read_raw
(
mtd
,
buf
,
actblock
<<
this
->
bbt_erase_shift
,
mtd
->
oobblock
,
mtd
->
oobsize
);
if
(
!
check_pattern
(
buf
,
scanlen
,
mtd
->
oobblock
,
td
))
{
nand_read_raw
(
mtd
,
buf
,
actblock
<<
this
->
bbt_erase_shift
,
mtd
->
writesize
,
mtd
->
oobsize
);
if
(
!
check_pattern
(
buf
,
scanlen
,
mtd
->
writesize
,
td
))
{
td
->
pages
[
i
]
=
actblock
<<
(
this
->
bbt_erase_shift
-
this
->
page_shift
);
if
(
td
->
options
&
NAND_BBT_VERSION
)
{
td
->
version
[
i
]
=
buf
[
mtd
->
oobblock
+
td
->
veroffs
];
td
->
version
[
i
]
=
buf
[
mtd
->
writesize
+
td
->
veroffs
];
}
break
;
}
...
...
@@ -586,7 +586,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
/* Calc length */
len
=
(
size_t
)
(
numblocks
>>
sft
);
/* Make it page aligned ! */
len
=
(
len
+
(
mtd
->
oobblock
-
1
))
&
~
(
mtd
->
oobblock
-
1
);
len
=
(
len
+
(
mtd
->
writesize
-
1
))
&
~
(
mtd
->
writesize
-
1
);
/* Preset the buffer with 0xff */
memset
(
buf
,
0xff
,
len
+
(
len
>>
this
->
page_shift
)
*
mtd
->
oobsize
);
offs
=
0
;
...
...
@@ -1063,13 +1063,13 @@ int nand_default_bbt(struct mtd_info *mtd)
this
->
bbt_md
=
&
bbt_mirror_descr
;
}
if
(
!
this
->
badblock_pattern
)
{
this
->
badblock_pattern
=
(
mtd
->
oobblock
>
512
)
?
&
largepage_flashbased
:
&
smallpage_flashbased
;
this
->
badblock_pattern
=
(
mtd
->
writesize
>
512
)
?
&
largepage_flashbased
:
&
smallpage_flashbased
;
}
}
else
{
this
->
bbt_td
=
NULL
;
this
->
bbt_md
=
NULL
;
if
(
!
this
->
badblock_pattern
)
{
this
->
badblock_pattern
=
(
mtd
->
oobblock
>
512
)
?
this
->
badblock_pattern
=
(
mtd
->
writesize
>
512
)
?
&
largepage_memorybased
:
&
smallpage_memorybased
;
}
}
...
...
drivers/mtd/nand/nandsim.c
View file @
4cbb9b80
...
...
@@ -369,7 +369,7 @@ init_nandsim(struct mtd_info *mtd)
/* Initialize the NAND flash parameters */
ns
->
busw
=
chip
->
options
&
NAND_BUSWIDTH_16
?
16
:
8
;
ns
->
geom
.
totsz
=
mtd
->
size
;
ns
->
geom
.
pgsz
=
mtd
->
oobblock
;
ns
->
geom
.
pgsz
=
mtd
->
writesize
;
ns
->
geom
.
oobsz
=
mtd
->
oobsize
;
ns
->
geom
.
secsz
=
mtd
->
erasesize
;
ns
->
geom
.
pgszoob
=
ns
->
geom
.
pgsz
+
ns
->
geom
.
oobsz
;
...
...
drivers/mtd/nand/rtc_from4.c
View file @
4cbb9b80
...
...
@@ -487,7 +487,7 @@ static int rtc_from4_errstat(struct mtd_info *mtd, struct nand_chip *this, int s
if
(
!
(
rtn
&
ERR_STAT_ECC_AVAILABLE
))
{
er_stat
|=
1
<<
1
;
/* err_ecc_not_avail */
}
else
{
len
=
mtd
->
oobblock
;
len
=
mtd
->
writesize
;
buf
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
!
buf
)
{
printk
(
KERN_ERR
"rtc_from4_errstat: Out of memory!
\n
"
);
...
...
drivers/mtd/onenand/onenand_base.c
View file @
4cbb9b80
...
...
@@ -354,7 +354,7 @@ static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
if
(
ONENAND_CURRENT_BUFFERRAM
(
this
))
{
if
(
area
==
ONENAND_DATARAM
)
return
mtd
->
oobblock
;
return
mtd
->
writesize
;
if
(
area
==
ONENAND_SPARERAM
)
return
mtd
->
oobsize
;
}
...
...
@@ -632,14 +632,14 @@ static int onenand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
/* TODO handling oob */
while
(
read
<
len
)
{
thislen
=
min_t
(
int
,
mtd
->
oobblock
,
len
-
read
);
thislen
=
min_t
(
int
,
mtd
->
writesize
,
len
-
read
);
column
=
from
&
(
mtd
->
oobblock
-
1
);
if
(
column
+
thislen
>
mtd
->
oobblock
)
thislen
=
mtd
->
oobblock
-
column
;
column
=
from
&
(
mtd
->
writesize
-
1
);
if
(
column
+
thislen
>
mtd
->
writesize
)
thislen
=
mtd
->
writesize
-
column
;
if
(
!
onenand_check_bufferram
(
mtd
,
from
))
{
this
->
command
(
mtd
,
ONENAND_CMD_READ
,
from
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_READ
,
from
,
mtd
->
writesize
);
ret
=
this
->
wait
(
mtd
,
FL_READING
);
/* First copy data and check return value for ECC handling */
...
...
@@ -752,7 +752,7 @@ static int onenand_read_oob(struct mtd_info *mtd, loff_t from, size_t len,
/* Read more? */
if
(
read
<
len
)
{
/* Page size */
from
+=
mtd
->
oobblock
;
from
+=
mtd
->
writesize
;
column
=
0
;
}
}
...
...
@@ -809,7 +809,7 @@ static int onenand_verify_page(struct mtd_info *mtd, u_char *buf, loff_t addr)
void
__iomem
*
dataram0
,
*
dataram1
;
int
ret
=
0
;
this
->
command
(
mtd
,
ONENAND_CMD_READ
,
addr
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_READ
,
addr
,
mtd
->
writesize
);
ret
=
this
->
wait
(
mtd
,
FL_READING
);
if
(
ret
)
...
...
@@ -819,9 +819,9 @@ static int onenand_verify_page(struct mtd_info *mtd, u_char *buf, loff_t addr)
/* Check, if the two dataram areas are same */
dataram0
=
this
->
base
+
ONENAND_DATARAM
;
dataram1
=
dataram0
+
mtd
->
oobblock
;
dataram1
=
dataram0
+
mtd
->
writesize
;
if
(
memcmp
(
dataram0
,
dataram1
,
mtd
->
oobblock
))
if
(
memcmp
(
dataram0
,
dataram1
,
mtd
->
writesize
))
return
-
EBADMSG
;
return
0
;
...
...
@@ -831,7 +831,7 @@ static int onenand_verify_page(struct mtd_info *mtd, u_char *buf, loff_t addr)
#define onenand_verify_oob(...) (0)
#endif
#define NOTALIGNED(x) ((x & (mtd->
oobblock
- 1)) != 0)
#define NOTALIGNED(x) ((x & (mtd->
writesize
- 1)) != 0)
/**
* onenand_write_ecc - [MTD Interface] OneNAND write with ECC
...
...
@@ -875,14 +875,14 @@ static int onenand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
/* Loop until all data write */
while
(
written
<
len
)
{
int
thislen
=
min_t
(
int
,
mtd
->
oobblock
,
len
-
written
);
int
thislen
=
min_t
(
int
,
mtd
->
writesize
,
len
-
written
);
this
->
command
(
mtd
,
ONENAND_CMD_BUFFERRAM
,
to
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_BUFFERRAM
,
to
,
mtd
->
writesize
);
this
->
write_bufferram
(
mtd
,
ONENAND_DATARAM
,
buf
,
0
,
thislen
);
this
->
write_bufferram
(
mtd
,
ONENAND_SPARERAM
,
ffchars
,
0
,
mtd
->
oobsize
);
this
->
command
(
mtd
,
ONENAND_CMD_PROG
,
to
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_PROG
,
to
,
mtd
->
writesize
);
onenand_update_bufferram
(
mtd
,
to
,
1
);
...
...
@@ -1070,10 +1070,10 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
* If the given tuple is >= pagesize then
* write it out from the iov
*/
if
((
vecs
->
iov_len
-
len
)
>=
mtd
->
oobblock
)
{
if
((
vecs
->
iov_len
-
len
)
>=
mtd
->
writesize
)
{
pbuf
=
vecs
->
iov_base
+
len
;
len
+=
mtd
->
oobblock
;
len
+=
mtd
->
writesize
;
/* Check, if we have to switch to the next tuple */
if
(
len
>=
(
int
)
vecs
->
iov_len
)
{
...
...
@@ -1083,8 +1083,8 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
}
}
else
{
int
cnt
=
0
,
thislen
;
while
(
cnt
<
mtd
->
oobblock
)
{
thislen
=
min_t
(
int
,
mtd
->
oobblock
-
cnt
,
vecs
->
iov_len
-
len
);
while
(
cnt
<
mtd
->
writesize
)
{
thislen
=
min_t
(
int
,
mtd
->
writesize
-
cnt
,
vecs
->
iov_len
-
len
);
memcpy
(
this
->
page_buf
+
cnt
,
vecs
->
iov_base
+
len
,
thislen
);
cnt
+=
thislen
;
len
+=
thislen
;
...
...
@@ -1098,12 +1098,12 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
}
}
this
->
command
(
mtd
,
ONENAND_CMD_BUFFERRAM
,
to
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_BUFFERRAM
,
to
,
mtd
->
writesize
);
this
->
write_bufferram
(
mtd
,
ONENAND_DATARAM
,
pbuf
,
0
,
mtd
->
oobblock
);
this
->
write_bufferram
(
mtd
,
ONENAND_DATARAM
,
pbuf
,
0
,
mtd
->
writesize
);
this
->
write_bufferram
(
mtd
,
ONENAND_SPARERAM
,
ffchars
,
0
,
mtd
->
oobsize
);
this
->
command
(
mtd
,
ONENAND_CMD_PROG
,
to
,
mtd
->
oobblock
);
this
->
command
(
mtd
,
ONENAND_CMD_PROG
,
to
,
mtd
->
writesize
);
onenand_update_bufferram
(
mtd
,
to
,
1
);
...
...
@@ -1121,9 +1121,9 @@ static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs,
goto
out
;
}
written
+=
mtd
->
oobblock
;
written
+=
mtd
->
writesize
;
to
+=
mtd
->
oobblock
;
to
+=
mtd
->
writesize
;
}
out:
...
...
@@ -1467,11 +1467,11 @@ static int do_otp_write(struct mtd_info *mtd, loff_t from, size_t len,
int
ret
;
/* Force buffer page aligned */
if
(
len
<
mtd
->
oobblock
)
{
if
(
len
<
mtd
->
writesize
)
{
memcpy
(
this
->
page_buf
,
buf
,
len
);
memset
(
this
->
page_buf
+
len
,
0xff
,
mtd
->
oobblock
-
len
);
memset
(
this
->
page_buf
+
len
,
0xff
,
mtd
->
writesize
-
len
);
pbuf
=
this
->
page_buf
;
len
=
mtd
->
oobblock
;
len
=
mtd
->
writesize
;
}
/* Enter OTP access mode */
...
...
@@ -1546,12 +1546,12 @@ static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
otp_pages
=
10
;
if
(
mode
==
MTD_OTP_FACTORY
)
{
from
+=
mtd
->
oobblock
*
otp_pages
;
from
+=
mtd
->
writesize
*
otp_pages
;
otp_pages
=
64
-
otp_pages
;
}
/* Check User/Factory boundary */
if
(((
mtd
->
oobblock
*
otp_pages
)
-
(
from
+
len
))
<
0
)
if
(((
mtd
->
writesize
*
otp_pages
)
-
(
from
+
len
))
<
0
)
return
0
;
while
(
len
>
0
&&
otp_pages
>
0
)
{
...
...
@@ -1564,10 +1564,10 @@ static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
otpinfo
=
(
struct
otp_info
*
)
buf
;
otpinfo
->
start
=
from
;
otpinfo
->
length
=
mtd
->
oobblock
;
otpinfo
->
length
=
mtd
->
writesize
;
otpinfo
->
locked
=
0
;
from
+=
mtd
->
oobblock
;
from
+=
mtd
->
writesize
;
buf
+=
sizeof
(
struct
otp_info
);
*
retlen
+=
sizeof
(
struct
otp_info
);
}
else
{
...
...
@@ -1811,15 +1811,15 @@ static int onenand_probe(struct mtd_info *mtd)
/* OneNAND page size & block size */
/* The data buffer size is equal to page size */
mtd
->
oobblock
=
this
->
read_word
(
this
->
base
+
ONENAND_REG_DATA_BUFFER_SIZE
);
mtd
->
oobsize
=
mtd
->
oobblock
>>
5
;
mtd
->
writesize
=
this
->
read_word
(
this
->
base
+
ONENAND_REG_DATA_BUFFER_SIZE
);
mtd
->
oobsize
=
mtd
->
writesize
>>
5
;
/* Pagers per block is always 64 in OneNAND */
mtd
->
erasesize
=
mtd
->
oobblock
<<
6
;
mtd
->
erasesize
=
mtd
->
writesize
<<
6
;
this
->
erase_shift
=
ffs
(
mtd
->
erasesize
)
-
1
;
this
->
page_shift
=
ffs
(
mtd
->
oobblock
)
-
1
;
this
->
page_shift
=
ffs
(
mtd
->
writesize
)
-
1
;
this
->
ppb_shift
=
(
this
->
erase_shift
-
this
->
page_shift
);
this
->
page_mask
=
(
mtd
->
erasesize
/
mtd
->
oobblock
)
-
1
;
this
->
page_mask
=
(
mtd
->
erasesize
/
mtd
->
writesize
)
-
1
;
/* REVIST: Multichip handling */
...
...
@@ -1909,7 +1909,7 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
/* Allocate buffers, if necessary */
if
(
!
this
->
page_buf
)
{
size_t
len
;
len
=
mtd
->
oobblock
+
mtd
->
oobsize
;
len
=
mtd
->
writesize
+
mtd
->
oobsize
;
this
->
page_buf
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
!
this
->
page_buf
)
{
printk
(
KERN_ERR
"onenand_scan(): Can't allocate page_buf
\n
"
);
...
...
@@ -1943,7 +1943,7 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
/* Fill in remaining MTD driver data */
mtd
->
type
=
MTD_NANDFLASH
;
mtd
->
flags
=
MTD_CAP_NANDFLASH
|
MTD_ECC
;
mtd
->
flags
=
MTD_CAP_NANDFLASH
;
mtd
->
ecctype
=
MTD_ECC_SW
;
mtd
->
erase
=
onenand_erase
;
mtd
->
point
=
NULL
;
...
...
drivers/mtd/onenand/onenand_bbt.c
View file @
4cbb9b80
...
...
@@ -87,13 +87,13 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
/* No need to read pages fully,
* just read required OOB bytes */
ret
=
mtd
->
read_oob
(
mtd
,
from
+
j
*
mtd
->
oobblock
+
bd
->
offs
,
ret
=
mtd
->
read_oob
(
mtd
,
from
+
j
*
mtd
->
writesize
+
bd
->
offs
,
readlen
,
&
retlen
,
&
buf
[
0
]);
if
(
ret
)
return
ret
;
if
(
check_short_pattern
(
&
buf
[
j
*
scanlen
],
scanlen
,
mtd
->
oobblock
,
bd
))
{
if
(
check_short_pattern
(
&
buf
[
j
*
scanlen
],
scanlen
,
mtd
->
writesize
,
bd
))
{
bbm
->
bbt
[
i
>>
3
]
|=
0x03
<<
(
i
&
0x6
);
printk
(
KERN_WARNING
"Bad eraseblock %d at 0x%08x
\n
"
,
i
>>
1
,
(
unsigned
int
)
from
);
...
...
fs/jffs2/dir.c
View file @
4cbb9b80
...
...
@@ -308,7 +308,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
struct
jffs2_full_dnode
*
fn
;
struct
jffs2_full_dirent
*
fd
;
int
namelen
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
,
targetlen
=
strlen
(
target
);
/* FIXME: If you care. We'd need to use frags for the target
...
...
@@ -327,8 +327,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
* Just the node will do for now, though
*/
namelen
=
dentry
->
d_name
.
len
;
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
targetlen
,
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
targetlen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
jffs2_free_raw_inode
(
ri
);
...
...
@@ -356,7 +356,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
ri
->
data_crc
=
cpu_to_je32
(
crc32
(
0
,
target
,
targetlen
));
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
target
,
targetlen
,
phys_ofs
,
ALLOC_NORMAL
);
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
target
,
targetlen
,
ALLOC_NORMAL
);
jffs2_free_raw_inode
(
ri
);
...
...
@@ -400,8 +400,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
return
ret
;
}
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
/* Eep. */
jffs2_clear_inode
(
inode
);
...
...
@@ -433,7 +433,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
dentry
->
d_name
.
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
phys_ofs
,
ALLOC_NORMAL
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
ALLOC_NORMAL
);
if
(
IS_ERR
(
fd
))
{
/* dirent failed to write. Delete the inode normally
...
...
@@ -471,7 +471,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
struct
jffs2_full_dnode
*
fn
;
struct
jffs2_full_dirent
*
fd
;
int
namelen
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
mode
|=
S_IFDIR
;
...
...
@@ -486,8 +486,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
* Just the node will do for now, though
*/
namelen
=
dentry
->
d_name
.
len
;
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
),
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
),
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
jffs2_free_raw_inode
(
ri
);
...
...
@@ -512,7 +512,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
ri
->
data_crc
=
cpu_to_je32
(
0
);
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
NULL
,
0
,
phys_ofs
,
ALLOC_NORMAL
);
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
NULL
,
0
,
ALLOC_NORMAL
);
jffs2_free_raw_inode
(
ri
);
...
...
@@ -542,8 +542,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
return
ret
;
}
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
/* Eep. */
jffs2_clear_inode
(
inode
);
...
...
@@ -575,7 +575,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
dentry
->
d_name
.
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
phys_ofs
,
ALLOC_NORMAL
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
ALLOC_NORMAL
);
if
(
IS_ERR
(
fd
))
{
/* dirent failed to write. Delete the inode normally
...
...
@@ -631,7 +631,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
int
namelen
;
union
jffs2_device_node
dev
;
int
devlen
=
0
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
if
(
!
new_valid_dev
(
rdev
))
...
...
@@ -650,7 +650,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
* Just the node will do for now, though
*/
namelen
=
dentry
->
d_name
.
len
;
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
devlen
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
devlen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
...
...
@@ -678,7 +678,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
ri
->
data_crc
=
cpu_to_je32
(
crc32
(
0
,
&
dev
,
devlen
));
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
(
char
*
)
&
dev
,
devlen
,
phys_ofs
,
ALLOC_NORMAL
);
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
(
char
*
)
&
dev
,
devlen
,
ALLOC_NORMAL
);
jffs2_free_raw_inode
(
ri
);
...
...
@@ -708,8 +708,8 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
return
ret
;
}
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
/* Eep. */
jffs2_clear_inode
(
inode
);
...
...
@@ -744,7 +744,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
dentry
->
d_name
.
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
phys_ofs
,
ALLOC_NORMAL
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
dentry
->
d_name
.
name
,
namelen
,
ALLOC_NORMAL
);
if
(
IS_ERR
(
fd
))
{
/* dirent failed to write. Delete the inode normally
...
...
fs/jffs2/erase.c
View file @
4cbb9b80
...
...
@@ -230,6 +230,7 @@ static inline void jffs2_remove_node_refs_from_ino_list(struct jffs2_sb_info *c,
at the end of the linked list. Stash it and continue
from the beginning of the list */
ic
=
(
struct
jffs2_inode_cache
*
)(
*
prev
);
BUG_ON
(
ic
->
class
!=
RAWNODE_CLASS_INODE_CACHE
);
prev
=
&
ic
->
nodes
;
continue
;
}
...
...
@@ -410,10 +411,9 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
/* Everything else got zeroed before the erase */
jeb
->
free_size
=
c
->
sector_size
;
marker_ref
->
next_in_ino
=
NULL
;
marker_ref
->
flash_offset
=
jeb
->
offset
|
REF_NORMAL
;
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
c
->
cleanmarker_size
);
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
c
->
cleanmarker_size
,
NULL
);
}
spin_lock
(
&
c
->
erase_completion_lock
);
...
...
fs/jffs2/file.c
View file @
4cbb9b80
...
...
@@ -134,13 +134,13 @@ static int jffs2_prepare_write (struct file *filp, struct page *pg,
struct
jffs2_sb_info
*
c
=
JFFS2_SB_INFO
(
inode
->
i_sb
);
struct
jffs2_raw_inode
ri
;
struct
jffs2_full_dnode
*
fn
;
uint32_t
phys_ofs
,
alloc_len
;
uint32_t
alloc_len
;
D1
(
printk
(
KERN_DEBUG
"Writing new hole frag 0x%x-0x%x between current EOF and new page
\n
"
,
(
unsigned
int
)
inode
->
i_size
,
pageofs
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
ri
),
&
phys_ofs
,
&
alloc_len
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
ri
),
&
alloc_len
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
return
ret
;
...
...
@@ -166,7 +166,7 @@ static int jffs2_prepare_write (struct file *filp, struct page *pg,
ri
.
node_crc
=
cpu_to_je32
(
crc32
(
0
,
&
ri
,
sizeof
(
ri
)
-
8
));
ri
.
data_crc
=
cpu_to_je32
(
0
);
fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
NULL
,
0
,
phys_ofs
,
ALLOC_NORMAL
);
fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
NULL
,
0
,
ALLOC_NORMAL
);
if
(
IS_ERR
(
fn
))
{
ret
=
PTR_ERR
(
fn
);
...
...
fs/jffs2/fs.c
View file @
4cbb9b80
...
...
@@ -37,7 +37,7 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
unsigned
char
*
mdata
=
NULL
;
int
mdatalen
=
0
;
unsigned
int
ivalid
;
uint32_t
phys_ofs
,
alloclen
;
uint32_t
alloclen
;
int
ret
;
D1
(
printk
(
KERN_DEBUG
"jffs2_setattr(): ino #%lu
\n
"
,
inode
->
i_ino
));
ret
=
inode_change_ok
(
inode
,
iattr
);
...
...
@@ -79,8 +79,8 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
return
-
ENOMEM
;
}
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
mdatalen
,
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
mdatalen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
jffs2_free_raw_inode
(
ri
);
if
(
S_ISLNK
(
inode
->
i_mode
&
S_IFMT
))
...
...
@@ -131,7 +131,7 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
else
ri
->
data_crc
=
cpu_to_je32
(
0
);
new_metadata
=
jffs2_write_dnode
(
c
,
f
,
ri
,
mdata
,
mdatalen
,
phys_ofs
,
ALLOC_NORMAL
);
new_metadata
=
jffs2_write_dnode
(
c
,
f
,
ri
,
mdata
,
mdatalen
,
ALLOC_NORMAL
);
if
(
S_ISLNK
(
inode
->
i_mode
))
kfree
(
mdata
);
...
...
@@ -664,13 +664,6 @@ static int jffs2_flash_setup(struct jffs2_sb_info *c) {
return
ret
;
}
/* add setups for other bizarre flashes here... */
if
(
jffs2_nor_ecc
(
c
))
{
ret
=
jffs2_nor_ecc_flash_setup
(
c
);
if
(
ret
)
return
ret
;
}
/* and Dataflash */
if
(
jffs2_dataflash
(
c
))
{
ret
=
jffs2_dataflash_setup
(
c
);
...
...
@@ -694,11 +687,6 @@ void jffs2_flash_cleanup(struct jffs2_sb_info *c) {
jffs2_nand_flash_cleanup
(
c
);
}
/* add cleanups for other bizarre flashes here... */
if
(
jffs2_nor_ecc
(
c
))
{
jffs2_nor_ecc_flash_cleanup
(
c
);
}
/* and DataFlash */
if
(
jffs2_dataflash
(
c
))
{
jffs2_dataflash_cleanup
(
c
);
...
...
fs/jffs2/gc.c
View file @
4cbb9b80
...
...
@@ -545,7 +545,7 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
if
(
ic
&&
alloclen
>
sizeof
(
struct
jffs2_raw_inode
)
+
JFFS2_MIN_DATA_LEN
)
alloclen
=
sizeof
(
struct
jffs2_raw_inode
)
+
JFFS2_MIN_DATA_LEN
;
ret
=
jffs2_reserve_space_gc
(
c
,
alloclen
,
&
phys_ofs
,
&
alloclen
,
rawlen
);
ret
=
jffs2_reserve_space_gc
(
c
,
alloclen
,
&
alloclen
,
rawlen
);
/* 'rawlen' is not the exact summary size; it is only an upper estimation */
if
(
ret
)
...
...
@@ -626,19 +626,16 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
/* OK, all the CRCs are good; this node can just be copied as-is. */
retry:
nraw
->
flash_offset
=
phys_ofs
;
nraw
->
flash_offset
=
phys_ofs
=
write_ofs
(
c
)
;
ret
=
jffs2_flash_write
(
c
,
phys_ofs
,
rawlen
,
&
retlen
,
(
char
*
)
node
);
if
(
ret
||
(
retlen
!=
rawlen
))
{
printk
(
KERN_NOTICE
"Write of %d bytes at 0x%08x failed. returned %d, retlen %zd
\n
"
,
rawlen
,
phys_ofs
,
ret
,
retlen
);
rawlen
,
nraw
->
flash_offset
,
ret
,
retlen
);
if
(
retlen
)
{
/* Doesn't belong to any inode */
nraw
->
next_in_ino
=
NULL
;
nraw
->
flash_offset
|=
REF_OBSOLETE
;
jffs2_add_physical_node_ref
(
c
,
nraw
,
rawlen
);
jffs2_add_physical_node_ref
(
c
,
nraw
,
rawlen
,
NULL
);
jffs2_mark_node_obsolete
(
c
,
nraw
);
}
else
{
printk
(
KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero
\n
"
,
nraw
->
flash_offset
);
...
...
@@ -656,7 +653,7 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
jffs2_dbg_acct_sanity_check
(
c
,
jeb
);
jffs2_dbg_acct_paranoia_check
(
c
,
jeb
);
ret
=
jffs2_reserve_space_gc
(
c
,
rawlen
,
&
phys_ofs
,
&
dummy
,
rawlen
);
ret
=
jffs2_reserve_space_gc
(
c
,
rawlen
,
&
dummy
,
rawlen
);
/* this is not the exact summary size of it,
it is only an upper estimation */
...
...
@@ -678,18 +675,8 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
goto
out_node
;
}
nraw
->
flash_offset
|=
REF_PRISTINE
;
jffs2_add_physical_node_ref
(
c
,
nraw
,
rawlen
);
jffs2_add_physical_node_ref
(
c
,
nraw
,
rawlen
,
ic
);
if
(
ic
)
{
/* Link into per-inode list. This is safe because of the ic
state being INO_STATE_GC. Note that if we're doing this
for an inode which is in-core, the 'nraw' pointer is then
going to be fetched from ic->nodes by our caller. */
spin_lock
(
&
c
->
erase_completion_lock
);
nraw
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
nraw
;
spin_unlock
(
&
c
->
erase_completion_lock
);
}
jffs2_mark_node_obsolete
(
c
,
raw
);
D1
(
printk
(
KERN_DEBUG
"WHEEE! GC REF_PRISTINE node at 0x%08x succeeded
\n
"
,
ref_offset
(
raw
)));
...
...
@@ -709,7 +696,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_
struct
jffs2_node_frag
*
last_frag
;
union
jffs2_device_node
dev
;
char
*
mdata
=
NULL
,
mdatalen
=
0
;
uint32_t
alloclen
,
phys_ofs
,
ilen
;
uint32_t
alloclen
,
ilen
;
int
ret
;
if
(
S_ISBLK
(
JFFS2_F_I_MODE
(
f
))
||
...
...
@@ -735,7 +722,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_
}
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
)
+
mdatalen
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
)
+
mdatalen
,
&
alloclen
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
printk
(
KERN_WARNING
"jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d
\n
"
,
...
...
@@ -773,7 +760,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_
ri
.
node_crc
=
cpu_to_je32
(
crc32
(
0
,
&
ri
,
sizeof
(
ri
)
-
8
));
ri
.
data_crc
=
cpu_to_je32
(
crc32
(
0
,
mdata
,
mdatalen
));
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
mdata
,
mdatalen
,
phys_ofs
,
ALLOC_GC
);
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
mdata
,
mdatalen
,
ALLOC_GC
);
if
(
IS_ERR
(
new_fn
))
{
printk
(
KERN_WARNING
"Error writing new dnode: %ld
\n
"
,
PTR_ERR
(
new_fn
));
...
...
@@ -794,7 +781,7 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er
{
struct
jffs2_full_dirent
*
new_fd
;
struct
jffs2_raw_dirent
rd
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
rd
.
magic
=
cpu_to_je16
(
JFFS2_MAGIC_BITMASK
);
...
...
@@ -816,14 +803,14 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er
rd
.
node_crc
=
cpu_to_je32
(
crc32
(
0
,
&
rd
,
sizeof
(
rd
)
-
8
));
rd
.
name_crc
=
cpu_to_je32
(
crc32
(
0
,
fd
->
name
,
rd
.
nsize
));
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
rd
)
+
rd
.
nsize
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
rd
)
+
rd
.
nsize
,
&
alloclen
,
JFFS2_SUMMARY_DIRENT_SIZE
(
rd
.
nsize
));
if
(
ret
)
{
printk
(
KERN_WARNING
"jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d
\n
"
,
sizeof
(
rd
)
+
rd
.
nsize
,
ret
);
return
ret
;
}
new_fd
=
jffs2_write_dirent
(
c
,
f
,
&
rd
,
fd
->
name
,
rd
.
nsize
,
phys_ofs
,
ALLOC_GC
);
new_fd
=
jffs2_write_dirent
(
c
,
f
,
&
rd
,
fd
->
name
,
rd
.
nsize
,
ALLOC_GC
);
if
(
IS_ERR
(
new_fd
))
{
printk
(
KERN_WARNING
"jffs2_write_dirent in garbage_collect_dirent failed: %ld
\n
"
,
PTR_ERR
(
new_fd
));
...
...
@@ -951,7 +938,7 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras
struct
jffs2_raw_inode
ri
;
struct
jffs2_node_frag
*
frag
;
struct
jffs2_full_dnode
*
new_fn
;
uint32_t
alloclen
,
phys_ofs
,
ilen
;
uint32_t
alloclen
,
ilen
;
int
ret
;
D1
(
printk
(
KERN_DEBUG
"Writing replacement hole node for ino #%u from offset 0x%x to 0x%x
\n
"
,
...
...
@@ -1030,14 +1017,14 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras
ri
.
data_crc
=
cpu_to_je32
(
0
);
ri
.
node_crc
=
cpu_to_je32
(
crc32
(
0
,
&
ri
,
sizeof
(
ri
)
-
8
));
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
),
&
phys_ofs
,
&
alloclen
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
),
&
alloclen
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
printk
(
KERN_WARNING
"jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d
\n
"
,
sizeof
(
ri
),
ret
);
return
ret
;
}
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
NULL
,
0
,
phys_ofs
,
ALLOC_GC
);
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
NULL
,
0
,
ALLOC_GC
);
if
(
IS_ERR
(
new_fn
))
{
printk
(
KERN_WARNING
"Error writing new hole node: %ld
\n
"
,
PTR_ERR
(
new_fn
));
...
...
@@ -1099,7 +1086,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era
{
struct
jffs2_full_dnode
*
new_fn
;
struct
jffs2_raw_inode
ri
;
uint32_t
alloclen
,
phys_ofs
,
offset
,
orig_end
,
orig_start
;
uint32_t
alloclen
,
offset
,
orig_end
,
orig_start
;
int
ret
=
0
;
unsigned
char
*
comprbuf
=
NULL
,
*
writebuf
;
unsigned
long
pg
;
...
...
@@ -1256,7 +1243,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era
uint32_t
cdatalen
;
uint16_t
comprtype
=
JFFS2_COMPR_NONE
;
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
)
+
JFFS2_MIN_DATA_LEN
,
&
phys_ofs
,
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
ri
)
+
JFFS2_MIN_DATA_LEN
,
&
alloclen
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
...
...
@@ -1293,7 +1280,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era
ri
.
node_crc
=
cpu_to_je32
(
crc32
(
0
,
&
ri
,
sizeof
(
ri
)
-
8
));
ri
.
data_crc
=
cpu_to_je32
(
crc32
(
0
,
comprbuf
,
cdatalen
));
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
comprbuf
,
cdatalen
,
phys_ofs
,
ALLOC_GC
);
new_fn
=
jffs2_write_dnode
(
c
,
f
,
&
ri
,
comprbuf
,
cdatalen
,
ALLOC_GC
);
jffs2_free_comprbuf
(
comprbuf
,
writebuf
);
...
...
fs/jffs2/nodelist.c
View file @
4cbb9b80
...
...
@@ -1048,7 +1048,8 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)
}
void
jffs2_link_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*
jeb
,
struct
jffs2_raw_node_ref
*
ref
,
uint32_t
len
)
struct
jffs2_raw_node_ref
*
ref
,
uint32_t
len
,
struct
jffs2_inode_cache
*
ic
)
{
if
(
!
jeb
->
first_node
)
jeb
->
first_node
=
ref
;
...
...
@@ -1065,6 +1066,13 @@ void jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
}
jeb
->
last_node
=
ref
;
if
(
ic
)
{
ref
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
ref
;
}
else
{
ref
->
next_in_ino
=
NULL
;
}
switch
(
ref_flags
(
ref
))
{
case
REF_UNCHECKED
:
c
->
unchecked_size
+=
len
;
...
...
@@ -1120,12 +1128,11 @@ int jffs2_scan_dirty_space(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
ref
->
flash_offset
=
jeb
->
offset
+
c
->
sector_size
-
jeb
->
free_size
;
ref
->
flash_offset
|=
REF_OBSOLETE
;
ref
->
next_in_ino
=
0
;
#ifdef TEST_TOTLEN
ref
->
__totlen
=
size
;
#endif
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
size
);
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
size
,
NULL
);
}
return
0
;
...
...
fs/jffs2/nodelist.h
View file @
4cbb9b80
...
...
@@ -77,9 +77,9 @@
struct
jffs2_raw_node_ref
{
struct
jffs2_raw_node_ref
*
next_in_ino
;
/* Points to the next raw_node_ref
for this
inode. If this is the last, it points to the inode_cache
for this inode instead. The inode_cache will have NULL in the first
word so you know when you've got there :)
*/
for this
object. If this _is_ the last, it points to the inode_cache,
xattr_ref or xattr_datum instead. The common part of those structures
has NULL in the first word. See jffs2_raw_ref_to_ic() below
*/
struct
jffs2_raw_node_ref
*
next_phys
;
uint32_t
flash_offset
;
#define TEST_TOTLEN
...
...
@@ -88,6 +88,18 @@ struct jffs2_raw_node_ref
#endif
};
static
inline
struct
jffs2_inode_cache
*
jffs2_raw_ref_to_ic
(
struct
jffs2_raw_node_ref
*
raw
)
{
while
(
raw
->
next_in_ino
)
{
raw
=
raw
->
next_in_ino
;
}
/* NB. This can be a jffs2_xattr_datum or jffs2_xattr_ref and
not actually a jffs2_inode_cache. Check ->class */
return
((
struct
jffs2_inode_cache
*
)
raw
);
}
/* flash_offset & 3 always has to be zero, because nodes are
always aligned at 4 bytes. So we have a couple of extra bits
to play with, which indicate the node's status; see below: */
...
...
@@ -113,20 +125,27 @@ struct jffs2_raw_node_ref
a pointer to the first physical node which is part of this inode, too.
*/
struct
jffs2_inode_cache
{
/* First part of structure is shared with other objects which
can terminate the raw node refs' next_in_ino list -- which
currently struct jffs2_xattr_datum and struct jffs2_xattr_ref. */
struct
jffs2_full_dirent
*
scan_dents
;
/* Used during scan to hold
temporary lists of dirents, and later must be set to
NULL to mark the end of the raw_node_ref->next_in_ino
chain. */
u8
class
;
/* It's used for identification */
u8
flags
;
uint16_t
state
;
struct
jffs2_inode_cache
*
next
;
struct
jffs2_raw_node_ref
*
nodes
;
uint8_t
class
;
/* It's used for identification */
/* end of shared structure */
uint8_t
flags
;
uint16_t
state
;
uint32_t
ino
;
int
nlink
;
struct
jffs2_inode_cache
*
next
;
#ifdef CONFIG_JFFS2_FS_XATTR
struct
jffs2_xattr_ref
*
xref
;
#endif
int
nlink
;
};
/* Inode states for 'state' above. We need the 'GC' state to prevent
...
...
@@ -148,6 +167,8 @@ struct jffs2_inode_cache {
#define INOCACHE_HASHSIZE 128
#define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size)
/*
Larger representation of a raw node, kept in-core only when the
struct inode for this particular ino is instantiated.
...
...
@@ -250,15 +271,6 @@ static inline int jffs2_encode_dev(union jffs2_device_node *jdev, dev_t rdev)
}
}
static
inline
struct
jffs2_inode_cache
*
jffs2_raw_ref_to_ic
(
struct
jffs2_raw_node_ref
*
raw
)
{
while
(
raw
->
next_in_ino
)
{
raw
=
raw
->
next_in_ino
;
}
return
((
struct
jffs2_inode_cache
*
)
raw
);
}
static
inline
struct
jffs2_node_frag
*
frag_first
(
struct
rb_root
*
root
)
{
struct
rb_node
*
node
=
root
->
rb_node
;
...
...
@@ -307,32 +319,43 @@ int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_in
void
jffs2_truncate_fragtree
(
struct
jffs2_sb_info
*
c
,
struct
rb_root
*
list
,
uint32_t
size
);
int
jffs2_add_older_frag_to_fragtree
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_tmp_dnode_info
*
tn
);
void
jffs2_link_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*
jeb
,
struct
jffs2_raw_node_ref
*
ref
,
uint32_t
len
);
struct
jffs2_raw_node_ref
*
ref
,
uint32_t
len
,
struct
jffs2_inode_cache
*
ic
);
extern
uint32_t
__jffs2_ref_totlen
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*
jeb
,
struct
jffs2_raw_node_ref
*
ref
);
/* nodemgmt.c */
int
jffs2_thread_should_wake
(
struct
jffs2_sb_info
*
c
);
int
jffs2_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
int
jffs2_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
len
,
int
prio
,
uint32_t
sumsize
);
int
jffs2_reserve_space_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
int
jffs2_reserve_space_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
len
,
uint32_t
sumsize
);
int
jffs2_add_physical_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*
new
,
uint32_t
len
);
int
jffs2_add_physical_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*
new
,
uint32_t
len
,
struct
jffs2_inode_cache
*
ic
);
void
jffs2_complete_reservation
(
struct
jffs2_sb_info
*
c
);
void
jffs2_mark_node_obsolete
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*
raw
);
/* write.c */
int
jffs2_do_new_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
uint32_t
mode
,
struct
jffs2_raw_inode
*
ri
);
struct
jffs2_full_dnode
*
jffs2_write_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
unsigned
char
*
data
,
uint32_t
datalen
,
uint32_t
flash_ofs
,
int
alloc_mode
);
struct
jffs2_full_dirent
*
jffs2_write_dirent
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_dirent
*
rd
,
const
unsigned
char
*
name
,
uint32_t
namelen
,
uint32_t
flash_ofs
,
int
alloc_mode
);
struct
jffs2_full_dnode
*
jffs2_write_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
unsigned
char
*
data
,
uint32_t
datalen
,
int
alloc_mode
);
struct
jffs2_full_dirent
*
jffs2_write_dirent
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_dirent
*
rd
,
const
unsigned
char
*
name
,
uint32_t
namelen
,
int
alloc_mode
);
int
jffs2_write_inode_range
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
unsigned
char
*
buf
,
uint32_t
offset
,
uint32_t
writelen
,
uint32_t
*
retlen
);
int
jffs2_do_create
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
char
*
name
,
int
namelen
);
int
jffs2_do_unlink
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
const
char
*
name
,
int
namelen
,
struct
jffs2_inode_info
*
dead_f
,
uint32_t
time
);
int
jffs2_do_link
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
uint32_t
ino
,
uint8_t
type
,
const
char
*
name
,
int
namelen
,
uint32_t
time
);
int
jffs2_do_create
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
char
*
name
,
int
namelen
);
int
jffs2_do_unlink
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
const
char
*
name
,
int
namelen
,
struct
jffs2_inode_info
*
dead_f
,
uint32_t
time
);
int
jffs2_do_link
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
dir_f
,
uint32_t
ino
,
uint8_t
type
,
const
char
*
name
,
int
namelen
,
uint32_t
time
);
/* readinode.c */
...
...
fs/jffs2/nodemgmt.c
View file @
4cbb9b80
...
...
@@ -23,13 +23,12 @@
* jffs2_reserve_space - request physical space to write nodes to flash
* @c: superblock info
* @minsize: Minimum acceptable size of allocation
* @ofs: Returned value of node offset
* @len: Returned value of allocation length
* @prio: Allocation type - ALLOC_{NORMAL,DELETION}
*
* Requests a block of physical space on the flash. Returns zero for success
* and puts '
ofs' and 'len' into the appriopriate place, or returns -ENOSPC
*
or other error if appropriate.
* and puts '
len' into the appropriate place, or returns -ENOSPC or other
*
error if appropriate. Doesn't return len since that's
*
* If it returns zero, jffs2_reserve_space() also downs the per-filesystem
* allocation semaphore, to prevent more than one allocation from being
...
...
@@ -40,9 +39,9 @@
*/
static
int
jffs2_do_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
uint32_t
*
len
,
uint32_t
sumsize
);
uint32_t
*
len
,
uint32_t
sumsize
);
int
jffs2_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
int
jffs2_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
len
,
int
prio
,
uint32_t
sumsize
)
{
int
ret
=
-
EAGAIN
;
...
...
@@ -132,7 +131,7 @@ int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs
spin_lock
(
&
c
->
erase_completion_lock
);
}
ret
=
jffs2_do_reserve_space
(
c
,
minsize
,
ofs
,
len
,
sumsize
);
ret
=
jffs2_do_reserve_space
(
c
,
minsize
,
len
,
sumsize
);
if
(
ret
)
{
D1
(
printk
(
KERN_DEBUG
"jffs2_reserve_space: ret is %d
\n
"
,
ret
));
}
...
...
@@ -143,8 +142,8 @@ int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs
return
ret
;
}
int
jffs2_reserve_space_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
uint32_t
*
len
,
uint32_t
sumsize
)
int
jffs2_reserve_space_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
len
,
uint32_t
sumsize
)
{
int
ret
=
-
EAGAIN
;
minsize
=
PAD
(
minsize
);
...
...
@@ -153,7 +152,7 @@ int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *
spin_lock
(
&
c
->
erase_completion_lock
);
while
(
ret
==
-
EAGAIN
)
{
ret
=
jffs2_do_reserve_space
(
c
,
minsize
,
ofs
,
len
,
sumsize
);
ret
=
jffs2_do_reserve_space
(
c
,
minsize
,
len
,
sumsize
);
if
(
ret
)
{
D1
(
printk
(
KERN_DEBUG
"jffs2_reserve_space_gc: looping, ret is %d
\n
"
,
ret
));
}
...
...
@@ -259,10 +258,11 @@ static int jffs2_find_nextblock(struct jffs2_sb_info *c)
}
/* Called with alloc sem _and_ erase_completion_lock */
static
int
jffs2_do_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
ofs
,
uint32_t
*
len
,
uint32_t
sumsize
)
static
int
jffs2_do_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
uint32_t
*
len
,
uint32_t
sumsize
)
{
struct
jffs2_eraseblock
*
jeb
=
c
->
nextblock
;
uint32_t
reserved_size
;
/* for summary information at the end of the jeb */
uint32_t
reserved_size
;
/* for summary information at the end of the jeb */
int
ret
;
restart:
...
...
@@ -349,7 +349,6 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin
}
/* OK, jeb (==c->nextblock) is now pointing at a block which definitely has
enough space */
*
ofs
=
jeb
->
offset
+
(
c
->
sector_size
-
jeb
->
free_size
);
*
len
=
jeb
->
free_size
-
reserved_size
;
if
(
c
->
cleanmarker_size
&&
jeb
->
used_size
==
c
->
cleanmarker_size
&&
...
...
@@ -365,7 +364,8 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin
spin_lock
(
&
c
->
erase_completion_lock
);
}
D1
(
printk
(
KERN_DEBUG
"jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x
\n
"
,
*
len
,
*
ofs
));
D1
(
printk
(
KERN_DEBUG
"jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x
\n
"
,
*
len
,
jeb
->
offset
+
(
c
->
sector_size
-
jeb
->
free_size
)));
return
0
;
}
...
...
@@ -381,7 +381,8 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin
* Must be called with the alloc_sem held.
*/
int
jffs2_add_physical_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*
new
,
uint32_t
len
)
int
jffs2_add_physical_node_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*
new
,
uint32_t
len
,
struct
jffs2_inode_cache
*
ic
)
{
struct
jffs2_eraseblock
*
jeb
;
...
...
@@ -403,7 +404,7 @@ int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_r
#endif
spin_lock
(
&
c
->
erase_completion_lock
);
jffs2_link_node_ref
(
c
,
jeb
,
new
,
len
);
jffs2_link_node_ref
(
c
,
jeb
,
new
,
len
,
ic
);
if
(
!
jeb
->
free_size
&&
!
jeb
->
dirty_size
&&
!
ISDIRTY
(
jeb
->
wasted_size
))
{
/* If it lives on the dirty_list, jffs2_reserve_space will put it there */
...
...
@@ -660,6 +661,10 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
spin_lock
(
&
c
->
erase_completion_lock
);
ic
=
jffs2_raw_ref_to_ic
(
ref
);
/* It seems we should never call jffs2_mark_node_obsolete() for
XATTR nodes.... yet. Make sure we notice if/when we change
that :) */
BUG_ON
(
ic
->
class
!=
RAWNODE_CLASS_INODE_CACHE
);
for
(
p
=
&
ic
->
nodes
;
(
*
p
)
!=
ref
;
p
=
&
((
*
p
)
->
next_in_ino
))
;
...
...
fs/jffs2/os-linux.h
View file @
4cbb9b80
...
...
@@ -92,11 +92,7 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f)
#define jffs2_flash_writev(a,b,c,d,e,f) jffs2_flash_direct_writev(a,b,c,d,e)
#define jffs2_wbuf_timeout NULL
#define jffs2_wbuf_process NULL
#define jffs2_nor_ecc(c) (0)
#define jffs2_dataflash(c) (0)
#define jffs2_nor_wbuf_flash(c) (0)
#define jffs2_nor_ecc_flash_setup(c) (0)
#define jffs2_nor_ecc_flash_cleanup(c) do {} while (0)
#define jffs2_dataflash_setup(c) (0)
#define jffs2_dataflash_cleanup(c) do {} while (0)
#define jffs2_nor_wbuf_flash_setup(c) (0)
...
...
@@ -109,9 +105,7 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f)
#ifdef CONFIG_JFFS2_SUMMARY
#define jffs2_can_mark_obsolete(c) (0)
#else
#define jffs2_can_mark_obsolete(c) \
((c->mtd->type == MTD_NORFLASH && !(c->mtd->flags & (MTD_ECC|MTD_PROGRAM_REGIONS))) || \
c->mtd->type == MTD_RAM)
#define jffs2_can_mark_obsolete(c) (c->mtd->flags & (MTD_BIT_WRITEABLE))
#endif
#define jffs2_cleanmarker_oob(c) (c->mtd->type == MTD_NANDFLASH)
...
...
@@ -135,15 +129,11 @@ int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c);
int
jffs2_nand_flash_setup
(
struct
jffs2_sb_info
*
c
);
void
jffs2_nand_flash_cleanup
(
struct
jffs2_sb_info
*
c
);
#define jffs2_nor_ecc(c) (c->mtd->type == MTD_NORFLASH && (c->mtd->flags & MTD_ECC))
int
jffs2_nor_ecc_flash_setup
(
struct
jffs2_sb_info
*
c
);
void
jffs2_nor_ecc_flash_cleanup
(
struct
jffs2_sb_info
*
c
);
#define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH)
int
jffs2_dataflash_setup
(
struct
jffs2_sb_info
*
c
);
void
jffs2_dataflash_cleanup
(
struct
jffs2_sb_info
*
c
);
#define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH &&
(c->mtd->flags & MTD_PROGRAM_REGIONS
))
#define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH &&
! (c->mtd->flags & MTD_BIT_WRITEABLE
))
int
jffs2_nor_wbuf_flash_setup
(
struct
jffs2_sb_info
*
c
);
void
jffs2_nor_wbuf_flash_cleanup
(
struct
jffs2_sb_info
*
c
);
...
...
fs/jffs2/scan.c
View file @
4cbb9b80
...
...
@@ -361,9 +361,9 @@ static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
xd
->
node
=
raw
;
raw
->
flash_offset
=
ofs
|
REF_PRISTINE
;
raw
->
next_in_ino
=
(
void
*
)
xd
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
totlen
);
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
totlen
,
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
xd
;
if
(
jffs2_sum_active
())
jffs2_sum_add_xattr_mem
(
s
,
rx
,
ofs
-
jeb
->
offset
);
...
...
@@ -425,9 +425,9 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
c
->
xref_temp
=
ref
;
raw
->
flash_offset
=
ofs
|
REF_PRISTINE
;
raw
->
next_in_ino
=
(
void
*
)
ref
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
rr
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
rr
->
totlen
)),
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
ref
;
if
(
jffs2_sum_active
())
jffs2_sum_add_xref_mem
(
s
,
rr
,
ofs
-
jeb
->
offset
);
...
...
@@ -844,10 +844,9 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
printk
(
KERN_NOTICE
"Failed to allocate node ref for clean marker
\n
"
);
return
-
ENOMEM
;
}
marker_ref
->
next_in_ino
=
NULL
;
marker_ref
->
flash_offset
=
ofs
|
REF_NORMAL
;
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
c
->
cleanmarker_size
);
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
c
->
cleanmarker_size
,
NULL
);
ofs
+=
PAD
(
c
->
cleanmarker_size
);
}
...
...
@@ -892,8 +891,7 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
if
(
!
ref
)
return
-
ENOMEM
;
ref
->
flash_offset
=
ofs
|
REF_PRISTINE
;
ref
->
next_in_ino
=
0
;
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
PAD
(
je32_to_cpu
(
node
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
PAD
(
je32_to_cpu
(
node
->
totlen
)),
NULL
);
/* We can't summarise nodes we don't grok */
jffs2_sum_disable_collecting
(
s
);
...
...
@@ -1004,10 +1002,7 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
raw
->
flash_offset
=
ofs
|
REF_UNCHECKED
;
raw
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
raw
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
ri
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
ri
->
totlen
)),
ic
);
D1
(
printk
(
KERN_DEBUG
"Node is ino #%u, version %d. Range 0x%x-0x%x
\n
"
,
je32_to_cpu
(
ri
->
ino
),
je32_to_cpu
(
ri
->
version
),
...
...
@@ -1082,10 +1077,7 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
}
raw
->
flash_offset
=
ofs
|
REF_PRISTINE
;
raw
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
raw
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
rd
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
rd
->
totlen
)),
ic
);
fd
->
raw
=
raw
;
fd
->
next
=
NULL
;
...
...
fs/jffs2/summary.c
View file @
4cbb9b80
...
...
@@ -430,10 +430,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
raw
->
flash_offset
|=
REF_UNCHECKED
;
raw
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
raw
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spi
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spi
->
totlen
)),
ic
);
*
pseudo_random
+=
je32_to_cpu
(
spi
->
version
);
...
...
@@ -473,10 +470,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
}
raw
->
flash_offset
|=
REF_PRISTINE
;
raw
->
next_in_ino
=
ic
->
nodes
;
ic
->
nodes
=
raw
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spd
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spd
->
totlen
)),
ic
);
fd
->
raw
=
raw
;
fd
->
next
=
NULL
;
...
...
@@ -525,9 +519,9 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
xd
->
node
=
raw
;
raw
->
flash_offset
|=
REF_UNCHECKED
;
raw
->
next_in_ino
=
(
void
*
)
xd
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spx
->
totlen
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
je32_to_cpu
(
spx
->
totlen
)),
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
xd
;
*
pseudo_random
+=
je32_to_cpu
(
spx
->
xid
);
sp
+=
JFFS2_SUMMARY_XATTR_SIZE
;
...
...
@@ -561,9 +555,9 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
c
->
xref_temp
=
ref
;
raw
->
flash_offset
|=
REF_UNCHECKED
;
raw
->
next_in_ino
=
(
void
*
)
ref
;
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
sizeof
(
struct
jffs2_raw_xref
)));
jffs2_link_node_ref
(
c
,
jeb
,
raw
,
PAD
(
sizeof
(
struct
jffs2_raw_xref
)),
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
ref
;
*
pseudo_random
+=
raw
->
flash_offset
;
sp
+=
JFFS2_SUMMARY_XREF_SIZE
;
...
...
@@ -664,9 +658,8 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
}
marker_ref
->
flash_offset
=
jeb
->
offset
|
REF_NORMAL
;
marker_ref
->
next_in_ino
=
NULL
;
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
je32_to_cpu
(
summary
->
cln_mkr
));
jffs2_link_node_ref
(
c
,
jeb
,
marker_ref
,
je32_to_cpu
(
summary
->
cln_mkr
)
,
NULL
);
}
}
...
...
@@ -686,10 +679,9 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
return
-
ENOMEM
;
}
cache_ref
->
next_in_ino
=
NULL
;
cache_ref
->
flash_offset
|=
REF_NORMAL
;
jffs2_link_node_ref
(
c
,
jeb
,
cache_ref
,
sumsize
);
jffs2_link_node_ref
(
c
,
jeb
,
cache_ref
,
sumsize
,
NULL
);
if
(
unlikely
(
jeb
->
free_size
))
{
JFFS2_WARNING
(
"Free size 0x%x bytes in eraseblock @0x%08x with summary?
\n
"
,
...
...
@@ -849,9 +841,8 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock
ref
->
flash_offset
=
jeb
->
offset
+
c
->
sector_size
-
jeb
->
free_size
;
ref
->
flash_offset
|=
REF_OBSOLETE
;
ref
->
next_in_ino
=
0
;
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
c
->
sector_size
-
jeb
->
free_size
);
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
c
->
sector_size
-
jeb
->
free_size
,
NULL
);
}
c
->
summary
->
sum_size
=
JFFS2_SUMMARY_NOSUM_SIZE
;
...
...
@@ -909,11 +900,10 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
return
-
ENOMEM
;
}
summary_ref
->
next_in_ino
=
NULL
;
summary_ref
->
flash_offset
=
(
jeb
->
offset
+
c
->
sector_size
-
jeb
->
free_size
)
|
REF_NORMAL
;
spin_lock
(
&
c
->
erase_completion_lock
);
jffs2_link_node_ref
(
c
,
jeb
,
summary_ref
,
infosize
);
jffs2_link_node_ref
(
c
,
jeb
,
summary_ref
,
infosize
,
NULL
);
return
0
;
}
fs/jffs2/wbuf.c
View file @
4cbb9b80
...
...
@@ -265,12 +265,14 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
/* ... and get an allocation of space from a shiny new block instead */
ret
=
jffs2_reserve_space_gc
(
c
,
end
-
start
,
&
ofs
,
&
len
,
JFFS2_SUMMARY_NOSUM_SIZE
);
ret
=
jffs2_reserve_space_gc
(
c
,
end
-
start
,
&
len
,
JFFS2_SUMMARY_NOSUM_SIZE
);
if
(
ret
)
{
printk
(
KERN_WARNING
"Failed to allocate space for wbuf recovery. Data loss ensues.
\n
"
);
kfree
(
buf
);
return
;
}
ofs
=
write_ofs
(
c
);
if
(
end
-
start
>=
c
->
wbuf_pagesize
)
{
/* Need to do another write immediately, but it's possible
that this is just because the wbuf itself is completely
...
...
@@ -312,9 +314,8 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
return
;
raw2
->
flash_offset
=
ofs
|
REF_OBSOLETE
;
raw2
->
next_in_ino
=
NULL
;
jffs2_add_physical_node_ref
(
c
,
raw2
,
ref_totlen
(
c
,
jeb
,
*
first_raw
));
jffs2_add_physical_node_ref
(
c
,
raw2
,
ref_totlen
(
c
,
jeb
,
*
first_raw
)
,
NULL
);
}
return
;
}
...
...
@@ -507,11 +508,10 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
return
-
ENOMEM
;
ref
->
flash_offset
=
c
->
wbuf_ofs
+
c
->
wbuf_len
;
ref
->
flash_offset
|=
REF_OBSOLETE
;
ref
->
next_in_ino
=
NULL
;
spin_lock
(
&
c
->
erase_completion_lock
);
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
waste
);
jffs2_link_node_ref
(
c
,
jeb
,
ref
,
waste
,
NULL
);
/* FIXME: that made it count as dirty. Convert to wasted */
jeb
->
dirty_size
-=
waste
;
c
->
dirty_size
-=
waste
;
...
...
@@ -649,19 +649,6 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs,
memset
(
c
->
wbuf
,
0xff
,
c
->
wbuf_pagesize
);
}
/*
* Fixup the wbuf if we are moving to a new eraseblock. The
* checks below fail for ECC'd NOR because cleanmarker == 16,
* so a block starts at xxx0010.
*/
if
(
jffs2_nor_ecc
(
c
))
{
if
(((
c
->
wbuf_ofs
%
c
->
sector_size
)
==
0
)
&&
!
c
->
wbuf_len
)
{
c
->
wbuf_ofs
=
PAGE_DIV
(
to
);
c
->
wbuf_len
=
PAGE_MOD
(
to
);
memset
(
c
->
wbuf
,
0xff
,
c
->
wbuf_pagesize
);
}
}
/*
* Sanity checks on target address. It's permitted to write
* at PAD(c->wbuf_len+c->wbuf_ofs), and it's permitted to
...
...
@@ -1107,7 +1094,7 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
/* Initialise write buffer */
init_rwsem
(
&
c
->
wbuf_sem
);
c
->
wbuf_pagesize
=
c
->
mtd
->
oobblock
;
c
->
wbuf_pagesize
=
c
->
mtd
->
writesize
;
c
->
wbuf_ofs
=
0xFFFFFFFF
;
c
->
wbuf
=
kmalloc
(
c
->
wbuf_pagesize
,
GFP_KERNEL
);
...
...
@@ -1178,33 +1165,14 @@ void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) {
kfree
(
c
->
wbuf
);
}
int
jffs2_nor_ecc_flash_setup
(
struct
jffs2_sb_info
*
c
)
{
/* Cleanmarker is actually larger on the flashes */
c
->
cleanmarker_size
=
16
;
/* Initialize write buffer */
init_rwsem
(
&
c
->
wbuf_sem
);
c
->
wbuf_pagesize
=
c
->
mtd
->
eccsize
;
c
->
wbuf_ofs
=
0xFFFFFFFF
;
c
->
wbuf
=
kmalloc
(
c
->
wbuf_pagesize
,
GFP_KERNEL
);
if
(
!
c
->
wbuf
)
return
-
ENOMEM
;
return
0
;
}
void
jffs2_nor_ecc_flash_cleanup
(
struct
jffs2_sb_info
*
c
)
{
kfree
(
c
->
wbuf
);
}
int
jffs2_nor_wbuf_flash_setup
(
struct
jffs2_sb_info
*
c
)
{
/* Cleanmarker currently occupies a whole programming region */
c
->
cleanmarker_size
=
MTD_PROGREGION_SIZE
(
c
->
mtd
);
/* Cleanmarker currently occupies whole programming regions,
* either one or 2 for 8Byte STMicro flashes. */
c
->
cleanmarker_size
=
max
(
16u
,
c
->
mtd
->
writesize
);
/* Initialize write buffer */
init_rwsem
(
&
c
->
wbuf_sem
);
c
->
wbuf_pagesize
=
MTD_PROGREGION_SIZE
(
c
->
mtd
)
;
c
->
wbuf_pagesize
=
c
->
mtd
->
writesize
;
c
->
wbuf_ofs
=
0xFFFFFFFF
;
c
->
wbuf
=
kmalloc
(
c
->
wbuf_pagesize
,
GFP_KERNEL
);
...
...
fs/jffs2/write.c
View file @
4cbb9b80
...
...
@@ -56,12 +56,15 @@ int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint
/* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
write it to the flash, link it into the existing inode/fragment list */
struct
jffs2_full_dnode
*
jffs2_write_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
unsigned
char
*
data
,
uint32_t
datalen
,
uint32_t
flash_ofs
,
int
alloc_mode
)
struct
jffs2_full_dnode
*
jffs2_write_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_inode
*
ri
,
const
unsigned
char
*
data
,
uint32_t
datalen
,
int
alloc_mode
)
{
struct
jffs2_raw_node_ref
*
raw
;
struct
jffs2_full_dnode
*
fn
;
size_t
retlen
;
uint32_t
flash_ofs
;
struct
kvec
vecs
[
2
];
int
ret
;
int
retried
=
0
;
...
...
@@ -77,8 +80,6 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
vecs
[
1
].
iov_base
=
(
unsigned
char
*
)
data
;
vecs
[
1
].
iov_len
=
datalen
;
jffs2_dbg_prewrite_paranoia_check
(
c
,
flash_ofs
,
vecs
[
0
].
iov_len
+
vecs
[
1
].
iov_len
);
if
(
je32_to_cpu
(
ri
->
totlen
)
!=
sizeof
(
*
ri
)
+
datalen
)
{
printk
(
KERN_WARNING
"jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08zx) + datalen (0x%08x)
\n
"
,
je32_to_cpu
(
ri
->
totlen
),
sizeof
(
*
ri
),
datalen
);
}
...
...
@@ -102,7 +103,9 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
retry:
fn
->
raw
=
raw
;
raw
->
flash_offset
=
flash_ofs
;
raw
->
flash_offset
=
flash_ofs
=
write_ofs
(
c
);
jffs2_dbg_prewrite_paranoia_check
(
c
,
flash_ofs
,
vecs
[
0
].
iov_len
+
vecs
[
1
].
iov_len
);
if
((
alloc_mode
!=
ALLOC_GC
)
&&
(
je32_to_cpu
(
ri
->
version
)
<
f
->
highest_version
))
{
BUG_ON
(
!
retried
);
...
...
@@ -122,16 +125,13 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
/* Mark the space as dirtied */
if
(
retlen
)
{
/* Doesn't belong to any inode */
raw
->
next_in_ino
=
NULL
;
/* Don't change raw->size to match retlen. We may have
written the node header already, and only the data will
seem corrupted, in which case the scan would skip over
any node we write before the original intended end of
this node */
raw
->
flash_offset
|=
REF_OBSOLETE
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
ri
)
+
datalen
));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
ri
)
+
datalen
)
,
NULL
);
jffs2_mark_node_obsolete
(
c
,
raw
);
}
else
{
printk
(
KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero
\n
"
,
raw
->
flash_offset
);
...
...
@@ -150,19 +150,20 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
jffs2_dbg_acct_paranoia_check
(
c
,
jeb
);
if
(
alloc_mode
==
ALLOC_GC
)
{
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
*
ri
)
+
datalen
,
&
flash_ofs
,
&
dummy
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
*
ri
)
+
datalen
,
&
dummy
,
JFFS2_SUMMARY_INODE_SIZE
);
}
else
{
/* Locking pain */
up
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
datalen
,
&
flash_ofs
,
&
dummy
,
alloc_mode
,
JFFS2_SUMMARY_INODE_SIZE
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
datalen
,
&
dummy
,
alloc_mode
,
JFFS2_SUMMARY_INODE_SIZE
);
down
(
&
f
->
sem
);
}
if
(
!
ret
)
{
flash_ofs
=
write_ofs
(
c
);
D1
(
printk
(
KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.
\n
"
,
flash_ofs
));
jffs2_dbg_acct_sanity_check
(
c
,
jeb
);
...
...
@@ -189,13 +190,7 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
}
else
{
raw
->
flash_offset
|=
REF_NORMAL
;
}
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
ri
)
+
datalen
));
/* Link into per-inode list */
spin_lock
(
&
c
->
erase_completion_lock
);
raw
->
next_in_ino
=
f
->
inocache
->
nodes
;
f
->
inocache
->
nodes
=
raw
;
spin_unlock
(
&
c
->
erase_completion_lock
);
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
ri
)
+
datalen
),
f
->
inocache
);
D1
(
printk
(
KERN_DEBUG
"jffs2_write_dnode wrote node at 0x%08x(%d) with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x
\n
"
,
flash_ofs
,
ref_flags
(
raw
),
je32_to_cpu
(
ri
->
dsize
),
...
...
@@ -209,12 +204,15 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2
return
fn
;
}
struct
jffs2_full_dirent
*
jffs2_write_dirent
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_dirent
*
rd
,
const
unsigned
char
*
name
,
uint32_t
namelen
,
uint32_t
flash_ofs
,
int
alloc_mode
)
struct
jffs2_full_dirent
*
jffs2_write_dirent
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_raw_dirent
*
rd
,
const
unsigned
char
*
name
,
uint32_t
namelen
,
int
alloc_mode
)
{
struct
jffs2_raw_node_ref
*
raw
;
struct
jffs2_full_dirent
*
fd
;
size_t
retlen
;
struct
kvec
vecs
[
2
];
uint32_t
flash_ofs
=
write_ofs
(
c
);
int
retried
=
0
;
int
ret
;
...
...
@@ -275,9 +273,8 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff
sizeof
(
*
rd
)
+
namelen
,
flash_ofs
,
ret
,
retlen
);
/* Mark the space as dirtied */
if
(
retlen
)
{
raw
->
next_in_ino
=
NULL
;
raw
->
flash_offset
|=
REF_OBSOLETE
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
rd
)
+
namelen
));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
rd
)
+
namelen
)
,
NULL
);
jffs2_mark_node_obsolete
(
c
,
raw
);
}
else
{
printk
(
KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero
\n
"
,
raw
->
flash_offset
);
...
...
@@ -296,19 +293,20 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff
jffs2_dbg_acct_paranoia_check
(
c
,
jeb
);
if
(
alloc_mode
==
ALLOC_GC
)
{
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
flash_ofs
,
&
dummy
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
ret
=
jffs2_reserve_space_gc
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
dummy
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
}
else
{
/* Locking pain */
up
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
flash_ofs
,
&
dummy
,
alloc_mode
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
dummy
,
alloc_mode
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
down
(
&
f
->
sem
);
}
if
(
!
ret
)
{
flash_ofs
=
write_ofs
(
c
);
D1
(
printk
(
KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.
\n
"
,
flash_ofs
));
jffs2_dbg_acct_sanity_check
(
c
,
jeb
);
jffs2_dbg_acct_paranoia_check
(
c
,
jeb
);
...
...
@@ -323,12 +321,7 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff
}
/* Mark the space used */
raw
->
flash_offset
|=
REF_PRISTINE
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
rd
)
+
namelen
));
spin_lock
(
&
c
->
erase_completion_lock
);
raw
->
next_in_ino
=
f
->
inocache
->
nodes
;
f
->
inocache
->
nodes
=
raw
;
spin_unlock
(
&
c
->
erase_completion_lock
);
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
*
rd
)
+
namelen
),
f
->
inocache
);
if
(
retried
)
{
jffs2_dbg_acct_sanity_check
(
c
,
NULL
);
...
...
@@ -354,14 +347,14 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
struct
jffs2_full_dnode
*
fn
;
unsigned
char
*
comprbuf
=
NULL
;
uint16_t
comprtype
=
JFFS2_COMPR_NONE
;
uint32_t
phys_ofs
,
alloclen
;
uint32_t
alloclen
;
uint32_t
datalen
,
cdatalen
;
int
retried
=
0
;
retry:
D2
(
printk
(
KERN_DEBUG
"jffs2_commit_write() loop: 0x%x to write to 0x%x
\n
"
,
writelen
,
offset
));
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
JFFS2_MIN_DATA_LEN
,
&
phys_ofs
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
JFFS2_MIN_DATA_LEN
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
D1
(
printk
(
KERN_DEBUG
"jffs2_reserve_space returned %d
\n
"
,
ret
));
...
...
@@ -389,7 +382,7 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
ri
->
data_crc
=
cpu_to_je32
(
crc32
(
0
,
comprbuf
,
cdatalen
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
comprbuf
,
cdatalen
,
phys_ofs
,
ALLOC_NORETRY
);
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
comprbuf
,
cdatalen
,
ALLOC_NORETRY
);
jffs2_free_comprbuf
(
comprbuf
,
buf
);
...
...
@@ -443,13 +436,13 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str
struct
jffs2_raw_dirent
*
rd
;
struct
jffs2_full_dnode
*
fn
;
struct
jffs2_full_dirent
*
fd
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
/* Try to reserve enough space for both node and dirent.
* Just the node will do for now, though
*/
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
),
&
phys_ofs
,
&
alloclen
,
ALLOC_NORMAL
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
),
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
D1
(
printk
(
KERN_DEBUG
"jffs2_do_create(): reserved 0x%x bytes
\n
"
,
alloclen
));
if
(
ret
)
{
...
...
@@ -460,7 +453,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str
ri
->
data_crc
=
cpu_to_je32
(
0
);
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
NULL
,
0
,
phys_ofs
,
ALLOC_NORMAL
);
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
NULL
,
0
,
ALLOC_NORMAL
);
D1
(
printk
(
KERN_DEBUG
"jffs2_do_create created file with mode 0x%x
\n
"
,
jemode_to_cpu
(
ri
->
mode
)));
...
...
@@ -479,7 +472,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str
up
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
...
...
@@ -511,7 +504,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
phys_ofs
,
ALLOC_NORMAL
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
ALLOC_NORMAL
);
jffs2_free_raw_dirent
(
rd
);
...
...
@@ -540,7 +533,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
{
struct
jffs2_raw_dirent
*
rd
;
struct
jffs2_full_dirent
*
fd
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
if
(
1
/* alternative branch needs testing */
||
...
...
@@ -551,7 +544,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
if
(
!
rd
)
return
-
ENOMEM
;
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_DELETION
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
jffs2_free_raw_dirent
(
rd
);
...
...
@@ -575,7 +568,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
phys_ofs
,
ALLOC_DELETION
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
ALLOC_DELETION
);
jffs2_free_raw_dirent
(
rd
);
...
...
@@ -654,14 +647,14 @@ int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint
{
struct
jffs2_raw_dirent
*
rd
;
struct
jffs2_full_dirent
*
fd
;
uint32_t
alloclen
,
phys_ofs
;
uint32_t
alloclen
;
int
ret
;
rd
=
jffs2_alloc_raw_dirent
();
if
(
!
rd
)
return
-
ENOMEM
;
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
phys_ofs
,
&
alloclen
,
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
{
jffs2_free_raw_dirent
(
rd
);
...
...
@@ -687,7 +680,7 @@ int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
phys_ofs
,
ALLOC_NORMAL
);
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
name
,
namelen
,
ALLOC_NORMAL
);
jffs2_free_raw_dirent
(
rd
);
...
...
fs/jffs2/xattr.c
View file @
4cbb9b80
...
...
@@ -49,9 +49,9 @@
* is used to be as a wrapper of do_verify_xattr_datum() and do_load_xattr_datum().
* If xd need to call do_verify_xattr_datum() at first, it's called before calling
* do_load_xattr_datum(). The meanings of return value is same as do_verify_xattr_datum().
* save_xattr_datum(c, xd
, phys_ofs
)
* save_xattr_datum(c, xd)
* is used to write xdatum to medium. xd->version will be incremented.
* create_xattr_datum(c, xprefix, xname, xvalue, xsize
, phys_ofs
)
* create_xattr_datum(c, xprefix, xname, xvalue, xsize)
* is used to create new xdatum and write to medium.
* -------------------------------------------------- */
...
...
@@ -301,7 +301,7 @@ static int load_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
return
rc
;
}
static
int
save_xattr_datum
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_datum
*
xd
,
uint32_t
phys_ofs
)
static
int
save_xattr_datum
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_datum
*
xd
)
{
/* must be called under down_write(xattr_sem) */
struct
jffs2_raw_xattr
rx
;
...
...
@@ -309,6 +309,7 @@ static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
struct
kvec
vecs
[
2
];
uint32_t
length
;
int
rc
,
totlen
;
uint32_t
phys_ofs
=
write_ofs
(
c
);
BUG_ON
(
!
xd
->
xname
);
...
...
@@ -322,7 +323,6 @@ static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
if
(
!
raw
)
return
-
ENOMEM
;
raw
->
flash_offset
=
phys_ofs
;
raw
->
next_in_ino
=
(
void
*
)
xd
;
/* Setup raw-xattr */
rx
.
magic
=
cpu_to_je16
(
JFFS2_MAGIC_BITMASK
);
...
...
@@ -345,8 +345,7 @@ static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
rc
=
rc
?
rc
:
-
EIO
;
if
(
length
)
{
raw
->
flash_offset
|=
REF_OBSOLETE
;
raw
->
next_in_ino
=
NULL
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
totlen
));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
totlen
),
NULL
);
jffs2_mark_node_obsolete
(
c
,
raw
);
}
else
{
jffs2_free_raw_node_ref
(
raw
);
...
...
@@ -356,7 +355,9 @@ static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
/* success */
raw
->
flash_offset
|=
REF_PRISTINE
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
totlen
));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
totlen
),
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
xd
;
if
(
xd
->
node
)
delete_xattr_datum_node
(
c
,
xd
);
xd
->
node
=
raw
;
...
...
@@ -369,8 +370,7 @@ static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *x
static
struct
jffs2_xattr_datum
*
create_xattr_datum
(
struct
jffs2_sb_info
*
c
,
int
xprefix
,
const
char
*
xname
,
const
char
*
xvalue
,
int
xsize
,
uint32_t
phys_ofs
)
const
char
*
xvalue
,
int
xsize
)
{
/* must be called under down_write(xattr_sem) */
struct
jffs2_xattr_datum
*
xd
;
...
...
@@ -419,7 +419,7 @@ static struct jffs2_xattr_datum *create_xattr_datum(struct jffs2_sb_info *c,
xd
->
value_len
=
xsize
;
xd
->
data_crc
=
crc32
(
0
,
data
,
xd
->
name_len
+
1
+
xd
->
value_len
);
rc
=
save_xattr_datum
(
c
,
xd
,
phys_ofs
);
rc
=
save_xattr_datum
(
c
,
xd
);
if
(
rc
)
{
kfree
(
xd
->
xname
);
jffs2_free_xattr_datum
(
xd
);
...
...
@@ -446,9 +446,9 @@ static struct jffs2_xattr_datum *create_xattr_datum(struct jffs2_sb_info *c,
* delete_xattr_ref(c, ref)
* is used to delete jffs2_xattr_ref object. If the reference counter of xdatum
* is refered by this xref become 0, delete_xattr_datum() is called later.
* save_xattr_ref(c, ref
, phys_ofs
)
* save_xattr_ref(c, ref)
* is used to write xref to medium.
* create_xattr_ref(c, ic, xd
, phys_ofs
)
* create_xattr_ref(c, ic, xd)
* is used to create a new xref and write to medium.
* jffs2_xattr_delete_inode(c, ic)
* is called to remove xrefs related to obsolete inode when inode is unlinked.
...
...
@@ -554,19 +554,19 @@ static void delete_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *re
jffs2_free_xattr_ref
(
ref
);
}
static
int
save_xattr_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_ref
*
ref
,
uint32_t
phys_ofs
)
static
int
save_xattr_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_ref
*
ref
)
{
/* must be called under down_write(xattr_sem) */
struct
jffs2_raw_node_ref
*
raw
;
struct
jffs2_raw_xref
rr
;
uint32_t
length
;
uint32_t
phys_ofs
=
write_ofs
(
c
);
int
ret
;
raw
=
jffs2_alloc_raw_node_ref
();
if
(
!
raw
)
return
-
ENOMEM
;
raw
->
flash_offset
=
phys_ofs
;
raw
->
next_in_ino
=
(
void
*
)
ref
;
rr
.
magic
=
cpu_to_je16
(
JFFS2_MAGIC_BITMASK
);
rr
.
nodetype
=
cpu_to_je16
(
JFFS2_NODETYPE_XREF
);
...
...
@@ -584,8 +584,7 @@ static int save_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref,
ret
=
ret
?
ret
:
-
EIO
;
if
(
length
)
{
raw
->
flash_offset
|=
REF_OBSOLETE
;
raw
->
next_in_ino
=
NULL
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
rr
)));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
rr
)),
NULL
);
jffs2_mark_node_obsolete
(
c
,
raw
);
}
else
{
jffs2_free_raw_node_ref
(
raw
);
...
...
@@ -594,7 +593,8 @@ static int save_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref,
}
raw
->
flash_offset
|=
REF_PRISTINE
;
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
rr
)));
jffs2_add_physical_node_ref
(
c
,
raw
,
PAD
(
sizeof
(
rr
)),
NULL
);
/* FIXME */
raw
->
next_in_ino
=
(
void
*
)
ref
;
if
(
ref
->
node
)
delete_xattr_ref_node
(
c
,
ref
);
ref
->
node
=
raw
;
...
...
@@ -605,7 +605,7 @@ static int save_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref,
}
static
struct
jffs2_xattr_ref
*
create_xattr_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_cache
*
ic
,
struct
jffs2_xattr_datum
*
xd
,
uint32_t
phys_ofs
)
struct
jffs2_xattr_datum
*
xd
)
{
/* must be called under down_write(xattr_sem) */
struct
jffs2_xattr_ref
*
ref
;
...
...
@@ -617,7 +617,7 @@ static struct jffs2_xattr_ref *create_xattr_ref(struct jffs2_sb_info *c, struct
ref
->
ic
=
ic
;
ref
->
xd
=
xd
;
ret
=
save_xattr_ref
(
c
,
ref
,
phys_ofs
);
ret
=
save_xattr_ref
(
c
,
ref
);
if
(
ret
)
{
jffs2_free_xattr_ref
(
ref
);
return
ERR_PTR
(
ret
);
...
...
@@ -1063,7 +1063,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
struct
jffs2_inode_cache
*
ic
=
f
->
inocache
;
struct
jffs2_xattr_datum
*
xd
;
struct
jffs2_xattr_ref
*
ref
,
*
newref
,
**
pref
;
uint32_t
phys_ofs
,
length
,
request
;
uint32_t
length
,
request
;
int
rc
;
rc
=
check_xattr_ref_inode
(
c
,
ic
);
...
...
@@ -1071,7 +1071,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
return
rc
;
request
=
PAD
(
sizeof
(
struct
jffs2_raw_xattr
)
+
strlen
(
xname
)
+
1
+
size
);
rc
=
jffs2_reserve_space
(
c
,
request
,
&
phys_ofs
,
&
length
,
rc
=
jffs2_reserve_space
(
c
,
request
,
&
length
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_XATTR_SIZE
);
if
(
rc
)
{
JFFS2_WARNING
(
"jffs2_reserve_space()=%d, request=%u
\n
"
,
rc
,
request
);
...
...
@@ -1118,7 +1118,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
goto
out
;
}
found:
xd
=
create_xattr_datum
(
c
,
xprefix
,
xname
,
buffer
,
size
,
phys_ofs
);
xd
=
create_xattr_datum
(
c
,
xprefix
,
xname
,
buffer
,
size
);
if
(
IS_ERR
(
xd
))
{
rc
=
PTR_ERR
(
xd
);
goto
out
;
...
...
@@ -1128,7 +1128,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
/* create xattr_ref */
request
=
PAD
(
sizeof
(
struct
jffs2_raw_xref
));
rc
=
jffs2_reserve_space
(
c
,
request
,
&
phys_ofs
,
&
length
,
rc
=
jffs2_reserve_space
(
c
,
request
,
&
length
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_XREF_SIZE
);
if
(
rc
)
{
JFFS2_WARNING
(
"jffs2_reserve_space()=%d, request=%u
\n
"
,
rc
,
request
);
...
...
@@ -1142,7 +1142,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
down_write
(
&
c
->
xattr_sem
);
if
(
ref
)
*
pref
=
ref
->
next
;
newref
=
create_xattr_ref
(
c
,
ic
,
xd
,
phys_ofs
);
newref
=
create_xattr_ref
(
c
,
ic
,
xd
);
if
(
IS_ERR
(
newref
))
{
if
(
ref
)
{
ref
->
next
=
ic
->
xref
;
...
...
@@ -1171,7 +1171,7 @@ int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
* -------------------------------------------------- */
int
jffs2_garbage_collect_xattr_datum
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_datum
*
xd
)
{
uint32_t
phys_ofs
,
totlen
,
length
,
old_ofs
;
uint32_t
totlen
,
length
,
old_ofs
;
int
rc
=
-
EINVAL
;
down_write
(
&
c
->
xattr_sem
);
...
...
@@ -1191,13 +1191,13 @@ int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xatt
}
else
if
(
unlikely
(
rc
<
0
))
goto
out
;
}
rc
=
jffs2_reserve_space_gc
(
c
,
totlen
,
&
phys_ofs
,
&
length
,
JFFS2_SUMMARY_XATTR_SIZE
);
rc
=
jffs2_reserve_space_gc
(
c
,
totlen
,
&
length
,
JFFS2_SUMMARY_XATTR_SIZE
);
if
(
rc
||
length
<
totlen
)
{
JFFS2_WARNING
(
"jffs2_reserve_space()=%d, request=%u
\n
"
,
rc
,
totlen
);
rc
=
rc
?
rc
:
-
EBADFD
;
goto
out
;
}
rc
=
save_xattr_datum
(
c
,
xd
,
phys_ofs
);
rc
=
save_xattr_datum
(
c
,
xd
);
if
(
!
rc
)
dbg_xattr
(
"xdatum (xid=%u, version=%u) GC'ed from %#08x to %08x
\n
"
,
xd
->
xid
,
xd
->
version
,
old_ofs
,
ref_offset
(
xd
->
node
));
...
...
@@ -1209,7 +1209,7 @@ int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xatt
int
jffs2_garbage_collect_xattr_ref
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_xattr_ref
*
ref
)
{
uint32_t
phys_ofs
,
totlen
,
length
,
old_ofs
;
uint32_t
totlen
,
length
,
old_ofs
;
int
rc
=
-
EINVAL
;
down_write
(
&
c
->
xattr_sem
);
...
...
@@ -1220,14 +1220,14 @@ int jffs2_garbage_collect_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_
if
(
totlen
!=
sizeof
(
struct
jffs2_raw_xref
))
goto
out
;
rc
=
jffs2_reserve_space_gc
(
c
,
totlen
,
&
phys_ofs
,
&
length
,
JFFS2_SUMMARY_XREF_SIZE
);
rc
=
jffs2_reserve_space_gc
(
c
,
totlen
,
&
length
,
JFFS2_SUMMARY_XREF_SIZE
);
if
(
rc
||
length
<
totlen
)
{
JFFS2_WARNING
(
"%s: jffs2_reserve_space() = %d, request = %u
\n
"
,
__FUNCTION__
,
rc
,
totlen
);
rc
=
rc
?
rc
:
-
EBADFD
;
goto
out
;
}
rc
=
save_xattr_ref
(
c
,
ref
,
phys_ofs
);
rc
=
save_xattr_ref
(
c
,
ref
);
if
(
!
rc
)
dbg_xattr
(
"xref (ino=%u, xid=%u) GC'ed from %#08x to %08x
\n
"
,
ref
->
ic
->
ino
,
ref
->
xd
->
xid
,
old_ofs
,
ref_offset
(
ref
->
node
));
...
...
fs/jffs2/xattr.h
View file @
4cbb9b80
...
...
@@ -20,11 +20,11 @@
struct
jffs2_xattr_datum
{
void
*
always_null
;
u8
class
;
u8
flags
;
u16
xprefix
;
/* see JFFS2_XATTR_PREFIX_* */
struct
jffs2_raw_node_ref
*
node
;
uint8_t
class
;
uint8_t
flags
;
uint16_t
xprefix
;
/* see JFFS2_XATTR_PREFIX_* */
struct
list_head
xindex
;
/* chained from c->xattrindex[n] */
uint32_t
refcnt
;
/* # of xattr_ref refers this */
uint32_t
xid
;
...
...
@@ -42,11 +42,11 @@ struct jffs2_inode_cache;
struct
jffs2_xattr_ref
{
void
*
always_null
;
u8
class
;
u8
flags
;
/* Currently unused */
struct
jffs2_raw_node_ref
*
node
;
uint8_t
class
;
uint8_t
flags
;
/* Currently unused */
u16
unused
;
struct
jffs2_raw_node_ref
*
node
;
union
{
struct
jffs2_inode_cache
*
ic
;
/* reference to jffs2_inode_cache */
uint32_t
ino
;
/* only used in scanning/building */
...
...
include/linux/mtd/mtd.h
View file @
4cbb9b80
...
...
@@ -66,8 +66,12 @@ struct mtd_info {
* information below if they desire
*/
u_int32_t
erasesize
;
/* Smallest availlable size for writing to the device. For NAND,
* this is the page size, for some NOR chips, the size of ECC
* covered blocks.
*/
u_int32_t
writesize
;
u_int32_t
oobblock
;
// Size of OOB blocks (e.g. 512)
u_int32_t
oobsize
;
// Amount of OOB data per block (e.g. 16)
u_int32_t
ecctype
;
u_int32_t
eccsize
;
...
...
@@ -79,7 +83,6 @@ struct mtd_info {
* MTD_PROGRAM_REGIONS flag is set.
* (Maybe we should have an union for those?)
*/
#define MTD_PROGREGION_SIZE(mtd) (mtd)->oobblock
#define MTD_PROGREGION_CTRLMODE_VALID(mtd) (mtd)->oobsize
#define MTD_PROGREGION_CTRLMODE_INVALID(mtd) (mtd)->ecctype
...
...
include/mtd/mtd-abi.h
View file @
4cbb9b80
...
...
@@ -30,17 +30,14 @@ struct mtd_oob_buf {
#define MTD_NANDFLASH 4
#define MTD_DATAFLASH 6
#define MTD_CLEAR_BITS 1 // Bits can be cleared (flash)
#define MTD_SET_BITS 2 // Bits can be set
#define MTD_ECC 128 // Device capable of automatic ECC
#define MTD_PROGRAM_REGIONS 512 // Configurable Programming Regions
#define MTD_WRITEABLE 0x400
/* Device is writeable */
#define MTD_BIT_WRITEABLE 0x800
/* Single bits can be flipped */
// Some common devices / combinations of capabilities
#define MTD_CAP_ROM 0
#define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS)
#define MTD_CAP_NORFLASH (MTD_CLEAR_BITS)
#define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS)
#define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS)
#define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE)
#define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE)
#define MTD_CAP_NANDFLASH (MTD_WRITEABLE)
// Types of automatic ECC/Checksum available
...
...
@@ -65,7 +62,7 @@ struct mtd_info_user {
uint32_t
flags
;
uint32_t
size
;
// Total size of the MTD
uint32_t
erasesize
;
uint32_t
oobblock
;
// Size of OOB blocks (e.g. 512)
uint32_t
writesize
;
uint32_t
oobsize
;
// Amount of OOB data per block (e.g. 16)
uint32_t
ecctype
;
uint32_t
eccsize
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment