On Wed, Mar 23, 2022 at 08:21:52PM +0900, Tetsuo Handa wrote: > Hello. > > I found that running a sample program shown below on xfs filesystem > results in consuming extra disk space until close() is called. > Is this expected result? > > I don't care if temporarily consumed extra disk space is trivial. But since > this amount as of returning from fsync() is as much as amount of written data, > I worry that there might be some bug. > > ---------- my_write_unlink.c ---------- > #include <stdio.h> > #include <stdlib.h> > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > #include <unistd.h> > > int main(int argc, char *argv[]) > { > static char buffer[1048576]; > const char *filename = "my_testfile"; > const int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600); > int i; > > if (fd == EOF) > return 1; > printf("Before write().\n"); > system("/bin/df -m ."); > for (i = 0; i < 1024; i++) > if (write(fd, buffer, sizeof(buffer)) != sizeof(buffer)) > return 1; > if (fsync(fd)) > return 1; > printf("Before close().\n"); If you run filefrag -v at this point and see blocks mapped into the file after EOF, then the extra disk space consumption you see is most likely speculative preallocation for extending writes. --D > system("/bin/df -m ."); > if (close(fd)) > return 1; > printf("Before unlink().\n"); > system("/bin/df -m ."); > if (unlink(filename)) > return 1; > printf("After unlink().\n"); > system("/bin/df -m ."); > return 0; > } > ---------- my_write_unlink.c ---------- > > ---------- > $ uname -r > 5.17.0 > $ ./my_write_unlink > Before write(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 255875 130392 125483 51% / > Before close(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 255875 132443 123432 52% / > Before unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 255875 131416 124459 52% / > After unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 255875 130392 125483 51% / > $ grep sda /proc/mounts > /dev/sda1 / xfs rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0 > ---------- > > ---------- > $ uname -r > 4.18.0-365.el8.x86_64 > $ ./my_write_unlink > Before write(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 2743 17727 14% / > Before close(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 4791 15679 24% / > Before unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 3767 16703 19% / > After unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 2743 17727 14% / > $ grep sda /proc/mounts > /dev/sda1 / xfs rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0 > ---------- > > ---------- > $ uname -r > 3.10.0-1160.59.1.el7.x86_64 > $ ./my_write_unlink > Before write(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 2310 18160 12% / > Before close(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 4358 16112 22% / > Before unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 3334 17136 17% / > After unlink(). > Filesystem 1M-blocks Used Available Use% Mounted on > /dev/sda1 20469 2310 18160 12% / > $ grep sda /proc/mounts > /dev/sda1 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 > ----------