Index: sys/compat/linux/linux_stats.c =================================================================== --- sys/compat/linux/linux_stats.c +++ sys/compat/linux/linux_stats.c @@ -70,6 +70,17 @@ sb->st_mode |= S_IFBLK; } + /* + * Return the same st_dev for every devfs instance. The reason + * for this is to work around an idiosyncrasy of glibc getttynam() + * implementation: it checks whether st_dev returned for fd 0 + * is the same as st_dev returned for the target of /proc/self/fd/0 + * symlink, and with linux chroots having their own devfs instance, + * the check will fail if you chroot into it. + */ + if (vp->v_type == VCHR && rootdevmp != NULL) + sb->st_dev = rootdevmp->mnt_stat.f_fsid.val[0]; + if (vp->v_type == VCHR && vp->v_rdev != NULL && linux_driver_get_major_minor(devtoname(vp->v_rdev), &major, &minor) == 0) { @@ -123,6 +134,8 @@ buf->st_mode &= ~S_IFMT; buf->st_mode |= S_IFBLK; } + if (vp != NULL && vp->v_type == VCHR && rootdevmp != NULL) + buf->st_dev = rootdevmp->mnt_stat.f_fsid.val[0]; if (vp != NULL && vp->v_rdev != NULL && linux_driver_get_major_minor(devtoname(vp->v_rdev), &major, &minor) == 0) {