statvfs 返回无效信息

statvfs 返回无效信息

我的eMMC分区是ext4格式的,大约有100MB。当我在该分区上发出 statvfs() 时,我得到了 struct statvfs 的 f_blocks 字段的巨大返回值。

struct statvfs {
    unsigned long  f_bsize;    /* file system block size */
    unsigned long  f_frsize;   /* fragment size */
    fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
    fsblkcnt_t     f_bfree;    /* # free blocks */
    fsblkcnt_t     f_bavail;   /* # free blocks for non-root */
    fsfilcnt_t     f_files;    /* # inodes */
    fsfilcnt_t     f_ffree;    /* # free inodes */
    fsfilcnt_t     f_favail;   /* # free inodes for non-root */
    unsigned long  f_fsid;     /* file system ID */
    unsigned long  f_flag;     /* mount flags */
    unsigned long  f_namemax;  /* maximum filename length */
  };

上面是 struct statvfs,供您参考。

f_blocks 字段打印的值是 18446744073659310077,考虑到我的分区有 100MB,这是一个很大的值。 df 命令还返回已使用的值和 16Z 的大小!

Filesystem       Size  Used Avail Use% Mounted on
/dev/mmcblk2p4    16Z   16Z   79M 100% /data

知道可能出什么问题吗?对分区进行 fsck 成功。不确定是超级块有问题还是什么?下面是代码供您参考。

if (statvfs_works ())
{
  struct statvfs vfsd;

  if (statvfs (file, &vfsd) < 0)
    return -1; 

  fsp->fsu_blocks = PROPAGATE_ALL_ONES (vfsd.f_blocks);
  ....

}

我陷入了困境,需要理解为什么 df 命令中的used和size字段返回值16Z。任何指示将不胜感激。

更新更多信息========================================

Output from /proc/partitions is as follows:  
179        3     102400 mmcblk2p4

strace 报告以下输出:

statfs64("/data", 88, {f_type="EXT2_SUPER_MAGIC", f_bsize=1024, f_blocks=18446744073659310077, f_bfree=87628, f_bavail=80460, f_files=25688, f_ffree=25189, f_fsid={-1446355608, 1063639410}, f_namelen=255, f_frsize=1024, f_flags=4128}) = 0

可以看出f_blocks是一个巨大的数字。这意味着什么?我的内核是4.9.31。如何解决这个问题并使 df 报告正确的输出?

输出 dumpe2fs 返回以下内容

Block count:              102400
Reserved block count:     5120
Overhead blocks:          50343939

开销块是一个巨大的数字。这意味着什么?

问候

相关内容