* Made repairing partitions work theoretically.

* Implemented a small app "checkfs" to check partitions and put it on the image.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28435 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2008-11-01 17:28:10 +00:00
parent c15ed4c682
commit a8e8efef96
4 changed files with 155 additions and 5 deletions

View File

@ -30,9 +30,9 @@ if $(INCLUDE_GPL_ADDONS) = 1 {
GPL_ONLY = "" ;
}
BEOS_BIN = "[" addattr alert arp base64 basename bc beep bootman bzip2 cal cat
catattr chgrp chmod chop chown chroot cksum clear clockconfig cmp comm
compress cp copyattr $(X86_ONLY)CortexAddOnHost
BEOS_BIN = "[" addattr alert arp base64 basename bc beep bootman bzip2
cal cat catattr checkfs chgrp chmod chop chown chroot cksum clear
clockconfig cmp comm compress cp copyattr $(X86_ONLY)CortexAddOnHost
csplit ctags cut date dc dd desklink df diff diff3 dircolors dirname
draggers driveinfo dstcheck du echo eject env error expand expr
expr factor false fdinfo ffm find finddir fmt fold fortune frcode ftp ftpd

View File

@ -75,6 +75,7 @@ StdBinCommands
StdBinCommands
alert.cpp
beep.cpp
checkfs.cpp
clipboard.cpp
df.cpp
dpms.cpp

147
src/bin/checkfs.cpp Normal file
View File

@ -0,0 +1,147 @@
/*
* Copyright 2008, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#include <getopt.h>
#include <stdio.h>
#include <DiskDevice.h>
#include <DiskDeviceRoster.h>
#include <DiskSystem.h>
extern "C" const char* __progname;
static const char* kProgramName = __progname;
void
usage(FILE* output)
{
fprintf(output,
"Usage: %s <options> <device> <volume name>\n"
"\n"
"Options:\n"
" -h, --help - print this help text\n"
" -c, --check-only - do not make any changes to the file system\n",
kProgramName);
}
int
main(int argc, char** argv)
{
const struct option kLongOptions[] = {
{ "help", 0, NULL, 'h' },
{ "check-only", 0, NULL, 'c' },
{ NULL, 0, NULL, 0 }
};
const char* kShortOptions = "hc";
// parse argument list
bool checkOnly = false;
while (true) {
int nextOption = getopt_long(argc, argv, kShortOptions, kLongOptions,
NULL);
if (nextOption == -1)
break;
switch (nextOption) {
case 'h': // --help
usage(stdout);
return 0;
case 'c': // --check-only
checkOnly = true;
break;
case -1: // done with options
break;
default: // everything else
usage(stderr);
return 1;
}
}
// the device name should be the only non-option element
if (optind != argc - 1) {
usage(stderr);
return 1;
}
const char* path = argv[optind];
//UnregisterFileDevice unregisterFileDevice;
BDiskDeviceRoster roster;
BPartition* partition;
BDiskDevice device;
status_t status = roster.GetPartitionForPath(path, &device,
&partition);
if (status != B_OK) {
if (strncmp(path, "/dev", 4)) {
// try mounted volume
status = roster.FindPartitionByMountPoint(path, &device, &partition)
? B_OK : B_BAD_VALUE;
}
// TODO: try to register file device
if (status != B_OK) {
fprintf(stderr, "%s: Failed to get disk device for path \"%s\": "
"%s\n", kProgramName, path, strerror(status));
return 1;
}
}
// Prepare the device for modifications
status = device.PrepareModifications();
if (status != B_OK) {
fprintf(stderr, "%s: Could not prepare the device for modifications: "
"%s\n", kProgramName, strerror(status));
return false;
}
// Check if the partition supports repairing
bool canRepairWhileMounted;
bool canRepair = partition->CanRepair(checkOnly, &canRepairWhileMounted);
if (!canRepair && !canRepairWhileMounted) {
fprintf(stderr, "%s: The disk system does not support repairing.\n",
kProgramName);
return 1;
}
if (partition->IsMounted() && !canRepairWhileMounted) {
fprintf(stderr, "%s: The disk system does not support repairing a "
"mounted volume.\n", kProgramName);
return 1;
}
if (!partition->IsMounted() && !canRepair) {
fprintf(stderr, "%s: The disk system does not support repairing a "
"volume that is not mounted.\n", kProgramName);
return 1;
}
BDiskSystem diskSystem;
status = partition->GetDiskSystem(&diskSystem);
if (status != B_OK) {
fprintf(stderr, "%s: Failed to get disk system for partition: %s\n",
kProgramName, strerror(status));
return 1;
}
// Repair the volume
status = partition->Repair(checkOnly);
if (status != B_OK) {
fprintf(stderr, "%s: Repairing failed: %s\n", kProgramName,
strerror(status));
return 1;
}
status = device.CommitModifications();
return 0;
}

View File

@ -163,8 +163,10 @@ BPartition::Delegate::Defragment()
status_t
BPartition::Delegate::Repair(bool checkOnly)
{
// TODO: Implement!
return B_BAD_VALUE;
if (fPartitionHandle == NULL)
return B_NO_INIT;
return fPartitionHandle->Repair(checkOnly);
}