forked from vitalif/vitastor
Add udev import command
parent
1fe5908899
commit
837407a84c
|
@ -0,0 +1,4 @@
|
||||||
|
SUBSYSTEM=="block", ENV{ID_PART_ENTRY_TYPE}=="e7009fac-a5a1-4d72-af72-53de13059903", \
|
||||||
|
OWNER="vitastor", GROUP="vitastor", \
|
||||||
|
IMPORT{program}="/usr/bin/vitastor-disk udev $devnode", \
|
||||||
|
SYMLINK+="vitastor/$env{VITASTOR_ALIAS}"
|
|
@ -118,6 +118,7 @@ struct disk_tool_t
|
||||||
int resize_rewrite_meta();
|
int resize_rewrite_meta();
|
||||||
int resize_write_new_meta();
|
int resize_write_new_meta();
|
||||||
|
|
||||||
|
int udev_import(std::string device);
|
||||||
int start_osd(std::string device);
|
int start_osd(std::string device);
|
||||||
int stop_osd(std::string device);
|
int stop_osd(std::string device);
|
||||||
json11::Json read_osd_superblock(std::string device);
|
json11::Json read_osd_superblock(std::string device);
|
||||||
|
@ -206,6 +207,15 @@ int main(int argc, char *argv[])
|
||||||
disk_tool_simple_offsets(self.options, self.json);
|
disk_tool_simple_offsets(self.options, self.json);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if (cmd.size() && !strcmp(cmd[0], "udev"))
|
||||||
|
{
|
||||||
|
if (cmd.size() != 2)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Exactly 1 device path argument is required\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return self.udev_import(cmd[1]);
|
||||||
|
}
|
||||||
else if (cmd.size() && !strcmp(cmd[0], "start"))
|
else if (cmd.size() && !strcmp(cmd[0], "start"))
|
||||||
{
|
{
|
||||||
if (cmd.size() == 1)
|
if (cmd.size() == 1)
|
||||||
|
@ -213,13 +223,14 @@ int main(int argc, char *argv[])
|
||||||
fprintf(stderr, "Device path is missing\n");
|
fprintf(stderr, "Device path is missing\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
int res = 0;
|
||||||
for (int i = 1; i < cmd.size(); i++)
|
for (int i = 1; i < cmd.size(); i++)
|
||||||
{
|
{
|
||||||
int r = self.start_osd(cmd[i]);
|
int r = self.start_osd(cmd[i]);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
res = r;
|
||||||
}
|
}
|
||||||
return 0;
|
return res;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1196,9 +1207,77 @@ int disk_tool_t::resize_write_new_meta()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string udev_escape(std::string str)
|
||||||
|
{
|
||||||
|
std::string r;
|
||||||
|
int p = str.find_first_of("\"\' \t\r\n"), prev = 0;
|
||||||
|
if (p == std::string::npos)
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
while (p != std::string::npos)
|
||||||
|
{
|
||||||
|
r += str.substr(prev, p-prev);
|
||||||
|
r += "\\";
|
||||||
|
prev = p;
|
||||||
|
p = str.find_first_of("\"\' \t\r\n", p+1);
|
||||||
|
}
|
||||||
|
r += str.substr(prev);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string realpath_str(std::string path)
|
||||||
|
{
|
||||||
|
char *p = realpath((char*)path.c_str(), NULL);
|
||||||
|
if (!p)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to resolve %s: %s\n", path.c_str(), strerror(errno));
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
std::string rp(p);
|
||||||
|
free(p);
|
||||||
|
return rp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int disk_tool_t::udev_import(std::string device)
|
||||||
|
{
|
||||||
|
json11::Json params = read_osd_superblock(device);
|
||||||
|
if (params.is_null())
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint64_t osd_num = params["osd_num"].uint64_value();
|
||||||
|
if (!osd_num)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "OSD superblock on %s lacks osd_num\n", device.c_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// Identify if it's data, meta or journal device
|
||||||
|
std::string real_device = realpath_str(device);
|
||||||
|
bool has_meta_device = params["meta_device"].string_value() != "" &&
|
||||||
|
params["meta_device"] != params["data_device"];
|
||||||
|
bool has_journal_device = params["journal_device"].string_value() != "" &&
|
||||||
|
params["journal_device"] != (params["meta_device"].string_value() != "" ? params["meta_device"] : params["data_device"]);
|
||||||
|
std::string device_type;
|
||||||
|
if (has_meta_device && real_device == realpath_str(params["meta_device"].string_value()))
|
||||||
|
device_type = "-meta";
|
||||||
|
else if (has_journal_device && real_device == realpath_str(params["journal_device"].string_value()))
|
||||||
|
device_type = "-journal";
|
||||||
|
else
|
||||||
|
device_type = "-data";
|
||||||
|
// Print variables for udev
|
||||||
|
printf("VITASTOR_OSD_NUM=%lu\n", osd_num);
|
||||||
|
printf("VITASTOR_ALIAS=osd%lu%s\n", osd_num, device_type.c_str());
|
||||||
|
printf("VITASTOR_DATA_DEVICE=%s\n", udev_escape(params["data_device"].string_value()).c_str());
|
||||||
|
if (has_meta_device)
|
||||||
|
printf("VITASTOR_META_DEVICE=%s\n", udev_escape(params["meta_device"].string_value()).c_str());
|
||||||
|
if (has_journal_device)
|
||||||
|
printf("VITASTOR_JOURNAL_DEVICE=%s\n", udev_escape(params["journal_device"].string_value()).c_str());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int disk_tool_t::start_osd(std::string device)
|
int disk_tool_t::start_osd(std::string device)
|
||||||
{
|
{
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1216,7 +1295,7 @@ json11::Json disk_tool_t::read_osd_superblock(std::string device)
|
||||||
}
|
}
|
||||||
buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 4096);
|
buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 4096);
|
||||||
r = read_blocking(fd, buf, 4096);
|
r = read_blocking(fd, buf, 4096);
|
||||||
if (r != 0)
|
if (r != 4096)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to read OSD superblock from %s: %s\n", device.c_str(), strerror(errno));
|
fprintf(stderr, "Failed to read OSD superblock from %s: %s\n", device.c_str(), strerror(errno));
|
||||||
goto ex;
|
goto ex;
|
||||||
|
@ -1241,7 +1320,7 @@ json11::Json disk_tool_t::read_osd_superblock(std::string device)
|
||||||
buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, sb_size);
|
buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, sb_size);
|
||||||
lseek64(fd, 0, 0);
|
lseek64(fd, 0, 0);
|
||||||
r = read_blocking(fd, buf, sb_size);
|
r = read_blocking(fd, buf, sb_size);
|
||||||
if (r != 0)
|
if (r != sb_size)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to read OSD superblock from %s: %s\n", device.c_str(), strerror(errno));
|
fprintf(stderr, "Failed to read OSD superblock from %s: %s\n", device.c_str(), strerror(errno));
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
Loading…
Reference in New Issue