From: <ls...@us...> - 2008-08-25 20:03:19
|
Revision: 4501 http://jnode.svn.sourceforge.net/jnode/?rev=4501&view=rev Author: lsantha Date: 2008-08-25 20:03:09 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Synchronized access to directory entries. Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/jfat/FatDirectory.java trunk/fs/src/fs/org/jnode/fs/jfat/FatTable.java Modified: trunk/fs/src/fs/org/jnode/fs/jfat/FatDirectory.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/FatDirectory.java 2008-08-25 17:59:16 UTC (rev 4500) +++ trunk/fs/src/fs/org/jnode/fs/jfat/FatDirectory.java 2008-08-25 20:03:09 UTC (rev 4501) @@ -129,7 +129,7 @@ f.createNextEntry(); } - public FSEntry getEntry(String name) { + public synchronized FSEntry getEntry(String name) { FatEntry child = children.get(name); if (child == null) { @@ -197,7 +197,7 @@ return true; } - public FSEntry addFile(String name) throws IOException { + public synchronized FSEntry addFile(String name) throws IOException { FatName fatName = new FatName(this, name); if (collide(fatName.getLongName())) throw new IOException("File [" + fatName.getLongName() + "] already exists"); @@ -208,7 +208,7 @@ return children.put(file); } - public FSEntry addDirectory(String name) throws IOException { + public synchronized FSEntry addDirectory(String name) throws IOException { FatFileSystem fs = getFatFileSystem(); FatName fatName = new FatName(this, name); if (collide(fatName.getLongName())) @@ -221,7 +221,7 @@ return children.put(dir); } - public void remove(String name) throws IOException { + public synchronized void remove(String name) throws IOException { FatEntry entry = (FatEntry) getEntry(name); if (entry == null) throw new FileNotFoundException(name); Modified: trunk/fs/src/fs/org/jnode/fs/jfat/FatTable.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/FatTable.java 2008-08-25 17:59:16 UTC (rev 4500) +++ trunk/fs/src/fs/org/jnode/fs/jfat/FatTable.java 2008-08-25 20:03:09 UTC (rev 4501) @@ -4,10 +4,11 @@ package org.jnode.fs.jfat; import java.util.Iterator; -import java.util.Hashtable; +import java.util.HashMap; +import java.util.Map; public class FatTable { - private final Hashtable<FatKey, FatEntry> table = new Hashtable<FatKey, FatEntry>(); + private final Map<FatKey, FatEntry> table = new HashMap<FatKey, FatEntry>(); public FatTable() { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ga...@us...> - 2013-02-21 07:28:33
|
Revision: 5969 http://jnode.svn.sourceforge.net/jnode/?rev=5969&view=rev Author: galatnm Date: 2013-02-21 07:28:22 +0000 (Thu, 21 Feb 2013) Log Message: ----------- FAT16 Support in JFAT (Luke Quinane) Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/jfat/BootSector.java trunk/fs/src/fs/org/jnode/fs/jfat/Fat.java trunk/fs/src/fs/org/jnode/fs/jfat/Fat32.java trunk/fs/src/fs/org/jnode/fs/jfat/FatCache.java trunk/fs/src/fs/org/jnode/fs/jfat/FatFileSystemType.java trunk/fs/src/fs/org/jnode/fs/jfat/FatRootDirectory.java Added Paths: ----------- trunk/fs/src/fs/org/jnode/fs/jfat/Fat16.java Modified: trunk/fs/src/fs/org/jnode/fs/jfat/BootSector.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/BootSector.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/BootSector.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -138,7 +138,11 @@ else FATSz = BPB_FATSz32; - FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors; + if (isFat32()) { + FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors; + } else { + FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz); + } if (BPB_TotSec16 != 0) TotSec = BPB_TotSec16; @@ -305,7 +309,7 @@ dirty = true; } - private String fatType() { + public String fatType() { switch (type) { case IFAT12: return SFAT12; @@ -366,6 +370,10 @@ return BPB_BytsPerSec; } + public int getClusterSize() { + return BPB_SecPerClus * BPB_BytsPerSec; + } + public int getSectorsPerCluster() { return BPB_SecPerClus; } @@ -390,6 +398,10 @@ return FirstDataSector; } + public long getNrRootDirEntries() { + return BPB_RootEntCnt; + } + /** * The Setting methods are writing here. * Modified: trunk/fs/src/fs/org/jnode/fs/jfat/Fat.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/Fat.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/Fat.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -75,11 +75,12 @@ if (bs.isFat32()) { return new Fat32(bs, api); + } else if (bs.isFat16()) { + return new Fat16(bs, api); + } else if (bs.isFat12()) { +// return new Fat12(bs, api); } - /* - * else if ( bs.isFat16() ) return new Fat16 ( bs, api ); else if ( - * bs.isFat12() ) return new Fat12 ( bs, api ); - */ + throw new FileSystemException("FAT not recognized"); } @@ -193,9 +194,7 @@ getBootSector().getFirstDataSector(); } - public final long getClusterPosition(int index) { - return getClusterSector(index) * (long) bs.getBytesPerSector(); - } + public abstract long getClusterPosition(int index); public final int size() { return (int) (bs.getCountOfClusters() + firstCluster()); @@ -225,10 +224,18 @@ return (entry == freeEntry()); } + public long getUInt16(int index) throws IOException { + return cache.getUInt16(index); + } + public long getUInt32(int index) throws IOException { return cache.getUInt32(index); } + public void setInt16(int index, int element) throws IOException { + cache.setInt16(index, element); + } + public void setInt32(int index, int element) throws IOException { cache.setInt32(index, element); } Added: trunk/fs/src/fs/org/jnode/fs/jfat/Fat16.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/Fat16.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/jfat/Fat16.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -0,0 +1,58 @@ +package org.jnode.fs.jfat; + +import java.io.IOException; +import org.jnode.driver.block.BlockDeviceAPI; + +/** + * A FAT implementation for FAT-16. + * + * @author Luke Quinane + */ +public class Fat16 extends Fat { + protected Fat16(BootSector bs, BlockDeviceAPI api) { + super(bs, api); + } + + protected long offset(int index) { + return (long) (2 * index); + } + + public int get(int index) throws IOException { + return (int) getUInt16(index); + } + + public int set(int index, int element) throws IOException { + long old = getUInt16(index); + + setInt16(index, element & 0xFFFF); + + return (int) (old & 0x0000FFFF); + } + + public long getClusterPosition(int index) { + BootSector bootSector = getBootSector(); + + long rootDirectoryOffset = bootSector.getFirstDataSector() * bootSector.getBytesPerSector(); + + if (index == 0) { + return rootDirectoryOffset; + } + + // Need to account for the size of the root directory entry for following clusters + long filesOffset = rootDirectoryOffset + bootSector.getNrRootDirEntries() * 32; + return filesOffset + ((index - firstCluster()) * getClusterSize()); + } + + @Override + public boolean hasNext(int entry) { + return !isEofChain(entry); + } + + public boolean isEofChain(int entry) { + return (entry >= 0xFFF8); + } + + public int eofChain() { + return 0xFFF8; + } +} Modified: trunk/fs/src/fs/org/jnode/fs/jfat/Fat32.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/Fat32.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/Fat32.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -37,6 +37,10 @@ return (long) (4 * index); } + public long getClusterPosition(int index) { + return getClusterSector(index) * (long) getBootSector().getBytesPerSector(); + } + public int get(int index) throws IOException { return (int) (getUInt32(index) & 0x0FFFFFFF); } Modified: trunk/fs/src/fs/org/jnode/fs/jfat/FatCache.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/FatCache.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/FatCache.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -121,6 +121,14 @@ return c; } + private long getUInt16(long offset) throws IOException { + long addr = offset / elementSize; + int ofs = (int) (offset % elementSize); + + byte[] data = get(addr).getData(); + return LittleEndian.getUInt16(data, ofs); + } + private long getUInt32(long offset) throws IOException { long addr = (long) (offset / elementSize); int ofs = (int) (offset % elementSize); @@ -129,6 +137,18 @@ return LittleEndian.getUInt32(data, ofs); } + private void setInt16(long offset, int value) throws IOException { + long addr = offset / elementSize; + int ofs = (int) (offset % elementSize); + + CacheElement c = get(addr); + byte[] data = c.getData(); + + LittleEndian.setInt16(data, ofs, value); + + c.setDirty(); + } + private void setInt32(long offset, int value) throws IOException { long addr = (long) (offset / elementSize); int ofs = (int) (offset % elementSize); @@ -141,10 +161,18 @@ c.setDirty(); } + public long getUInt16(int index) throws IOException { + return getUInt16(fat.position(0, index)); + } + public long getUInt32(int index) throws IOException { return getUInt32(fat.position(0, index)); } + public void setInt16(int index, int element) throws IOException { + setInt16(fat.position(0, index), element); + } + public void setInt32(int index, int element) throws IOException { setInt32(fat.position(0, index), element); } Modified: trunk/fs/src/fs/org/jnode/fs/jfat/FatFileSystemType.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/FatFileSystemType.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/FatFileSystemType.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -59,12 +59,20 @@ } */ - // Only supports FAT-32 for now, don't want any false results - // for FAT-16 or FAT-12. - return (firstSector[66] == 0x29 && + // Check for FAT-32 + if (firstSector[66] == 0x29 && firstSector[82] == 'F' && firstSector[83] == 'A' && - firstSector[84] == 'T'); + firstSector[84] == 'T') + { + return true; + } + + // Check for FAT-16/12 + return (firstSector[38] == 0x29 && + firstSector[54] == 'F' && + firstSector[55] == 'A' && + firstSector[56] == 'T'); } public FatFileSystem create(Device device, boolean readOnly) throws FileSystemException { Modified: trunk/fs/src/fs/org/jnode/fs/jfat/FatRootDirectory.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/jfat/FatRootDirectory.java 2013-02-20 12:01:01 UTC (rev 5968) +++ trunk/fs/src/fs/org/jnode/fs/jfat/FatRootDirectory.java 2013-02-21 07:28:22 UTC (rev 5969) @@ -30,10 +30,8 @@ public FatRootDirectory(FatFileSystem fs) throws IOException { super(fs); Fat fat = getFatFileSystem().getFat(); - if (fat.isFat32()) { + if (fat.isFat32() || fat.isFat16()) { setRoot32((int) getFatFileSystem().getBootSector().getRootDirectoryStartCluster()); - } else if (fat.isFat16()) { - throw new UnsupportedOperationException("Fat16"); } else if (fat.isFat12()) { throw new UnsupportedOperationException("Fat12"); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |