[PATCH] libfs/jffs2: Force the inode size to a non-zero value if a directory.
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Mar 13 06:52:16 UTC 2018
On 13/03/18 07:50, Sebastian Huber wrote:
> On 13/03/18 07:47, Chris Johns wrote:
>> On 13/03/2018 17:18, Sebastian Huber wrote:
>>> On 13/03/18 00:49, Chris Johns wrote:
>>>> Set the inode size to 256 to work around a newlib scandir check
>>>> where a
>>>> directory has to have a non-zero size to work. Set the size to
>>>> greater than
>>>> 24 bytes, a small dirent size so the allocator in scandir works.
>>>>
>>>> The newlib scandir code should be updated to a more recent scandir
>>>> from
>>>> FreeBSD where these checks have been removed. This change is a work
>>>> around to avoid new tools on the release branch.
>>>>
>>>> With this change scandir works on IMFS, RFS and JFFS2.
>>> I cannot find a scandir() test in the fstests for all file systems.
>>>
>>>> Closes #3332
>>>> ---
>>>> cpukit/libfs/src/jffs2/src/fs-rtems.c | 3 +++
>>>> 1 file changed, 3 insertions(+)
>>>>
>>>> diff --git a/cpukit/libfs/src/jffs2/src/fs-rtems.c
>>>> b/cpukit/libfs/src/jffs2/src/fs-rtems.c
>>>> index ce84d44470..790929d856 100644
>>>> --- a/cpukit/libfs/src/jffs2/src/fs-rtems.c
>>>> +++ b/cpukit/libfs/src/jffs2/src/fs-rtems.c
>>>> @@ -1512,6 +1512,9 @@ static int jffs2_read_inode (struct _inode
>>>> *inode)
>>>> inode->i_mtime = je32_to_cpu(latest_node.mtime);
>>>> inode->i_ctime = je32_to_cpu(latest_node.ctime);
>>>> + if (S_ISDIR(inode->i_mode))
>>>> + inode->i_size = 256;
>>>> +
>>>> inode->i_nlink = f->inocache->pino_nlink;
>>>> mutex_unlock(&f->sem);
>>> This code is from the original JFFS2 support for eCos. Which
>>> side-effects has
>>> this i_size change for directories? Why can't you place this hack in
>>> rtems_jffs2_fstat()? This would reduce the impact area of this change.
>>>
>> I did not know the history of the RTEMS wrapper. I just assumed all
>> code in that
>> file is specific to RTEMS. The change I have makes things consistent.
>> I still
>> think it is OK?
>
> What do you mean with consistent? I thought this is a hack to make the
> Newlib scandir() happy? This i_size is used in several places. How do
> you know that you didn't accidentally broke something?
>
We have also this comment:
struct _inode {
cyg_uint32 i_ino;
int i_count;
mode_t i_mode;
nlink_t i_nlink; // Could we dispense with this?
uid_t i_uid;
gid_t i_gid;
time_t i_atime;
time_t i_mtime;
time_t i_ctime;
// union {
unsigned short i_rdev; // For devices only
struct _inode * i_parent; // For directories only
off_t i_size; // For files only
// };
struct super_block * i_sb;
struct jffs2_full_dirent * i_fd;
struct jffs2_inode_info jffs2_i;
struct _inode * i_cache_prev; // We need doubly-linked?
struct _inode * i_cache_next;
};
Which is no longer valid with this change.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list