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 */
  };

上記は参照用の構造体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コマンドの使用フィールドとサイズフィールドが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

オーバーヘッドブロックは膨大な数です。それはどういう意味ですか?

挨拶

関連情報