fs_mount() and get_file_system() can now both handle file system names
in the form "bfs" and "file_systems/bfs/v1". git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12791 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
58b78e471e
commit
ada5975312
|
@ -493,21 +493,66 @@ put_file_system(file_system_module_info *fs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Tries to open the specified file system module.
|
||||||
|
* Accepts a file system name of the form "bfs" or "file_systems/bfs/v1".
|
||||||
|
* Returns a pointer to file system module interface, or NULL if it
|
||||||
|
* could not open the module.
|
||||||
|
*/
|
||||||
|
|
||||||
static file_system_module_info *
|
static file_system_module_info *
|
||||||
get_file_system(const char *fsName)
|
get_file_system(const char *fsName)
|
||||||
{
|
{
|
||||||
// construct module name (we currently support only one API)
|
|
||||||
char name[B_FILE_NAME_LENGTH];
|
char name[B_FILE_NAME_LENGTH];
|
||||||
|
if (strncmp(fsName, "file_systems/", strlen("file_systems/"))) {
|
||||||
|
// construct module name if we didn't get one
|
||||||
|
// (we currently support only one API)
|
||||||
snprintf(name, sizeof(name), "file_systems/%s/v1", fsName);
|
snprintf(name, sizeof(name), "file_systems/%s/v1", fsName);
|
||||||
|
fsName = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
file_system_module_info *info;
|
file_system_module_info *info;
|
||||||
if (get_module(name, (module_info **)&info) != B_OK)
|
if (get_module(fsName ? fsName : name, (module_info **)&info) != B_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Accepts a file system name of the form "bfs" or "file_systems/bfs/v1"
|
||||||
|
* and returns a compatible fs_info.fsh_name name ("bfs" in both cases).
|
||||||
|
* The name is allocated for you, and you have to free() it when you're
|
||||||
|
* done with it.
|
||||||
|
* Returns NULL if the required memory is no available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_file_system_name(const char *fsName)
|
||||||
|
{
|
||||||
|
const size_t length = strlen("file_systems/");
|
||||||
|
|
||||||
|
if (strncmp(fsName, "file_systems/", length)) {
|
||||||
|
// the name already seems to be the module's file name
|
||||||
|
return strdup(fsName);
|
||||||
|
}
|
||||||
|
|
||||||
|
fsName += length;
|
||||||
|
const char *end = strchr(fsName, '/');
|
||||||
|
if (end == NULL) {
|
||||||
|
// this doesn't seem to be a valid name, but well...
|
||||||
|
return strdup(fsName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// cut off the trailing /v1
|
||||||
|
|
||||||
|
char *name = (char *)malloc(end + 1 - fsName);
|
||||||
|
if (name == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strlcpy(name, fsName, end + 1 - fsName);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vnode_compare(void *_vnode, const void *_key)
|
vnode_compare(void *_vnode, const void *_key)
|
||||||
{
|
{
|
||||||
|
@ -4609,7 +4654,7 @@ fs_mount(char *path, const char *device, const char *fsName, uint32 flags,
|
||||||
|
|
||||||
list_init_etc(&mount->vnodes, offsetof(struct vnode, mount_link));
|
list_init_etc(&mount->vnodes, offsetof(struct vnode, mount_link));
|
||||||
|
|
||||||
mount->fs_name = strdup(fsName);
|
mount->fs_name = get_file_system_name(fsName);
|
||||||
if (mount->fs_name == NULL) {
|
if (mount->fs_name == NULL) {
|
||||||
err = B_NO_MEMORY;
|
err = B_NO_MEMORY;
|
||||||
goto err1;
|
goto err1;
|
||||||
|
@ -5044,14 +5089,14 @@ err:
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
_kern_mount(const char *path, const char *device, const char *fs_name,
|
_kern_mount(const char *path, const char *device, const char *fsName,
|
||||||
uint32 flags, const char *args)
|
uint32 flags, const char *args)
|
||||||
{
|
{
|
||||||
KPath pathBuffer(path, false, B_PATH_NAME_LENGTH + 1);
|
KPath pathBuffer(path, false, B_PATH_NAME_LENGTH + 1);
|
||||||
if (pathBuffer.InitCheck() != B_OK)
|
if (pathBuffer.InitCheck() != B_OK)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
return fs_mount(pathBuffer.LockBuffer(), device, fs_name, flags, args, true);
|
return fs_mount(pathBuffer.LockBuffer(), device, fsName, flags, args, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue