Added volume initialization support.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20900 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
#define _FSSH_FS_INTERFACE_H
|
#define _FSSH_FS_INTERFACE_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "fssh_disk_device_defs.h"
|
||||||
#include "fssh_module.h"
|
#include "fssh_module.h"
|
||||||
#include "fssh_os.h"
|
#include "fssh_os.h"
|
||||||
|
|
||||||
@@ -236,6 +237,52 @@ typedef struct fssh_file_system_module_info {
|
|||||||
struct fssh_dirent *buffer, fssh_size_t bufferSize,
|
struct fssh_dirent *buffer, fssh_size_t bufferSize,
|
||||||
uint32_t *_num);
|
uint32_t *_num);
|
||||||
fssh_status_t (*rewind_query)(fssh_fs_volume fs, fssh_fs_cookie cookie);
|
fssh_status_t (*rewind_query)(fssh_fs_volume fs, fssh_fs_cookie cookie);
|
||||||
|
|
||||||
|
/* capability querying (the device is read locked) */
|
||||||
|
// ToDo: this will probably be combined to a single call
|
||||||
|
bool (*supports_defragmenting)(fssh_partition_data *partition,
|
||||||
|
bool *whileMounted);
|
||||||
|
bool (*supports_repairing)(fssh_partition_data *partition,
|
||||||
|
bool checkOnly, bool *whileMounted);
|
||||||
|
bool (*supports_resizing)(fssh_partition_data *partition,
|
||||||
|
bool *whileMounted);
|
||||||
|
bool (*supports_moving)(fssh_partition_data *partition, bool *isNoOp);
|
||||||
|
bool (*supports_setting_content_name)(fssh_partition_data *partition,
|
||||||
|
bool *whileMounted);
|
||||||
|
bool (*supports_setting_content_parameters)(fssh_partition_data *partition,
|
||||||
|
bool *whileMounted);
|
||||||
|
bool (*supports_initializing)(fssh_partition_data *partition);
|
||||||
|
|
||||||
|
bool (*validate_resize)(fssh_partition_data *partition, fssh_off_t *size);
|
||||||
|
bool (*validate_move)(fssh_partition_data *partition, fssh_off_t *start);
|
||||||
|
bool (*validate_set_content_name)(fssh_partition_data *partition,
|
||||||
|
char *name);
|
||||||
|
bool (*validate_set_content_parameters)(fssh_partition_data *partition,
|
||||||
|
const char *parameters);
|
||||||
|
bool (*validate_initialize)(fssh_partition_data *partition, char *name,
|
||||||
|
const char *parameters);
|
||||||
|
|
||||||
|
/* shadow partition modification (device is write locked) */
|
||||||
|
fssh_status_t (*shadow_changed)(fssh_partition_data *partition,
|
||||||
|
uint32_t operation);
|
||||||
|
|
||||||
|
/* writing (the device is NOT locked) */
|
||||||
|
fssh_status_t (*defragment)(int fd, fssh_partition_id partition,
|
||||||
|
fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*repair)(int fd, fssh_partition_id partition, bool checkOnly,
|
||||||
|
fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*resize)(int fd, fssh_partition_id partition,
|
||||||
|
fssh_off_t size, fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*move)(int fd, fssh_partition_id partition,
|
||||||
|
fssh_off_t offset, fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*set_content_name)(int fd, fssh_partition_id partition,
|
||||||
|
const char *name, fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*set_content_parameters)(int fd, fssh_partition_id partition,
|
||||||
|
const char *parameters, fssh_disk_job_id job);
|
||||||
|
fssh_status_t (*initialize)(const char *partition, const char *name,
|
||||||
|
const char *parameters, fssh_disk_job_id job);
|
||||||
|
// This is pretty close to how the hook in R5 looked. Save the job ID,
|
||||||
|
// of course and that the parameters were given as (void*, size_t) pair.
|
||||||
} fssh_file_system_module_info;
|
} fssh_file_system_module_info;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+29
-11
@@ -1114,10 +1114,17 @@ standard_session(const char* device, const char* fsName, bool interactive)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
initialization_session(const char* device, const char* fsName,
|
initialization_session(const char* device, const char* fsName,
|
||||||
const char* initParameters)
|
const char* volumeName, const char* initParameters)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "initialization not implemented yet\n");
|
fssh_status_t error = _kern_initialize_volume(fsName, device,
|
||||||
return 1;
|
volumeName, initParameters);
|
||||||
|
if (error != FSSH_B_OK) {
|
||||||
|
fprintf(stderr, "Error: Initializing volume failed: %s\n",
|
||||||
|
fssh_strerror(error));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1126,7 +1133,8 @@ print_usage(bool error)
|
|||||||
{
|
{
|
||||||
fprintf((error ? stderr : stdout),
|
fprintf((error ? stderr : stdout),
|
||||||
"Usage: %s [-n] <device>\n"
|
"Usage: %s [-n] <device>\n"
|
||||||
" %s --initialize [-n] <device> [ <init parameters> ]\n",
|
" %s --initialize [-n] <device> <volume name> "
|
||||||
|
"[ <init parameters> ]\n",
|
||||||
sArgv[0], sArgv[0]
|
sArgv[0], sArgv[0]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1156,6 +1164,7 @@ main(int argc, const char* const* argv)
|
|||||||
bool interactive = true;
|
bool interactive = true;
|
||||||
bool initialize = false;
|
bool initialize = false;
|
||||||
const char* device = NULL;
|
const char* device = NULL;
|
||||||
|
const char* volumeName = NULL;
|
||||||
const char* initParameters = NULL;
|
const char* initParameters = NULL;
|
||||||
|
|
||||||
// eat options
|
// eat options
|
||||||
@@ -1178,11 +1187,19 @@ main(int argc, const char* const* argv)
|
|||||||
print_usage_and_exit(true);
|
print_usage_and_exit(true);
|
||||||
device = argv[argi++];
|
device = argv[argi++];
|
||||||
|
|
||||||
// get init parameters
|
// get volume name and init parameters
|
||||||
if (initialize && argi < argc)
|
if (initialize) {
|
||||||
initParameters = argv[argi++];
|
// volume name
|
||||||
|
if (argi >= argc)
|
||||||
|
print_usage_and_exit(true);
|
||||||
|
volumeName = argv[argi++];
|
||||||
|
|
||||||
// if more parameters are excess
|
// (optional) init paramaters
|
||||||
|
if (argi < argc)
|
||||||
|
initParameters = argv[argi++];
|
||||||
|
}
|
||||||
|
|
||||||
|
// more parameters are excess
|
||||||
if (argi < argc)
|
if (argi < argc)
|
||||||
print_usage_and_exit(true);
|
print_usage_and_exit(true);
|
||||||
|
|
||||||
@@ -1205,9 +1222,10 @@ main(int argc, const char* const* argv)
|
|||||||
|
|
||||||
// start the action
|
// start the action
|
||||||
int result;
|
int result;
|
||||||
if (initialize)
|
if (initialize) {
|
||||||
result = initialization_session(device, fsName, initParameters);
|
result = initialization_session(device, fsName, volumeName,
|
||||||
else
|
initParameters);
|
||||||
|
} else
|
||||||
result = standard_session(device, fsName, interactive);
|
result = standard_session(device, fsName, interactive);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ fssh_status_t _kern_remove_index(fssh_dev_t device, const char *name);
|
|||||||
fssh_status_t _kern_getcwd(char *buffer, fssh_size_t size);
|
fssh_status_t _kern_getcwd(char *buffer, fssh_size_t size);
|
||||||
fssh_status_t _kern_setcwd(int fd, const char *path);
|
fssh_status_t _kern_setcwd(int fd, const char *path);
|
||||||
|
|
||||||
|
fssh_status_t _kern_initialize_volume(const char* fileSystem,
|
||||||
|
const char *partition, const char *name,
|
||||||
|
const char *parameters);
|
||||||
|
|
||||||
// defined in fd.cpp
|
// defined in fd.cpp
|
||||||
fssh_ssize_t _kern_read(int fd, fssh_off_t pos, void *buffer,
|
fssh_ssize_t _kern_read(int fd, fssh_off_t pos, void *buffer,
|
||||||
fssh_size_t length);
|
fssh_size_t length);
|
||||||
|
|||||||
@@ -5169,3 +5169,41 @@ _kern_setcwd(int fd, const char *path)
|
|||||||
return set_cwd(fd, path != NULL ? pathBuffer.LockBuffer() : NULL, true);
|
return set_cwd(fd, path != NULL ? pathBuffer.LockBuffer() : NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fssh_status_t
|
||||||
|
_kern_initialize_volume(const char* fsName, const char *partition,
|
||||||
|
const char *name, const char *parameters)
|
||||||
|
{
|
||||||
|
if (!fsName || ! partition)
|
||||||
|
return FSSH_B_BAD_VALUE;
|
||||||
|
|
||||||
|
// The partition argument should point to a real file/device.
|
||||||
|
|
||||||
|
// normalize the device path
|
||||||
|
KPath normalizedDevice;
|
||||||
|
// status = normalizedDevice.SetTo(device, true);
|
||||||
|
// NOTE: normalizing works only in our namespace.
|
||||||
|
fssh_status_t status = normalizedDevice.SetTo(partition, false);
|
||||||
|
if (status != FSSH_B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
partition = normalizedDevice.Path();
|
||||||
|
// correct path to file device
|
||||||
|
|
||||||
|
// get the file system module
|
||||||
|
fssh_file_system_module_info* fsModule = get_file_system(fsName);
|
||||||
|
if (fsModule == NULL)
|
||||||
|
return FSSH_ENODEV;
|
||||||
|
|
||||||
|
// initialize
|
||||||
|
if (fsModule->initialize)
|
||||||
|
status = (*fsModule->initialize)(partition, name, parameters, -1);
|
||||||
|
else
|
||||||
|
status = FSSH_B_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
// put the file system module
|
||||||
|
put_file_system(fsModule);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user