#include <stdio.h>
#include <errno.h>
#include <string.h>
+#include <unistd.h>
#include <config.h>
#include <lustre_disk.h>
#include <lustre_ver.h>
/* This deals with duplicate ldd_mount_types resolving to same OSD layer
* plugin (e.g. ext3/ldiskfs/ldiskfs2 all being ldiskfs) */
- strlcpy(fsname, mt_type(mount_type), sizeof(fsname));
+ strncpy(fsname, mt_type(mount_type), sizeof(fsname));
name = fsname + sizeof("osd-") - 1;
/* change osd- to osd_ */
}
if (backfs_ops[mount_type] == NULL) {
fatal();
- fprintf(stderr, "unhandled fs type %d '%s'\n",
+ fprintf(stderr, "unhandled/unloaded fs type %d '%s'\n",
mount_type, mt_str(mount_type));
return 0;
}
int osd_init(void)
{
- int i, ret = 0;
+ int i, rc, ret = EINVAL;
for (i = 0; i < LDD_MT_LAST; ++i) {
+ rc = 0;
backfs_ops[i] = load_backfs_module(i);
if (backfs_ops[i] != NULL)
- ret = backfs_ops[i]->init();
- if (ret)
- break;
+ rc = backfs_ops[i]->init();
+ if (rc != 0) {
+ backfs_ops[i]->fini();
+ unload_backfs_module(backfs_ops[i]);
+ backfs_ops[i] = NULL;
+ } else
+ ret = 0;
}
return ret;