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

오버헤드 블록은 엄청난 숫자입니다. 그게 무슨 뜻이야?

인사

관련 정보