mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
cpukit/jffs2,spec: Add summary support to the build
This adds summary support to the build with a global option to enable this support and necessary changes to the imported summary support source to integrate it into the build system and resolve errors. Closes #5398
This commit is contained in:
committed by
Kinsey Moore
parent
d0974e6bae
commit
fa6c222bdc
@@ -52,8 +52,33 @@ static inline int mtd_is_bitflip(int err) { return (err == -EUCLEAN); }
|
|||||||
})
|
})
|
||||||
#define mtd_block_markbad(mtd_sp, offset) \
|
#define mtd_block_markbad(mtd_sp, offset) \
|
||||||
jffs2_flash_block_mark_bad(RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd), offset)
|
jffs2_flash_block_mark_bad(RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd), offset)
|
||||||
#define mtd_write(mtd_sp, ofs, len, retlen, buf) \
|
#define mtd_write(mtd_sp, write_buffer_offset, size, return_size, write_buffer) \
|
||||||
jffs2_flash_direct_write(RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd), ofs, len, retlen, buf)
|
({ \
|
||||||
|
struct jffs2_sb_info *_c = RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd); \
|
||||||
|
const struct super_block *_sb = OFNI_BS_2SFFJ(_c); \
|
||||||
|
rtems_jffs2_flash_control *_fc = _sb->s_flash_control; \
|
||||||
|
*return_size = size; \
|
||||||
|
(*_fc->write)(_fc, write_buffer_offset, write_buffer, size); \
|
||||||
|
})
|
||||||
|
#define mtd_writev(mtd_sp, vecs, count, to, retlen) \
|
||||||
|
({ \
|
||||||
|
size_t _totlen = 0; \
|
||||||
|
size_t _thislen; \
|
||||||
|
int _ret = 0; \
|
||||||
|
for (int _i = 0; _i < count; _i++) { \
|
||||||
|
_ret = mtd_write(c->mtd, to, vecs[_i].iov_len, &_thislen, \
|
||||||
|
vecs[_i].iov_base); \
|
||||||
|
_totlen += _thislen; \
|
||||||
|
if (_ret || _thislen != vecs[_i].iov_len) { \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
to += vecs[_i].iov_len; \
|
||||||
|
} \
|
||||||
|
if (retlen) { \
|
||||||
|
*retlen = _totlen; \
|
||||||
|
} \
|
||||||
|
_ret; \
|
||||||
|
})
|
||||||
#define mtd_read(mtd_sp, ofs, len, retlen, buf) \
|
#define mtd_read(mtd_sp, ofs, len, retlen, buf) \
|
||||||
jffs2_flash_direct_read(RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd), ofs, len, retlen, buf)
|
jffs2_flash_direct_read(RTEMS_CONTAINER_OF(&(mtd_sp), struct jffs2_sb_info, mtd), ofs, len, retlen, buf)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#ifndef __LINUX_TYPES_H__
|
#ifndef __LINUX_TYPES_H__
|
||||||
#define __LINUX_TYPES_H__
|
#define __LINUX_TYPES_H__
|
||||||
|
|
||||||
|
#ifdef CONFIG_JFFS2_SUMMARY
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#define __must_hold(a)
|
||||||
|
#endif
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/mtd/mtd.h>
|
||||||
#include "nodelist.h"
|
#include "nodelist.h"
|
||||||
|
|
||||||
#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
|
#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
|
||||||
@@ -44,101 +45,6 @@ int jffs2_flash_direct_read(struct jffs2_sb_info * c,
|
|||||||
return (*fc->read)(fc, read_buffer_offset, write_buffer, size);
|
return (*fc->read)(fc, read_buffer_offset, write_buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int jffs2_flash_direct_write(struct jffs2_sb_info * c,
|
|
||||||
loff_t write_buffer_offset, const size_t size,
|
|
||||||
size_t * return_size, const unsigned char *read_buffer)
|
|
||||||
{
|
|
||||||
const struct super_block *sb = OFNI_BS_2SFFJ(c);
|
|
||||||
rtems_jffs2_flash_control *fc = sb->s_flash_control;
|
|
||||||
|
|
||||||
*return_size = size;
|
|
||||||
|
|
||||||
return (*fc->write)(fc, write_buffer_offset, read_buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct iovec *vecs,
|
|
||||||
unsigned long count, loff_t to, size_t * retlen)
|
|
||||||
{
|
|
||||||
unsigned long i;
|
|
||||||
size_t totlen = 0, thislen;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
// writes need to be aligned but the data we're passed may not be
|
|
||||||
// Observation suggests most unaligned writes are small, so we
|
|
||||||
// optimize for that case.
|
|
||||||
|
|
||||||
if (((vecs[i].iov_len & (sizeof (int) - 1))) ||
|
|
||||||
(((unsigned long) vecs[i].
|
|
||||||
iov_base & (sizeof (unsigned long) - 1)))) {
|
|
||||||
// are there iov's after this one? Or is it so much we'd need
|
|
||||||
// to do multiple writes anyway?
|
|
||||||
if ((i + 1) < count || vecs[i].iov_len > 256) {
|
|
||||||
// cop out and malloc
|
|
||||||
unsigned long j;
|
|
||||||
ssize_t sizetomalloc = 0, totvecsize = 0;
|
|
||||||
char *cbuf, *cbufptr;
|
|
||||||
|
|
||||||
for (j = i; j < count; j++)
|
|
||||||
totvecsize += vecs[j].iov_len;
|
|
||||||
|
|
||||||
// pad up in case unaligned
|
|
||||||
sizetomalloc = totvecsize + sizeof (int) - 1;
|
|
||||||
sizetomalloc &= ~(sizeof (int) - 1);
|
|
||||||
cbuf = (char *) malloc(sizetomalloc);
|
|
||||||
// malloc returns aligned memory
|
|
||||||
if (!cbuf) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto writev_out;
|
|
||||||
}
|
|
||||||
cbufptr = cbuf;
|
|
||||||
for (j = i; j < count; j++) {
|
|
||||||
memcpy(cbufptr, vecs[j].iov_base,
|
|
||||||
vecs[j].iov_len);
|
|
||||||
cbufptr += vecs[j].iov_len;
|
|
||||||
}
|
|
||||||
ret =
|
|
||||||
jffs2_flash_write(c, to, sizetomalloc,
|
|
||||||
&thislen, cbuf);
|
|
||||||
if (thislen > totvecsize) // in case it was aligned up
|
|
||||||
thislen = totvecsize;
|
|
||||||
totlen += thislen;
|
|
||||||
free(cbuf);
|
|
||||||
goto writev_out;
|
|
||||||
} else {
|
|
||||||
// otherwise optimize for the common case
|
|
||||||
int buf[256 / sizeof (int)]; // int, so int aligned
|
|
||||||
size_t lentowrite;
|
|
||||||
|
|
||||||
lentowrite = vecs[i].iov_len;
|
|
||||||
// pad up in case its unaligned
|
|
||||||
lentowrite += sizeof (int) - 1;
|
|
||||||
lentowrite &= ~(sizeof (int) - 1);
|
|
||||||
memcpy(buf, vecs[i].iov_base, lentowrite);
|
|
||||||
|
|
||||||
ret =
|
|
||||||
jffs2_flash_write(c, to, lentowrite,
|
|
||||||
&thislen, (char *) &buf);
|
|
||||||
if (thislen > vecs[i].iov_len)
|
|
||||||
thislen = vecs[i].iov_len;
|
|
||||||
} // else
|
|
||||||
} else
|
|
||||||
ret =
|
|
||||||
jffs2_flash_write(c, to, vecs[i].iov_len, &thislen,
|
|
||||||
vecs[i].iov_base);
|
|
||||||
totlen += thislen;
|
|
||||||
if (ret || thislen != vecs[i].iov_len)
|
|
||||||
break;
|
|
||||||
to += vecs[i].iov_len;
|
|
||||||
}
|
|
||||||
writev_out:
|
|
||||||
if (retlen)
|
|
||||||
*retlen = totlen;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int jffs2_flash_erase(struct jffs2_sb_info * c,
|
int jffs2_flash_erase(struct jffs2_sb_info * c,
|
||||||
struct jffs2_eraseblock * jeb)
|
struct jffs2_eraseblock * jeb)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -182,7 +182,11 @@ static inline void jffs2_erase_pending_trigger(struct jffs2_sb_info *c)
|
|||||||
#define SECTOR_ADDR(x) ( ((unsigned long)(x) & ~(c->sector_size-1)) )
|
#define SECTOR_ADDR(x) ( ((unsigned long)(x) & ~(c->sector_size-1)) )
|
||||||
#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
|
#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
|
||||||
|
|
||||||
|
#ifdef CONFIG_JFFS2_SUMMARY
|
||||||
|
#define jffs2_can_mark_obsolete(c) (0)
|
||||||
|
#else
|
||||||
#define jffs2_can_mark_obsolete(c) (1)
|
#define jffs2_can_mark_obsolete(c) (1)
|
||||||
|
#endif
|
||||||
#define jffs2_is_writebuffered(c) (0)
|
#define jffs2_is_writebuffered(c) (0)
|
||||||
#define jffs2_cleanmarker_oob(c) (0)
|
#define jffs2_cleanmarker_oob(c) (0)
|
||||||
#define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
|
#define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
|
||||||
@@ -204,7 +208,11 @@ static inline void jffs2_erase_pending_trigger(struct jffs2_sb_info *c)
|
|||||||
#define MTD_BIT_WRITEABLE 0x800
|
#define MTD_BIT_WRITEABLE 0x800
|
||||||
#define jffs2_is_writebuffered(c) (c->wbuf != NULL)
|
#define jffs2_is_writebuffered(c) (c->wbuf != NULL)
|
||||||
|
|
||||||
|
#ifdef CONFIG_JFFS2_SUMMARY
|
||||||
|
#define jffs2_can_mark_obsolete(c) (0)
|
||||||
|
#else
|
||||||
#define jffs2_can_mark_obsolete(c) (OFNI_BS_2SFFJ(c)->s_flash_control->block_is_bad == NULL)
|
#define jffs2_can_mark_obsolete(c) (OFNI_BS_2SFFJ(c)->s_flash_control->block_is_bad == NULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define jffs2_cleanmarker_oob(c) (OFNI_BS_2SFFJ(c)->s_flash_control->block_is_bad != NULL)
|
#define jffs2_cleanmarker_oob(c) (OFNI_BS_2SFFJ(c)->s_flash_control->block_is_bad != NULL)
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,27 @@ int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri,
|
|||||||
temp->totlen = ri->totlen;
|
temp->totlen = ri->totlen;
|
||||||
temp->next = NULL;
|
temp->next = NULL;
|
||||||
|
|
||||||
|
#ifdef __rtems__
|
||||||
|
/* cast through void* for type warnings */
|
||||||
|
void *alignment_temp = temp;
|
||||||
|
/*
|
||||||
|
* logic copied from jffs2_sum_add_mem above to avoid array bounds
|
||||||
|
* issues caused by unions
|
||||||
|
*/
|
||||||
|
if (!s->sum_list_head)
|
||||||
|
s->sum_list_head = alignment_temp;
|
||||||
|
if (s->sum_list_tail)
|
||||||
|
s->sum_list_tail->u.next = alignment_temp;
|
||||||
|
s->sum_list_tail = alignment_temp;
|
||||||
|
|
||||||
|
s->sum_size += JFFS2_SUMMARY_INODE_SIZE;
|
||||||
|
s->sum_num++;
|
||||||
|
dbg_summary("inode (%u) added to summary\n",
|
||||||
|
je32_to_cpu(temp->inode));
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
|
return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd,
|
int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd,
|
||||||
@@ -151,7 +171,12 @@ int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *r
|
|||||||
|
|
||||||
memcpy(temp->name, rd->name, rd->nsize);
|
memcpy(temp->name, rd->name, rd->nsize);
|
||||||
|
|
||||||
|
#ifdef __rtems__
|
||||||
|
void *alignment_cast = temp;
|
||||||
|
return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)alignment_cast);
|
||||||
|
#else
|
||||||
return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
|
return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_JFFS2_FS_XATTR
|
#ifdef CONFIG_JFFS2_FS_XATTR
|
||||||
@@ -275,7 +300,12 @@ int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
|
|||||||
temp->totlen = node->i.totlen;
|
temp->totlen = node->i.totlen;
|
||||||
temp->next = NULL;
|
temp->next = NULL;
|
||||||
|
|
||||||
|
#ifdef __rtems__
|
||||||
|
void *alignment_cast = temp;
|
||||||
|
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)alignment_cast);
|
||||||
|
#else
|
||||||
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
|
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
case JFFS2_NODETYPE_DIRENT: {
|
case JFFS2_NODETYPE_DIRENT: {
|
||||||
@@ -309,7 +339,12 @@ int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __rtems__
|
||||||
|
void *alignment_cast = temp;
|
||||||
|
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)alignment_cast);
|
||||||
|
#else
|
||||||
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
|
return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_JFFS2_FS_XATTR
|
#ifdef CONFIG_JFFS2_FS_XATTR
|
||||||
case JFFS2_NODETYPE_XATTR: {
|
case JFFS2_NODETYPE_XATTR: {
|
||||||
|
|||||||
@@ -13,11 +13,20 @@
|
|||||||
#ifndef JFFS2_SUMMARY_H
|
#ifndef JFFS2_SUMMARY_H
|
||||||
#define JFFS2_SUMMARY_H
|
#define JFFS2_SUMMARY_H
|
||||||
|
|
||||||
|
#ifndef __rtems__
|
||||||
/* Limit summary size to 64KiB so that we can kmalloc it. If the summary
|
/* Limit summary size to 64KiB so that we can kmalloc it. If the summary
|
||||||
is larger than that, we have to just ditch it and avoid using summary
|
is larger than that, we have to just ditch it and avoid using summary
|
||||||
for the eraseblock in question... and it probably doesn't hurt us much
|
for the eraseblock in question... and it probably doesn't hurt us much
|
||||||
anyway. */
|
anyway. */
|
||||||
#define MAX_SUMMARY_SIZE 65536
|
#define MAX_SUMMARY_SIZE 65536
|
||||||
|
#else /* __rtems__ */
|
||||||
|
/*
|
||||||
|
* RTEMS uses a flat memory space with no virtual addressing, so allocation for
|
||||||
|
* DMA purposes does not require the special consideration that the Linux kernel
|
||||||
|
* requires. Allow summary nodes to consume up to a sector.
|
||||||
|
*/
|
||||||
|
#define MAX_SUMMARY_SIZE c->sector_size
|
||||||
|
#endif /* __rtems__ */
|
||||||
|
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/jffs2.h>
|
#include <linux/jffs2.h>
|
||||||
@@ -198,7 +207,18 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
|
|||||||
#define jffs2_sum_disable_collecting(a)
|
#define jffs2_sum_disable_collecting(a)
|
||||||
#define jffs2_sum_is_disabled(a) (0)
|
#define jffs2_sum_is_disabled(a) (0)
|
||||||
#define jffs2_sum_reset_collected(a) do { } while (0)
|
#define jffs2_sum_reset_collected(a) do { } while (0)
|
||||||
|
#ifndef __rtems__
|
||||||
#define jffs2_sum_add_kvec(a,b,c,d) (0)
|
#define jffs2_sum_add_kvec(a,b,c,d) (0)
|
||||||
|
#else
|
||||||
|
#define jffs2_sum_add_kvec(a,b,c,d) \
|
||||||
|
({ \
|
||||||
|
(void)a; \
|
||||||
|
(void)b; \
|
||||||
|
(void)c; \
|
||||||
|
(void)d; \
|
||||||
|
0; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
#define jffs2_sum_move_collected(a,b) do { } while (0)
|
#define jffs2_sum_move_collected(a,b) do { } while (0)
|
||||||
#define jffs2_sum_write_sumnode(a) (0)
|
#define jffs2_sum_write_sumnode(a) (0)
|
||||||
#define jffs2_sum_add_padding_mem(a,b) do { } while (0)
|
#define jffs2_sum_add_padding_mem(a,b) do { } while (0)
|
||||||
|
|||||||
@@ -77,5 +77,7 @@ links:
|
|||||||
uid: optnocoverageldflags
|
uid: optnocoverageldflags
|
||||||
- role: build-dependency
|
- role: build-dependency
|
||||||
uid: optversion
|
uid: optversion
|
||||||
|
- role: build-dependency
|
||||||
|
uid: optjffs2summary
|
||||||
target: cpukit/include/rtems/score/cpuopts.h
|
target: cpukit/include/rtems/score/cpuopts.h
|
||||||
type: build
|
type: build
|
||||||
|
|||||||
@@ -16,7 +16,9 @@ install:
|
|||||||
source:
|
source:
|
||||||
- cpukit/include/rtems/jffs2.h
|
- cpukit/include/rtems/jffs2.h
|
||||||
install-path: ${BSP_LIBDIR}
|
install-path: ${BSP_LIBDIR}
|
||||||
links: []
|
links:
|
||||||
|
- role: build-dependency
|
||||||
|
uid: objjffs2summary
|
||||||
source:
|
source:
|
||||||
- cpukit/libfs/src/jffs2/src/build.c
|
- cpukit/libfs/src/jffs2/src/build.c
|
||||||
- cpukit/libfs/src/jffs2/src/compr.c
|
- cpukit/libfs/src/jffs2/src/compr.c
|
||||||
@@ -36,5 +38,6 @@ source:
|
|||||||
- cpukit/libfs/src/jffs2/src/scan.c
|
- cpukit/libfs/src/jffs2/src/scan.c
|
||||||
- cpukit/libfs/src/jffs2/src/wbuf.c
|
- cpukit/libfs/src/jffs2/src/wbuf.c
|
||||||
- cpukit/libfs/src/jffs2/src/write.c
|
- cpukit/libfs/src/jffs2/src/write.c
|
||||||
|
- cpukit/libfs/src/jffs2/src/writev.c
|
||||||
target: jffs2
|
target: jffs2
|
||||||
type: build
|
type: build
|
||||||
|
|||||||
15
spec/build/cpukit/objjffs2summary.yml
Normal file
15
spec/build/cpukit/objjffs2summary.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
|
||||||
|
build-type: objects
|
||||||
|
cflags: []
|
||||||
|
copyrights:
|
||||||
|
- Copyright (C) 2025 On-Line Applications Research (OAR) Corporation
|
||||||
|
cppflags: []
|
||||||
|
cxxflags: []
|
||||||
|
enabled-by:
|
||||||
|
- CONFIG_JFFS2_SUMMARY
|
||||||
|
includes: []
|
||||||
|
install: []
|
||||||
|
links: []
|
||||||
|
source:
|
||||||
|
- cpukit/libfs/src/jffs2/src/summary.c
|
||||||
|
type: build
|
||||||
17
spec/build/cpukit/optjffs2summary.yml
Normal file
17
spec/build/cpukit/optjffs2summary.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
|
||||||
|
actions:
|
||||||
|
- get-boolean: null
|
||||||
|
- env-enable: null
|
||||||
|
- define-condition: null
|
||||||
|
build-type: option
|
||||||
|
copyrights:
|
||||||
|
- Copyright (C) 2025 On-Line Applications Research (OAR) Corporation
|
||||||
|
default:
|
||||||
|
- enabled-by: true
|
||||||
|
value: false
|
||||||
|
description: |
|
||||||
|
Enable support for JFFS2 Erase Block Summary (EBS)
|
||||||
|
enabled-by: true
|
||||||
|
links: []
|
||||||
|
name: CONFIG_JFFS2_SUMMARY
|
||||||
|
type: build
|
||||||
Reference in New Issue
Block a user