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: [EMAIL PROTECTED]
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;

Reply via email to