Hi, When I'm trying XIP on ext2, I find that xip does not work on ext2 with latest kernel. Reproduce steps: Compile kernel with following configs: CONFIG_BLK_DEV_XIP=y CONFIG_EXT2_FS_XIP=y And run following commands: # mke2fs -b 4096 /dev/ram0 # mount -t ext2 -o xip /dev/ram0 /mnt/ramdisk/ # dd if=/dev/zero of=/mnt/ramdisk/test1 bs=1M count=16 And it shows: dd: writing `/mnt/ramdisk/test1': No space left on device df also shows /mnt/ramdisk is 100% full. Its default size is 64MB so a 16MB write should only occupy 1/4 capacity. Criminal commit: After git bisect, it points to the following commit: 8e3dffc651cb668e1ff4d8b89cc1c3dde7540d3b Ext2: mark inode dirty after the function dquot_free_block_nodirty is called Particularly, the following code: @@ -1412,9 +1415,11 @@ allocated: *errp = 0; brelse(bitmap_bh); - dquot_free_block_nodirty(inode, *count-num); - mark_inode_dirty(inode); - *count = num; + if (num < *count) { + dquot_free_block_nodirty(inode, *count-num); + mark_inode_dirty(inode); + *count = num; + } return ret_block; Not mark_inode_dirty() is called only when num is less than *count. However, I've seen with the dd command, there is case where num >= *count. Fix: I've verified that the following patch fixes the issue: diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 9f9992b..5446a52 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1406,11 +1406,10 @@ allocated: *errp = 0; brelse(bitmap_bh); - if (num < *count) { + if (num <= *count) dquot_free_block_nodirty(inode, *count-num); - mark_inode_dirty(inode); - *count = num; - } + mark_inode_dirty(inode); + *count = num; return ret_block; io_error: However, I'm not familiar with ext2 source code and cannot tell if this is the correct fix. At least it fixes my issue. Thanks, Andiry -- 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