Fixed several bugs during the mount process:

- DeviceOpener::GetSize() didn't work correctly for devices - the size returned
  was the block count. Also, it didn't expand the computation to 64 bits
- the check if the disk size was large enough make use of BlockShift() which
  access the fBlockShift variable which wasn't initialized at that point
- if new_vnode() failed, a wrong error code was returned
- it will now write a different error message if the root node creation
  failed before new_vnode() was called.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7841 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-06-08 06:30:37 +00:00
parent ebb6a50a53
commit 972f12eeb4
+17 -12
View File
@@ -133,8 +133,10 @@ DeviceOpener::GetSize(off_t *_size, uint32 *_blockSize)
return B_OK; return B_OK;
} }
if (_size) if (_size) {
*_size = geometry.head_count * geometry.cylinder_count * geometry.sectors_per_track; *_size = 1LL * geometry.head_count * geometry.cylinder_count
* geometry.sectors_per_track * geometry.bytes_per_sector;
}
if (_blockSize) if (_blockSize)
*_blockSize = geometry.bytes_per_sector; *_blockSize = geometry.bytes_per_sector;
@@ -326,6 +328,11 @@ Volume::Mount(const char *deviceName, uint32 flags)
return B_BAD_VALUE; return B_BAD_VALUE;
} }
// initialize short hands to the super block (to save byte swapping)
fBlockSize = fSuperBlock.BlockSize();
fBlockShift = fSuperBlock.BlockShift();
fAllocationGroupShift = fSuperBlock.AllocationGroupShift();
// check if the device size is large enough to hold the file system // check if the device size is large enough to hold the file system
off_t diskSize; off_t diskSize;
if (opener.GetSize(&diskSize) < B_OK) if (opener.GetSize(&diskSize) < B_OK)
@@ -337,11 +344,6 @@ Volume::Mount(const char *deviceName, uint32 flags)
fLogStart = fSuperBlock.LogStart(); fLogStart = fSuperBlock.LogStart();
fLogEnd = fSuperBlock.LogEnd(); fLogEnd = fSuperBlock.LogEnd();
// initialize short hands to the super block (to save byte swapping)
fBlockSize = fSuperBlock.BlockSize();
fBlockShift = fSuperBlock.BlockShift();
fAllocationGroupShift = fSuperBlock.AllocationGroupShift();
if (opener.InitCache(NumBlocks()) != B_OK) if (opener.InitCache(NumBlocks()) != B_OK)
return B_ERROR; return B_ERROR;
@@ -356,7 +358,8 @@ Volume::Mount(const char *deviceName, uint32 flags)
fRootNode = new Inode(this, ToVnode(Root())); fRootNode = new Inode(this, ToVnode(Root()));
if (fRootNode && fRootNode->InitCheck() == B_OK) { if (fRootNode && fRootNode->InitCheck() == B_OK) {
if (new_vnode(fID, ToVnode(Root()), (void *)fRootNode) == B_OK) { status = new_vnode(fID, ToVnode(Root()), (void *)fRootNode);
if (status == B_OK) {
// try to get indices root dir // try to get indices root dir
// question: why doesn't get_vnode() work here?? // question: why doesn't get_vnode() work here??
@@ -385,11 +388,13 @@ Volume::Mount(const char *deviceName, uint32 flags)
opener.Keep(); opener.Keep();
return B_OK; return B_OK;
} else } else
status = B_NO_MEMORY; FATAL(("could not create root node: new_vnode() failed!\n"));
} else
status = B_BAD_VALUE;
FATAL(("could not create root node: new_vnode() failed!\n")); delete fRootNode;
} else {
status = B_BAD_VALUE;
FATAL(("could not create root node!\n"));
}
return status; return status;
} }