+}
+
+__DEFINE_LXSYSCALL2(int, fstat, int, fd, struct file_stat*, stat)
+{
+ int errno = 0;
+ struct v_fd* fds;
+
+ if ((errno = vfs_getfd(fd, &fds))) {
+ goto done;
+ }
+
+ struct v_inode* vino = fds->file->inode;
+ struct device* fdev = vino->sb->dev;
+
+ *stat = (struct file_stat){.st_ino = vino->id,
+ .st_blocks = vino->lb_usage,
+ .st_size = vino->fsize,
+ .mode = vino->itype,
+ .st_ioblksize = PG_SIZE,
+ .st_blksize = vino->sb->blksize};
+
+ if (VFS_DEVFILE(vino->itype)) {
+ struct device* rdev = resolve_device(vino->data);
+ if (!rdev || rdev->magic != DEV_STRUCT_MAGIC) {
+ errno = EINVAL;
+ goto done;
+ }
+
+ stat->st_rdev = (dev_t){.meta = rdev->ident.fn_grp,
+ .unique = rdev->ident.unique,
+ .index = rdev->dev_uid};
+ }
+
+ if (fdev) {
+ stat->st_dev = (dev_t){.meta = fdev->ident.fn_grp,
+ .unique = fdev->ident.unique,
+ .index = fdev->dev_uid};
+ }
+
+done:
+ return DO_STATUS(errno);