Revision: 5926 http://jnode.svn.sourceforge.net/jnode/?rev=5926&view=rev Author: galatnm Date: 2012-08-10 07:28:37 +0000 (Fri, 10 Aug 2012) Log Message: ----------- Ext4 code review changes
Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Constants.java trunk/fs/src/fs/org/jnode/fs/ext2/Ext2FileSystem.java trunk/fs/src/fs/org/jnode/fs/ext2/INode.java Added Paths: ----------- trunk/fs/src/fs/org/jnode/fs/ext4/ trunk/fs/src/fs/org/jnode/fs/ext4/Extent.java trunk/fs/src/fs/org/jnode/fs/ext4/ExtentHeader.java trunk/fs/src/fs/org/jnode/fs/ext4/ExtentIndex.java Removed Paths: ------------- trunk/fs/src/fs/org/jnode/fs/ext2/Extent.java trunk/fs/src/fs/org/jnode/fs/ext2/ExtentHeader.java trunk/fs/src/fs/org/jnode/fs/ext2/ExtentIndex.java Modified: trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Constants.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Constants.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Constants.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -94,10 +94,10 @@ public static final long EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER = 0x0001; public static final long EXT2_FEATURE_RO_COMPAT_LARGE_FILE = 0x0002; public static final long EXT2_FEATURE_RO_COMPAT_BTREE_DIR = 0x0004; - public static final long EXT4_FEATURE_ROCOMPAT_HUGE_FILE = 0x0008; - public static final long EXT4_FEATURE_ROCOMPAT_GDT_CSUM = 0x0010; - public static final long EXT4_FEATURE_ROCOMPAT_DIR_NLINK = 0x0020; - public static final long EXT4_FEATURE_ROCOMPAT_EXTRA_ISIZE = 0x0040; + public static final long EXT4_FEATURE_RO_COMPAT_HUGE_FILE = 0x0008; + public static final long EXT4_FEATURE_RO_COMPAT_GDT_CSUM = 0x0010; + public static final long EXT4_FEATURE_RO_COMPAT_DIR_NLINK = 0x0020; + public static final long EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE = 0x0040; // S_FEATURE_INCOMPAT constants public static final long EXT2_FEATURE_INCOMPAT_COMPRESSION = 0x0001; Modified: trunk/fs/src/fs/org/jnode/fs/ext2/Ext2FileSystem.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2FileSystem.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/Ext2FileSystem.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -151,19 +151,19 @@ log.info(getDevice().getId() + " Unsupported filesystem feature (BTREE_DIR) forces readonly mode"); setReadOnly(true); } - if (hasROFeature(Ext2Constants.EXT4_FEATURE_ROCOMPAT_HUGE_FILE)) { + if (hasROFeature(Ext2Constants.EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { log.info(getDevice().getId() + " Unsupported filesystem feature (HUGE_FILE) forces readonly mode"); setReadOnly(true); } - if (hasROFeature(Ext2Constants.EXT4_FEATURE_ROCOMPAT_GDT_CSUM)) { + if (hasROFeature(Ext2Constants.EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) { log.info(getDevice().getId() + " Unsupported filesystem feature (GDT_CSUM) forces readonly mode"); setReadOnly(true); } - if (hasROFeature(Ext2Constants.EXT4_FEATURE_ROCOMPAT_DIR_NLINK)) { + if (hasROFeature(Ext2Constants.EXT4_FEATURE_RO_COMPAT_DIR_NLINK)) { log.info(getDevice().getId() + " Unsupported filesystem feature (DIR_NLINK) forces readonly mode"); setReadOnly(true); } - if (hasROFeature(Ext2Constants.EXT4_FEATURE_ROCOMPAT_EXTRA_ISIZE)) { + if (hasROFeature(Ext2Constants.EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE)) { log.info(getDevice().getId() + " Unsupported filesystem feature (EXTRA_ISIZE) forces readonly mode"); setReadOnly(true); } @@ -348,7 +348,7 @@ * * @return data block nr */ - protected byte[] getBlock(long nr) throws IOException { + public byte[] getBlock(long nr) throws IOException { if (isClosed()) throw new IOException("FS closed (fs instance: " + this + ")"); // log.debug("blockCache size: "+blockCache.size()); Deleted: trunk/fs/src/fs/org/jnode/fs/ext2/Extent.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/Extent.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/Extent.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -1,55 +0,0 @@ -package org.jnode.fs.ext2; - -/** - * An ext4 extent object. - * - * @author Luke Quinane - */ -public class Extent { - /** - * The length of an extent. - */ - public static final int EXTENT_LENGTH = 12; - - /** - * The data for the extent. - */ - private byte[] data; - - /** - * Create an extent object. - * - * @param data the data for the extent. - */ - public Extent(byte[] data) { - this.data = new byte[EXTENT_LENGTH]; - System.arraycopy(data, 0, this.data, 0, EXTENT_LENGTH); - - // Safety check - if (getStartHigh() != 0) { - throw new UnsupportedOperationException("Extents that use the high bits aren't supported yet"); - } - } - - public long getBlockIndex() { - return Ext2Utils.get32(data, 0); - } - - public int getBlockCount() { - return Ext2Utils.get16(data, 4); - } - - public long getStartLow() { - return Ext2Utils.get32(data, 8); - } - - public int getStartHigh() { - return Ext2Utils.get16(data, 6); - } - - @Override - public String toString() { - return String.format("Extent: blockindex:%d count:%d start(low:%d high:%d)", getBlockIndex(), getBlockCount(), - getStartLow(), getStartHigh()); - } -} Deleted: trunk/fs/src/fs/org/jnode/fs/ext2/ExtentHeader.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/ExtentHeader.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/ExtentHeader.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -1,180 +0,0 @@ -package org.jnode.fs.ext2; - -import java.io.IOException; - -/** - * An ext4 extent header. - * - * @author Luke Quinane - */ -public class ExtentHeader { - /** - * The length of an extent header. - */ - public static final int EXTENT_HEADER_LENGTH = 12; - - /** - * The magic number for an extent header. - */ - public static final int MAGIC = 0xf30a; - - /** - * The data for the header. - */ - private byte[] data; - - /** - * The cache copy of the index entries. - */ - private ExtentIndex[] indexEntries; - - /** - * The cache copy of the extent entries. - */ - private Extent[] extentEntries; - - /** - * Create an extent header object. - */ - public ExtentHeader(byte[] data) throws IOException { - this.data = new byte[data.length]; - System.arraycopy(data, 0, this.data, 0, data.length); - - if (getMagic() != ExtentHeader.MAGIC) { - throw new IOException("Extent had the wrong magic: " + getMagic()); - } - } - - public int getMagic() { - return Ext2Utils.get16(data, 0); - } - - public int getEntryCount() { - return Ext2Utils.get16(data, 2); - } - - public int getMaximumEntryCount() { - return Ext2Utils.get16(data, 4); - } - - public int getDepth() { - return Ext2Utils.get16(data, 6); - } - - public ExtentIndex[] getIndexEntries() { - if (getDepth() == 0) { - throw new IllegalStateException("Trying to read index entries from a leaf."); - } - - if (indexEntries == null) { - indexEntries = new ExtentIndex[getEntryCount()]; - int offset = EXTENT_HEADER_LENGTH; - - for (int i = 0; i < getEntryCount(); i++) { - byte[] indexBuffer = new byte[ExtentIndex.EXTENT_INDEX_LENGTH]; - System.arraycopy(data, offset, indexBuffer, 0, indexBuffer.length); - - indexEntries[i] = new ExtentIndex(indexBuffer); - offset += ExtentIndex.EXTENT_INDEX_LENGTH; - } - } - - return indexEntries; - } - - public Extent[] getExtentEntries() { - if (getDepth() != 0) { - throw new IllegalStateException("Trying to read extent entries from a non-leaf."); - } - - if (extentEntries == null) { - extentEntries = new Extent[getEntryCount()]; - int offset = EXTENT_HEADER_LENGTH; - - for (int i = 0; i < getEntryCount(); i++) { - byte[] indexBuffer = new byte[Extent.EXTENT_LENGTH]; - System.arraycopy(data, offset, indexBuffer, 0, indexBuffer.length); - - extentEntries[i] = new Extent(indexBuffer); - offset += Extent.EXTENT_LENGTH; - } - } - - return extentEntries; - } - - public long getBlockNumber(Ext2FileSystem fs, long index) throws IOException { - if (getDepth() > 0) { - ExtentIndex extentIndex = binarySearchIndexes(index, getIndexEntries()); - byte[] indexData = fs.getBlock(extentIndex.getLeafLow()); - - ExtentHeader indexHeader = new ExtentHeader(indexData); - return indexHeader.getBlockNumber(fs, index); - } - else { - Extent extent = binarySearchExtents(index, getExtentEntries()); - return index - extent.getBlockIndex() + extent.getStartLow(); - } - } - - /** - * Performs a binary search in the extent indexes. - * - * @param index the index of the block to match. - * @param indexes the indexes to search in. - * @return the matching index. - */ - private ExtentIndex binarySearchIndexes(long index, ExtentIndex[] indexes) - { - int lowIndex = 0; - int highIndex = indexes.length - 1; - ExtentIndex extentIndex = null; - - while (lowIndex <= highIndex) { - int middle = lowIndex + (highIndex - lowIndex) / 2; - extentIndex = indexes[middle]; - - if (index < extentIndex.getBlockIndex()) { - highIndex = middle - 1; - } - else { - lowIndex = middle + 1; - } - } - - return indexes[Math.max(0, lowIndex - 1)]; - } - - /** - * Performs a binary search in the extents. - * - * @param index the index of the block to match. - * @param extents the extents to search in. - * @return the matching extent. - */ - private Extent binarySearchExtents(long index, Extent[] extents) - { - int lowIndex = 0; - int highIndex = extents.length - 1; - Extent extent = null; - - while (lowIndex <= highIndex) { - int middle = lowIndex + (highIndex - lowIndex) / 2; - extent = extents[middle]; - - if (index < extent.getBlockIndex()) { - highIndex = middle - 1; - } - else { - lowIndex = middle + 1; - } - } - - return extents[Math.max(0, lowIndex - 1)]; - } - - @Override - public String toString() { - return String.format("ExtentHeader: depth:%d entries:%d/%d", getDepth(), getEntryCount(), getMaximumEntryCount()); - } -} Deleted: trunk/fs/src/fs/org/jnode/fs/ext2/ExtentIndex.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/ExtentIndex.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/ExtentIndex.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -1,51 +0,0 @@ -package org.jnode.fs.ext2; - -/** - * An ext4 extent index. - * - * @author Luke Quinane - */ -public class ExtentIndex { - /** - * The length of an extent index. - */ - public static final int EXTENT_INDEX_LENGTH = 12; - - /** - * The data for the index. - */ - private byte[] data; - - /** - * Create an extent index object. - * - * @param data the data for the index. - */ - public ExtentIndex(byte[] data) { - this.data = new byte[EXTENT_INDEX_LENGTH]; - System.arraycopy(data, 0, this.data, 0, EXTENT_INDEX_LENGTH); - - // Safety check - if (getLeafHigh() != 0) { - throw new UnsupportedOperationException("Extent indexes that use the high bits aren't supported yet"); - } - } - - public long getBlockIndex() { - return Ext2Utils.get32(data, 0); - } - - public long getLeafLow() { - return Ext2Utils.get32(data, 4); - } - - public int getLeafHigh() { - return Ext2Utils.get16(data, 8); - } - - @Override - public String toString() { - return String.format("ExtentIndex: blockindex:%d leaf(low:%d high:%d)", getBlockIndex(), getLeafLow(), - getLeafHigh()); - } -} Modified: trunk/fs/src/fs/org/jnode/fs/ext2/INode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/INode.java 2012-08-10 07:26:22 UTC (rev 5925) +++ trunk/fs/src/fs/org/jnode/fs/ext2/INode.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -26,6 +26,7 @@ import org.apache.log4j.Logger; import org.jnode.fs.FileSystemException; import org.jnode.fs.ext2.exception.UnallocatedBlockException; +import org.jnode.fs.ext4.ExtentHeader; /** * This class represents an inode. Once they are allocated, inodes are read and Added: trunk/fs/src/fs/org/jnode/fs/ext4/Extent.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext4/Extent.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/ext4/Extent.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -0,0 +1,57 @@ +package org.jnode.fs.ext4; + +import org.jnode.fs.ext2.Ext2Utils; + +/** + * An ext4 extent object. + * + * @author Luke Quinane + */ +public class Extent { + /** + * The length of an extent. + */ + public static final int EXTENT_LENGTH = 12; + + /** + * The data for the extent. + */ + private byte[] data; + + /** + * Create an extent object. + * + * @param data the data for the extent. + */ + public Extent(byte[] data) { + this.data = new byte[EXTENT_LENGTH]; + System.arraycopy(data, 0, this.data, 0, EXTENT_LENGTH); + + // Safety check + if (getStartHigh() != 0) { + throw new UnsupportedOperationException("Extents that use the high bits aren't supported yet"); + } + } + + public long getBlockIndex() { + return Ext2Utils.get32(data, 0); + } + + public int getBlockCount() { + return Ext2Utils.get16(data, 4); + } + + public long getStartLow() { + return Ext2Utils.get32(data, 8); + } + + public int getStartHigh() { + return Ext2Utils.get16(data, 6); + } + + @Override + public String toString() { + return String.format("Extent: blockindex:%d count:%d start(low:%d high:%d)", getBlockIndex(), getBlockCount(), + getStartLow(), getStartHigh()); + } +} Added: trunk/fs/src/fs/org/jnode/fs/ext4/ExtentHeader.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext4/ExtentHeader.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/ext4/ExtentHeader.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -0,0 +1,182 @@ +package org.jnode.fs.ext4; + +import java.io.IOException; +import org.jnode.fs.ext2.Ext2FileSystem; +import org.jnode.fs.ext2.Ext2Utils; + +/** + * An ext4 extent header. + * + * @author Luke Quinane + */ +public class ExtentHeader { + /** + * The length of an extent header. + */ + public static final int EXTENT_HEADER_LENGTH = 12; + + /** + * The magic number for an extent header. + */ + public static final int MAGIC = 0xf30a; + + /** + * The data for the header. + */ + private final byte[] data; + + /** + * The cache copy of the index entries. + */ + private ExtentIndex[] indexEntries; + + /** + * The cache copy of the extent entries. + */ + private Extent[] extentEntries; + + /** + * Create an extent header object. + */ + public ExtentHeader(byte[] data) throws IOException { + this.data = new byte[data.length]; + System.arraycopy(data, 0, this.data, 0, data.length); + + if (getMagic() != ExtentHeader.MAGIC) { + throw new IOException("Extent had the wrong magic: " + getMagic()); + } + } + + public int getMagic() { + return Ext2Utils.get16(data, 0); + } + + public int getEntryCount() { + return Ext2Utils.get16(data, 2); + } + + public int getMaximumEntryCount() { + return Ext2Utils.get16(data, 4); + } + + public int getDepth() { + return Ext2Utils.get16(data, 6); + } + + public ExtentIndex[] getIndexEntries() { + if (getDepth() == 0) { + throw new IllegalStateException("Trying to read index entries from a leaf."); + } + + if (indexEntries == null) { + indexEntries = new ExtentIndex[getEntryCount()]; + int offset = EXTENT_HEADER_LENGTH; + + for (int i = 0; i < getEntryCount(); i++) { + byte[] indexBuffer = new byte[ExtentIndex.EXTENT_INDEX_LENGTH]; + System.arraycopy(data, offset, indexBuffer, 0, indexBuffer.length); + + indexEntries[i] = new ExtentIndex(indexBuffer); + offset += ExtentIndex.EXTENT_INDEX_LENGTH; + } + } + + return indexEntries; + } + + public Extent[] getExtentEntries() { + if (getDepth() != 0) { + throw new IllegalStateException("Trying to read extent entries from a non-leaf."); + } + + if (extentEntries == null) { + extentEntries = new Extent[getEntryCount()]; + int offset = EXTENT_HEADER_LENGTH; + + for (int i = 0; i < getEntryCount(); i++) { + byte[] indexBuffer = new byte[Extent.EXTENT_LENGTH]; + System.arraycopy(data, offset, indexBuffer, 0, indexBuffer.length); + + extentEntries[i] = new Extent(indexBuffer); + offset += Extent.EXTENT_LENGTH; + } + } + + return extentEntries; + } + + public long getBlockNumber(Ext2FileSystem fs, long index) throws IOException { + if (getDepth() > 0) { + ExtentIndex extentIndex = binarySearchIndexes(index, getIndexEntries()); + byte[] indexData = fs.getBlock(extentIndex.getLeafLow()); + + ExtentHeader indexHeader = new ExtentHeader(indexData); + return indexHeader.getBlockNumber(fs, index); + } + else { + Extent extent = binarySearchExtents(index, getExtentEntries()); + return index - extent.getBlockIndex() + extent.getStartLow(); + } + } + + /** + * Performs a binary search in the extent indexes. + * + * @param index the index of the block to match. + * @param indexes the indexes to search in. + * @return the matching index. + */ + private ExtentIndex binarySearchIndexes(long index, ExtentIndex[] indexes) + { + int lowIndex = 0; + int highIndex = indexes.length - 1; + ExtentIndex extentIndex = null; + + while (lowIndex <= highIndex) { + int middle = lowIndex + (highIndex - lowIndex) / 2; + extentIndex = indexes[middle]; + + if (index < extentIndex.getBlockIndex()) { + highIndex = middle - 1; + } + else { + lowIndex = middle + 1; + } + } + + return indexes[Math.max(0, lowIndex - 1)]; + } + + /** + * Performs a binary search in the extents. + * + * @param index the index of the block to match. + * @param extents the extents to search in. + * @return the matching extent. + */ + private Extent binarySearchExtents(long index, Extent[] extents) + { + int lowIndex = 0; + int highIndex = extents.length - 1; + Extent extent = null; + + while (lowIndex <= highIndex) { + int middle = lowIndex + (highIndex - lowIndex) / 2; + extent = extents[middle]; + + if (index < extent.getBlockIndex()) { + highIndex = middle - 1; + } + else { + lowIndex = middle + 1; + } + } + + return extents[Math.max(0, lowIndex - 1)]; + } + + @Override + public String toString() { + return String.format("ExtentHeader: depth:%d entries:%d/%d", getDepth(), getEntryCount(), getMaximumEntryCount()); + } +} Added: trunk/fs/src/fs/org/jnode/fs/ext4/ExtentIndex.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext4/ExtentIndex.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/ext4/ExtentIndex.java 2012-08-10 07:28:37 UTC (rev 5926) @@ -0,0 +1,53 @@ +package org.jnode.fs.ext4; + +import org.jnode.fs.ext2.Ext2Utils; + +/** + * An ext4 extent index. + * + * @author Luke Quinane + */ +public class ExtentIndex { + /** + * The length of an extent index. + */ + public static final int EXTENT_INDEX_LENGTH = 12; + + /** + * The data for the index. + */ + private final byte[] data; + + /** + * Create an extent index object. + * + * @param data the data for the index. + */ + public ExtentIndex(byte[] data) { + this.data = new byte[EXTENT_INDEX_LENGTH]; + System.arraycopy(data, 0, this.data, 0, EXTENT_INDEX_LENGTH); + + // Safety check + if (getLeafHigh() != 0) { + throw new UnsupportedOperationException("Extent indexes that use the high bits aren't supported yet"); + } + } + + public long getBlockIndex() { + return Ext2Utils.get32(data, 0); + } + + public long getLeafLow() { + return Ext2Utils.get32(data, 4); + } + + public int getLeafHigh() { + return Ext2Utils.get16(data, 8); + } + + @Override + public String toString() { + return String.format("ExtentIndex: blockindex:%d leaf(low:%d high:%d)", getBlockIndex(), getLeafLow(), + getLeafHigh()); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Jnode-svn-commits mailing list Jnode-svn-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits