fs/dirent: add d_ino member to struct dirent

Add the POSIX d_ino (file serial number) member to struct dirent and
populate it on every readdir() path, so portable callers (e.g. scp in
dropbear) that read dp->d_ino observe a meaningful, non-zero inode
number:

  - include/dirent.h: declare d_ino in struct dirent and drop the
    outdated comment claiming the field is unimplemented.
  - include/nuttx/fs/hostfs.h: add d_ino to struct nuttx_dirent_s so
    the hostfs ABI can carry the inode number across the VFS boundary.
  - arch/sim/src/sim/posix/sim_hostfs.c: forward the host's
    ent->d_ino into entry->d_ino.
  - fs/vfs/fs_dir.c (read_pseudodir): copy the in-memory inode's
    i_ino into entry->d_ino for the pseudo filesystem.
  - fs/yaffs/yaffs_vfs.c: forward yaffs's dirent->d_ino into
    entry->d_ino.
  - fs/rpmsgfs: extend struct rpmsgfs_readdir_s with an 'ino' field
    and propagate it across the RPC in both rpmsgfs_server (fills it
    from the underlying entry) and rpmsgfs_client (writes it back to
    the caller's nuttx_dirent_s).

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao 2026-06-09 13:29:16 +08:00 committed by Matteo Golin
parent 50377d0909
commit 2ea2655bc6
7 changed files with 10 additions and 1 deletions

View file

@ -443,6 +443,8 @@ int host_readdir(void *dirp, struct nuttx_dirent_s *entry)
strncpy(entry->d_name, ent->d_name, sizeof(entry->d_name) - 1);
entry->d_name[sizeof(entry->d_name) - 1] = 0;
entry->d_ino = ent->d_ino;
/* Map the type */
if (ent->d_type == DT_REG)

View file

@ -166,6 +166,7 @@ begin_packed_struct struct rpmsgfs_readdir_s
{
struct rpmsgfs_header_s header;
int32_t fd;
uint32_t ino;
uint32_t type;
char name[0];
} end_packed_struct;

View file

@ -209,6 +209,7 @@ static int rpmsgfs_readdir_handler(FAR struct rpmsg_endpoint *ept,
{
strlcpy(entry->d_name, rsp->name, sizeof(entry->d_name));
entry->d_type = rsp->type;
entry->d_ino = rsp->ino;
}
rpmsg_post(ept, &cookie->sem);

View file

@ -622,6 +622,7 @@ static int rpmsgfs_readdir_handler(FAR struct rpmsg_endpoint *ept,
size = MIN(size - len, strlen(entry->d_name) + 1);
msg->type = entry->d_type;
strlcpy(msg->name, entry->d_name, size);
msg->ino = entry->d_ino;
len += size;
ret = 0;
}

View file

@ -376,6 +376,8 @@ static int read_pseudodir(FAR struct fs_dirent_s *dir,
entry->d_type = DTYPE_DIRECTORY;
}
entry->d_ino = pdir->next->i_ino;
/* Now get the inode to visit next time that readdir() is called */
inode_lock();

View file

@ -107,11 +107,12 @@
* of char containing at least {NAME_MAX} plus one elements.
*
* POSIX also requires the field d_ino (type ino_t) that provides the file
* serial number. This functionality is not implemented in NuttX.
* serial number.
*/
struct dirent
{
ino_t d_ino; /* File serial number */
uint8_t d_type; /* Type of file */
char d_name[NAME_MAX + 1]; /* File name */
};

View file

@ -150,6 +150,7 @@ struct nuttx_timespec
struct nuttx_dirent_s
{
nuttx_ino_t d_ino;
uint8_t d_type; /* type of file */
char d_name[CONFIG_NAME_MAX + 1]; /* filename */
};