Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:lafenghu
device-mapper
lvm-pv-create-link.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File lvm-pv-create-link.diff of Package device-mapper
Index: LVM2.2.02.67/tools/pvremove.c =================================================================== --- LVM2.2.02.67.orig/tools/pvremove.c 2009-12-03 20:18:34.000000000 +0100 +++ LVM2.2.02.67/tools/pvremove.c 2010-09-09 13:51:21.370385527 +0200 @@ -18,6 +18,30 @@ const char _really_wipe[] = "Really WIPE LABELS from physical volume \"%s\" of volume group \"%s\" [y/n]? "; +static const char* pv_remove_symlink(struct cmd_context* cmd, const char* name) +{ + struct physical_volume *pv; + char *pvuuid; + char pvuuid_link[70]; + + if (!(pv = pv_read(cmd, name, NULL, NULL, 0, 0))) { + return NULL; + } + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + unlink(pvuuid_link); //we really don't care if it successed or not. + + free(pvuuid); + return pvuuid; +} + /* * Decide whether it is "safe" to wipe the labels on this device. * 0 indicates we may not. @@ -125,6 +149,8 @@ static int pvremove_single(struct cmd_co log_print("Labels on physical volume \"%s\" successfully wiped", pv_name); + pv_remove_symlink(cmd, pv_name); + ret = ECMD_PROCESSED; error: Index: LVM2.2.02.67/tools/pvchange.c =================================================================== --- LVM2.2.02.67.orig/tools/pvchange.c 2010-05-19 17:34:10.000000000 +0200 +++ LVM2.2.02.67/tools/pvchange.c 2010-09-09 13:51:21.370385527 +0200 @@ -15,6 +15,90 @@ #include "tools.h" +static const char* pv_follow_if_link (const char* path) +{ + int r; + int len = 60; + char *fpath = NULL; + char *npath = NULL; + struct stat st; + + r = lstat(path, &st); + if (r == -1) return NULL; //shouldn't happen + + if (S_ISLNK(st.st_mode)) { + while (1) { + npath = realloc(fpath, sizeof(char)*len); + if (npath == NULL) { + if (fpath != NULL) free(fpath); + return NULL; + } + fpath = npath; + + memset(fpath, 0, sizeof(char)*len); + r = readlink(path, fpath, len); + if (r != -1 && fpath[len-1] == 0) break; + if (r == -1) { + free(fpath); + return NULL; + } else { + len = len * 2; + } + } + } + else { + fpath = strdup(path); + } + return fpath; +} + +static const char* pv_symlink_handle(struct cmd_context* cmd, const char* name, int create) +{ + struct physical_volume *pv; + char *pvuuid; + char *pvuuid_link; + + pvuuid_link = malloc(70); + if (pvuuid_link == NULL) return NULL; + + + if (!(pv = pv_read(cmd, name, NULL, NULL, 0, 0))) { + free(pvuuid_link); + return NULL; + } + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + free(pvuuid_link); + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + + //we really don't care if it successed or not. + if (create) { + const char* tname = NULL; + int r; + tname = pv_follow_if_link(name); + if (tname != NULL) { + r = symlink(tname, pvuuid_link); + free(tname); + } + else { + symlink(name, pvuuid_link); + } + } else { + //pvuuid_link is saved for future unlink + //unlink(pvuuid_link); + } + + free(pvuuid); + return pvuuid_link; +} + + /* FIXME Locking. PVs in VG. */ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg, Index: LVM2.2.02.67/lib/metadata/metadata.c =================================================================== --- LVM2.2.02.67.orig/lib/metadata/metadata.c 2010-05-24 17:32:20.000000000 +0200 +++ LVM2.2.02.67/lib/metadata/metadata.c 2010-09-09 13:52:19.866385579 +0200 @@ -1424,6 +1424,88 @@ void pvcreate_params_set_defaults(struct pp->yes = 0; } +static const char* pv_follow_if_link (const char* path) +{ + int r; + int len = 60; + char *fpath = NULL; + char *npath = NULL; + struct stat st; + + r = lstat(path, &st); + if (r == -1) return NULL; //shouldn't happen + + if (S_ISLNK(st.st_mode)) { + while (1) { + npath = realloc(fpath, sizeof(char)*len); + if (npath == NULL) { + if (fpath != NULL) free(fpath); + return NULL; + } + fpath = npath; + + memset(fpath, 0, sizeof(char)*len); + r = readlink(path, fpath, len); + if (r != -1 && fpath[len-1] == 0) break; + if (r == -1) { + free(fpath); + return NULL; + } else { + len = len * 2; + } + } + } else { + fpath = strdup(path); + } + return fpath; +} + + +static const char* pv_symlink_handle(struct cmd_context* cmd, const char* name, int create) +{ + struct physical_volume *pv; + char *pvuuid; + char *pvuuid_link; + + pvuuid_link = malloc(70); + if (pvuuid_link == NULL) return NULL; + + if (!(pv = pv_read(cmd, name, NULL, NULL, 0, 0))) { + free(pvuuid_link); + return NULL; + } + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + free(pvuuid_link); + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + + //we really don't care if it successed or not. + if (create) { + const char* tname = NULL; + int r; + tname = pv_follow_if_link(name); + if (tname != NULL) { + r = symlink(tname, pvuuid_link); + free(tname); + } else { + symlink(name, pvuuid_link); + } + } else { + //pvuuid_link is saved for future unlink + //unlink(pvuuid_link); + } + + free(pvuuid); + return pvuuid_link; +} + + + /* * pvcreate_single() - initialize a device with PV label and metadata area * @@ -1444,6 +1526,7 @@ struct physical_volume * pvcreate_single struct dm_list mdas; struct pvcreate_params default_pp; char buffer[64] __attribute((aligned(8))); + const char *oldsymlink; pvcreate_params_set_defaults(&default_pp); if (!pp) @@ -1509,11 +1592,20 @@ struct physical_volume * pvcreate_single log_very_verbose("Writing physical volume data to disk \"%s\"", pv_name); + oldsymlink = pv_symlink_handle(cmd, pv_name, 0); + if (!(pv_write(cmd, pv, &mdas, pp->labelsector))) { log_error("Failed to write physical volume \"%s\"", pv_name); + if (oldsymlink) free(oldsymlink); goto error; } + pv_symlink_handle(cmd, pv_name, 1); + if (oldsymlink) { + unlink(oldsymlink); + free(oldsymlink); + } + log_print("Physical volume \"%s\" successfully created", pv_name); return pv;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor