minix fs corruption fix for 2.4

From: Konstantin Boldyshev
Date: Mon Nov 03 2003 - 08:26:31 EST


Hello,

Enclosed is a simple patch to fix corruption of minix filesystem
when deleting character and block device nodes (special files).
>From what I've found out the bug was introduced somehwere in 2.3
and is present in all 2.4 versions, and I guess also goes into 2.6.
Older 2.0 and 2.2 kernels do not have it - it seems that one who
was rewriting fs code for 2.4 just forgot to add the needed check.

Note that other filesystems that are rarely used nowdays may have
the same bug, especially if they used minix code as a template.


diff -urN linux-2.4.22/fs/minix/itree_common.c linux/fs/minix/itree_common.c
--- linux-2.4.22/fs/minix/itree_common.c Thu Oct 16 11:30:27 2003
+++ linux/fs/minix/itree_common.c Mon Nov 3 12:25:20 2003
@@ -301,6 +301,12 @@
int first_whole;
long iblock;

+ if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
+ S_ISLNK(inode->i_mode)))
+ return;
+ if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
+ return;
+
iblock = (inode->i_size + BLOCK_SIZE-1) >> 10;
block_truncate_page(inode->i_mapping, inode->i_size, get_block);


--
Regards,
Konstantin
diff -urN linux-2.4.22/fs/minix/itree_common.c linux/fs/minix/itree_common.c
--- linux-2.4.22/fs/minix/itree_common.c Thu Oct 16 11:30:27 2003
+++ linux/fs/minix/itree_common.c Mon Nov 3 12:25:20 2003
@@ -301,6 +301,12 @@
int first_whole;
long iblock;

+ if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
+ S_ISLNK(inode->i_mode)))
+ return;
+ if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
+ return;
+
iblock = (inode->i_size + BLOCK_SIZE-1) >> 10;
block_truncate_page(inode->i_mapping, inode->i_size, get_block);