Hey all - So the following testcase will overrun the 1-credit journal reservation made during a delalloc write in ext4_da_write_begin(), because we may cross the 2G threshold, and need to modify both the inode and the superblock in the same transaction. I see a few was to fix this: 1) Always set LARGE_FILE on mount if not set. This will break RW compatiblity with very old kernels. Do we care? 2) Bump the reservation to 2 under the fiddly condition of large file not yet set but this write might do it 3) bump the delalloc reservation to 2 just in case, always I'll be happy to write the patch to fix it, just wondering what people think the best approach is Thoughts? -Eric #!/bin/bash # A 400m fs won't get the large_file feature, oddly # enough, because the resize inode will be < 2G. truncate --size=400m test.img mkfs.ext4 -F test.img # This shouldn't have large_file set, exit if it does for some reason dumpe2fs -h test.img | grep large_file && exit mkdir -p mnt mount -o loop test.img mnt echo "writing 1 byte at 2147483646" dd if=/dev/zero of=mnt/testfile bs=1 seek=2147483646 count=1 conv=notrunc of=mnt/testfile sync # This will make sure i_disksize is on disk, and # that the buffer will be mapped on the next write. # # This is critical because ext4_da_should_update_i_disksize() # checks buffer_mapped(): # # if (!buffer_mapped(bh) || (buffer_delay(bh)) || buffer_unwritten(bh)) # return 0; # return 1; # This tries to update i_disksize, and also requires a superblock # update for the large_file feature flag, but only has 1 credit # available on the delalloc write path echo "writing 1 byte at 2147483647" dd if=/dev/zero of=mnt/testfile bs=1 seek=2147483647 count=1 conv=notrunc of=mnt/testfile # Should go boom, but if not, unmount umount mnt -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html