|
From: <fd...@us...> - 2007-04-15 18:11:12
|
Revision: 3158
http://jnode.svn.sourceforge.net/jnode/?rev=3158&view=rev
Author: fduminy
Date: 2007-04-15 11:10:57 -0700 (Sun, 15 Apr 2007)
Log Message:
-----------
update of VMWareDisk
Modified Paths:
--------------
trunk/distr/src/apps/org/jnode/apps/vmware/disk/IOUtils.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/descriptor/DescriptorRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTable.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskCopier.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskFactory.java
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/IOUtils.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/IOUtils.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/IOUtils.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -12,12 +12,15 @@
import java.util.Map;
import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.extent.Access;
+import org.jnode.apps.vmware.disk.extent.ExtentType;
import org.jnode.apps.vmware.disk.handler.ExtentFactory;
import org.jnode.apps.vmware.disk.handler.FileDescriptor;
import org.jnode.apps.vmware.disk.handler.IOHandler;
import org.jnode.apps.vmware.disk.handler.UnsupportedFormatException;
import org.jnode.apps.vmware.disk.handler.simple.SimpleExtentFactory;
import org.jnode.apps.vmware.disk.handler.sparse.SparseExtentFactory;
+import org.jnode.apps.vmware.disk.handler.sparse.SparseExtentHeader;
/**
* Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
@@ -191,6 +194,13 @@
return fileDescriptor;
}
+ public static ExtentDeclaration createExtentDeclaration(File mainFile, String fileName, Access access, long sizeInSectors, ExtentType extentType, long offset)
+ {
+ final File extentFile = IOUtils.getExtentFile(mainFile, fileName);
+ final boolean isMainExtent = extentFile.getName().equals(mainFile.getName());
+ return new ExtentDeclaration(access, sizeInSectors, extentType, fileName, extentFile, offset, isMainExtent);
+ }
+
public static File getExtentFile(File mainFile, String extentFileName) {
String path = mainFile.getParentFile().getAbsolutePath();
return new File(path, extentFileName);
@@ -304,4 +314,8 @@
return false;
}
+
+ public static void computeGrainTableCoverage(SparseExtentHeader header) {
+ header.setGrainTableCoverage(header.getNumGTEsPerGT() * header.getGrainSize());
+ }
}
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/descriptor/DescriptorRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/descriptor/DescriptorRW.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/descriptor/DescriptorRW.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -159,9 +159,7 @@
offset = Long.valueOf(st.nextToken());
}
- final File extentFile = IOUtils.getExtentFile(mainFile, fileName);
- final boolean isMainExtent = extentFile.getName().equals(mainFile.getName());
- return new ExtentDeclaration(access, sizeInSectors, extentType, fileName, extentFile, offset, isMainExtent);
+ return IOUtils.createExtentDeclaration(mainFile, fileName, access, sizeInSectors, extentType, offset);
}
protected Header readHeader(BufferedReader reader) throws IOException, UnsupportedFormatException
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTable.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTable.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTable.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -18,7 +18,6 @@
private final GrainTable[] grainTables;
public AllocationTable(GrainDirectory grainDirectory, GrainTable[] grainTables)
- throws IOException
{
this.grainDirectory = grainDirectory;
this.grainTables = grainTables;
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -1,8 +1,26 @@
package org.jnode.apps.vmware.disk.handler.sparse;
import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.ExtentDeclaration;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.descriptor.AdapterType;
+import org.jnode.apps.vmware.disk.descriptor.CreateType;
+import org.jnode.apps.vmware.disk.descriptor.Descriptor;
+import org.jnode.apps.vmware.disk.descriptor.DiskDatabase;
+import org.jnode.apps.vmware.disk.descriptor.Header;
+import org.jnode.apps.vmware.disk.extent.Access;
+import org.jnode.apps.vmware.disk.extent.Extent;
+import org.jnode.apps.vmware.disk.extent.ExtentType;
import org.jnode.apps.vmware.disk.tools.DiskFactory;
+import org.jnode.driver.bus.ide.IDEConstants;
/**
* Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
@@ -12,9 +30,120 @@
*/
public class SparseDiskFactory extends DiskFactory
{
+ private static final Logger LOG = Logger.getLogger(SparseDiskFactory.class);
+
@Override
- protected boolean createDiskImpl(File mainFile, long size)
+ protected File createDiskImpl(File directory, String name, long size) throws IOException
{
- return true;
+ File mainFile = createMainFile(directory, name, size);
+ return mainFile;
}
+
+ protected File createMainFile(File directory, String name, long size) throws IOException
+ {
+ File mainFile = new File(directory, createDiskFileName(name, 0));
+ RandomAccessFile raf = new RandomAccessFile(mainFile, "rw");
+ FileChannel channel = raf.getChannel();
+
+ Descriptor descriptor = buildDescriptor(mainFile, size);
+ SparseExtentHeader header = new SparseExtentHeader();
+
+
+ return mainFile;
+ }
+
+ protected Descriptor buildDescriptor(File mainFile, long size)
+ {
+ LOG.info("buildDescriptor: wanted size="+size);
+ long sizeInSectors = size / IDEConstants.SECTOR_SIZE;
+ if((size % IDEConstants.SECTOR_SIZE) != 0)
+ {
+ LOG.debug("buildDescriptor: adding 1 more sector to fit size");
+ sizeInSectors ++;
+ }
+
+ // build DiskDatabase
+ DiskDatabase ddb = new DiskDatabase();
+ ddb.setAdapterType(AdapterType.ide);
+ ddb.setSectors(64);
+ ddb.setHeads(32);
+
+ int cylinderCapacity = ddb.getSectors() * ddb.getHeads();
+ int cylinders = (int) (sizeInSectors / cylinderCapacity);
+ if((sizeInSectors % cylinderCapacity) != 0)
+ {
+ LOG.debug("buildDescriptor: adding 1 more cylinder to fit size");
+ cylinders++;
+ }
+ ddb.setCylinders(cylinders);
+
+ int nbSectors = ddb.getCylinders() * ddb.getHeads() * ddb.getSectors();
+ LOG.info("buildDescriptor: allocated size="+(nbSectors * IDEConstants.SECTOR_SIZE));
+
+ // build Header
+ Header header = new Header();
+ header.setVersion("1");
+ header.setContentID(0);
+ header.setParentContentID(Header.CID_NOPARENT);
+ header.setCreateType(CreateType.monolithicSparse);
+ header.setParentFileNameHint("");
+
+ // build extents
+ List<Extent> extents = new ArrayList<Extent>();
+ SparseExtent mainExtent = createMainExtent(mainFile, nbSectors);
+ extents.add(mainExtent);
+
+ Descriptor descriptor = new Descriptor(mainFile, header, extents, ddb);
+ mainExtent.setDescriptor(descriptor);
+ return descriptor;
+ }
+
+ private SparseExtent createMainExtent(File mainFile, int nbSectors)
+ {
+ long offset = 0L; //TODO should be changed ?
+ ExtentDeclaration extentDecl = IOUtils.createExtentDeclaration(mainFile, mainFile.getName(), Access.RW, nbSectors, ExtentType.SPARSE, offset);
+
+ // create extent header
+ SparseExtentHeader sparseHeader = new SparseExtentHeader();
+ sparseHeader.setValidNewLineDetectionTest(true);
+ sparseHeader.setRedundantGrainTableWillBeUsed(false);
+
+ sparseHeader.setGrainSize(16);
+ sparseHeader.setDescriptorOffset(0); //TODO set value
+ sparseHeader.setDescriptorSize(0); //TODO set value
+ sparseHeader.setRgdOffset(0); //TODO set value
+
+ sparseHeader.setNumGTEsPerGT(512);
+ sparseHeader.setGdOffset(0); //TODO set value
+ sparseHeader.setOverHead(0); //TODO set value
+ sparseHeader.setUncleanShutdown(false);
+
+
+ int nbGrains = (int) (nbSectors / sparseHeader.getGrainSize());
+ int modulo = (int) (nbSectors % sparseHeader.getGrainSize());
+ if(modulo != 0)
+ {
+ nbGrains++;
+ nbSectors += (sparseHeader.getGrainSize() - modulo);
+ }
+ sparseHeader.setCapacity(nbSectors);
+
+ IOUtils.computeGrainTableCoverage(sparseHeader);
+
+ // create allocation table
+ int nbEntries = (int) (nbSectors / sparseHeader.getGrainTableCoverage());
+ int[] entries = new int[nbEntries];
+ Arrays.fill(entries, 0);
+ GrainDirectory gd = new GrainDirectory(entries);
+ GrainTable[] gTables = null;
+ AllocationTable allocationTable = new AllocationTable(gd, gTables);
+
+ SparseExtent mainExtent = new SparseExtent(null, extentDecl, sparseHeader, allocationTable, allocationTable);
+ return mainExtent;
+ }
+
+ protected String createDiskFileName(String name, int index)
+ {
+ return name + "-" + index + ".vmdk";
+ }
}
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -106,7 +106,7 @@
}
// additional/computed attributes
- header.setGrainTableCoverage(header.getNumGTEsPerGT() * header.getGrainSize());
+ IOUtils.computeGrainTableCoverage(header);
if(header.getGrainSize() <= 8)
{
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskCopier.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskCopier.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskCopier.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -67,7 +67,7 @@
}
catch(IOException ioe)
{
- ioe.printStackTrace();
+ LOG.error(ioe);
throw ioe;
}
finally
Modified: trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskFactory.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskFactory.java 2007-04-15 18:09:27 UTC (rev 3157)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/tools/DiskFactory.java 2007-04-15 18:10:57 UTC (rev 3158)
@@ -1,6 +1,7 @@
package org.jnode.apps.vmware.disk.tools;
import java.io.File;
+import java.io.IOException;
import org.jnode.apps.vmware.disk.handler.sparse.SparseDiskFactory;
@@ -14,12 +15,12 @@
{
private static final SparseDiskFactory SPARSE_FACTORY = new SparseDiskFactory();
- public static File createSparseDisk(File directory, String name, long size)
+ public static File createSparseDisk(File directory, String name, long size) throws IOException
{
return SPARSE_FACTORY.createDisk(directory, name, size);
}
- public File createDisk(File directory, String name, long size)
+ public File createDisk(File directory, String name, long size) throws IOException
{
if(!directory.isDirectory())
{
@@ -30,13 +31,8 @@
throw new IllegalArgumentException(directory.getAbsolutePath()+" must be writable");
}
- File mainFile = new File(directory, name);
- if(!createDiskImpl(mainFile, size))
- {
- mainFile = null;
- }
- return mainFile;
+ return createDiskImpl(directory, name, size);
}
- abstract protected boolean createDiskImpl(File mainFile, long size);
+ abstract protected File createDiskImpl(File directory, String name, long size) throws IOException;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|