Messages in this thread | | | Subject | [CHECKER] ext3 bug in ftruncate() with O_SYNC? | From | Ben Pfaff <> | Date | Sun, 20 Mar 2005 21:46:16 -0800 |
| |
Hi. We're doing some checking on Linux file systems and found what appears to be a bug in the Linux 2.6.11 implementation of ext3: when ftruncate shrinks a file, using a file descriptor opened with O_SYNC, the file size is not updated synchronously. I've appended a test program that illustrates the problem. After this program runs, the file system shows a file with length 1031, not 4 as would be expected if the ftruncate completed synchronously. (If I insert an fsync before closing the file, the file length is correct.)
Does this look like a bug to you guys?
Thanks,
Ben.
----------------------------------------------------------------------
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <assert.h>
#define CHECK(ret) if(ret < 0) {perror(0); assert(0);}
int systemf(const char *fmt, ...) { static char cmd[1024];
va_list ap; va_start(ap, fmt); vsprintf(cmd, fmt, ap); va_end(ap); fprintf(stderr, "running cmd \"%s\"\n", cmd); return system(cmd); }
main(int argc, char *argv[]) { int ret, fd; systemf("umount /dev/sbd0"); systemf("sbin/mkfs.ext3 -F -j -b 1024 /dev/sbd0 2048"); systemf("sbin/e2fsck.shared -y /dev/sbd0"); systemf("mount -t ext3 /dev/sbd0 /mnt/sbd0 -o commit=65535"); systemf("umount /dev/sbd0"); systemf("mount -t ext3 /dev/sbd0 /mnt/sbd0 -o commit=65535"); fd = open("/mnt/sbd0/0001", O_CREAT | O_RDWR | O_SYNC, 0700); CHECK(fd); ret = write(fd, "foobar", 6); CHECK(ret); ret = ftruncate(fd, 1031); CHECK(ret); ret = pwrite(fd, "bazzle", 6, 1031 - 6); CHECK(ret); ret = ftruncate(fd, 4); CHECK(ret); ret = close(fd); CHECK(ret);
#if 0 { #include "../sbd/sbd.h" int sbd_fd = open("/dev/sbd0", O_RDONLY); ret = ioctl(sbd_fd, SBD_COPY_DISK, 1); CHECK(ret); close(sbd_fd); } #else systemf("reboot -f -n"); #endif return 0; }
-- Ben Pfaff email: blp@cs.stanford.edu web: http://benpfaff.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |