[Bug 270632] [ext2fs] files <4096 bytes are corrupted on ext4 filesystems
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 09 Apr 2023 07:23:54 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=270632
--- Comment #10 from Rajeev Pillai <rajeev_v_pillai@yahoo.com> ---
(In reply to Rajeev Pillai from comment #9)
> If you add `O_DIRECT' to the second open(), [...]
As below:
```
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
static bool prompt(char* msg) {
char line[64] = "";
printf("%s", msg);
fflush(stdout);
fgets(line, sizeof line, stdin);
return (line[0] == 'Y' || line[0] == 'y');
}
int main(int argc, char* argv[]) {
const char* const S = "hello world\n";
char* fn;
size_t n;
int fd, flag;
if (argc != 2)
errx(1, "filename required");
fn = argv[1];
if ((fd = open(fn, O_WRONLY|O_CREAT, 0666)) == -1)
err(1, "%s: open failed", fn);
n = strlen(S);
if (write(fd, S, n) != n)
err(1, "%s: write failed", fn);
if (close(fd) == -1)
err(1, "%s: close failed", fn);
prompt("Created file. Enter to continue: ");
flag = O_WRONLY | O_TRUNC;
if (prompt("Re-creating file. Add O_DIRECT (y/n)? "))
flag |= O_DIRECT;
if ((fd = open(fn, flag, 0666)) == -1)
err(1, "%s: open failed", fn);
if (prompt("Re-created file. Do lseek to beginning (y/n)? "))
if (lseek(fd, 0L, SEEK_SET) == -1)
err(1, "%s: lseek failed", fn);
prompt("Truncated file. Enter to continue: ");
if (write(fd, S, n) != n)
err(1, "%s: write failed", fn);
if (prompt("Re-wrote file. fsync (y/n)? "))
if (fsync(fd))
err(1, "fsync failed");
if (close(fd) == -1)
err(1, "%s: close failed", fn);
prompt("Done. Enter to exit: ");
return 0;
}
```
--
You are receiving this mail because:
You are the assignee for the bug.