RE: [PTACH] wrong stat of NTFS volume in linux-kernel 2.4.0

From: Anton Altaparmakov (aia21@cus.cam.ac.uk)
Date: Mon Jan 08 2001 - 06:20:26 EST


Willem,

First of all thanks for tracking down this bug! Keep up the good work.

I have produced a IMHO more elegant solution (see attached patch) which
doesn't require introducing the ugly divide function by using the
asm/bitops.h::ffs() function and then replacing all clusterfactor
arithmetic with shifts by the (new) clusterfactorbits. In fact the
clusterfactor is completely replaced by the clusterfactorbits in the
driver.

The patch has been submitted to Alan for inclusion in the 2.4.0-ac series
as Linus at present only accepts critical patches which this clearly is
not.

btw. Patch is tested and works fine.

Best regards,

        Anton Altaparmakov

-- 
Anton Altaparmakov       Phone: +44-(0)1223-333541 (lab)
Christ's College         eMail: AntonA@bigfoot.com
Cambridge CB2 3BU          WWW: http://www-stu.christs.cam.ac.uk/~aia21/
United Kingdom             ICQ: 8561279

--- linux/fs/ntfs/super.old Mon Jan 8 09:08:10 2001 +++ linux/fs/ntfs/super.c Mon Jan 8 02:36:33 2001 @@ -12,6 +12,7 @@ #include "super.h" #include <linux/errno.h> +#include <asm/bitops.h> #include "macros.h" #include "inode.h" #include "support.h" @@ -75,7 +76,7 @@ /* Sector size */ vol->blocksize=NTFS_GETU16(boot+0xB); - vol->clusterfactor=NTFS_GETU8(boot+0xD); + vol->clusterfactorbits = ffs(NTFS_GETU8(boot+0xD)) - 1; vol->mft_clusters_per_record=NTFS_GETS8(boot+0x40); vol->index_clusters_per_record=NTFS_GETS8(boot+0x44); @@ -95,7 +96,7 @@ if(vol->mft_clusters_per_record<0 && vol->mft_clusters_per_record!=-10) ntfs_error("Unexpected data #4 in boot block\n"); - vol->clustersize=vol->blocksize*vol->clusterfactor; + vol->clustersize = vol->blocksize << vol->clusterfactorbits; if(vol->mft_clusters_per_record>0) vol->mft_recordsize= vol->clustersize*vol->mft_clusters_per_record; @@ -322,7 +323,7 @@ io.do_read=1; io.size=vol->clustersize; ntfs_getput_clusters(vol,0,0,&io); - *vol_size = NTFS_GETU64(cluster0+0x28); + *vol_size = NTFS_GETU64(cluster0+0x28) >> vol->clusterfactorbits; ntfs_free(cluster0); return 0; } --- linux/fs/ntfs/struct.old Mon Jan 8 02:37:18 2001 +++ linux/fs/ntfs/struct.h Mon Jan 8 02:35:15 2001 @@ -54,7 +54,7 @@ ntfs_u32 at_symlink; /* aka SYMBOLIC_LINK or REPARSE_POINT */ /* Data read from the boot file */ int blocksize; - int clusterfactor; + int clusterfactorbits; int clustersize; int mft_recordsize; int mft_clusters_per_record; --- linux/include/linux/ntfs_fs_sb.old Mon Jan 8 02:37:46 2001 +++ linux/include/linux/ntfs_fs_sb.h Mon Jan 8 02:37:54 2001 @@ -26,7 +26,7 @@ ntfs_u32 at_symlink; /* aka SYMBOLIC_LINK or REPARSE_POINT */ /* Data read from the boot file */ int blocksize; - int clusterfactor; + int clusterfactorbits; int clustersize; int mft_recordsize; int mft_clusters_per_record; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jan 15 2001 - 21:00:16 EST