• Dmitry Monakhov's avatar
    ext4: fix uniniatilized extent splitting error · dbf9d7da
    Dmitry Monakhov authored
    Fix bug reported by Dmitry Monakhov caused by lost error code
    
        Testcase: 
    
        blksize = 0x1000;
        fd = open(argv[1], O_RDWR|O_CREAT, 0700);
        unsigned long long sz = 0x10000000UL;
        /* allocating big blocks chunk */
        syscall(__NR_fallocate, fd, 0, 0UL, sz)
    
        /* grab all other available filesystem space */
        tfd = open("tmp", O_RDWR|O_CREAT|O_DIRECT, 0700);
        while( write(tfd, buf, 4096) > 0); /* loop untill ENOSPC */
        fsync(fd); /* just in case */
        while (pos < sz) {
        	/* each seek+ write operation result in splits uninitialized extent
        	in three extents. Splitting may result in new extent allocation
        	which probably will fail because of ENOSPC*/
    
        	lseek(fd, blksize*2 -1, SEEK_CUR);
        	if ((ret = write(fd, 'a', 1)) != 1)
        		exit(1);
        	pos += blksize * 2;
        }
    Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
    Signed-off-by: default avatarMingming Cao <cmm@us.ibm.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    dbf9d7da
extents.c 69 KB