1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

lvmdbusd: Allow PV devices to be referenced by symlink(s)

See: https://bugzilla.redhat.com/show_bug.cgi?id=1318754

Signed-off-by: Tony Asleson <tasleson@redhat.com>
This commit is contained in:
Tony Asleson 2016-03-21 17:19:38 -05:00
parent 86e9d12b6f
commit a0c7875c54
2 changed files with 29 additions and 8 deletions

View File

@ -12,6 +12,7 @@
from collections import OrderedDict
import pprint as prettyprint
import os
try:
from . import cmdhandler
@ -309,6 +310,11 @@ class DataStore(object):
else:
rc = []
for s in pv_name:
# Ths user could be using a symlink instead of the actual
# block device, make sure we are using actual block device file
# if the pv name isn't in the lookup
if s not in self.pv_path_to_uuid:
s = os.path.realpath(s)
rc.append(self.pvs[self.pv_path_to_uuid[s]])
return rc

View File

@ -11,6 +11,7 @@ import sys
import threading
import traceback
import dbus
import os
from . import cfg
from .utils import log_debug
from .automatedproperties import AutomatedProperties
@ -184,13 +185,13 @@ class ObjectManager(AutomatedProperties):
return self.get_object_by_path(self._id_to_object_path[lvm_id])
return None
def _uuid_verify(self, path, lvm_id, uuid):
def _uuid_verify(self, path, uuid, lvm_id):
"""
Ensure uuid is present for a successful lvm_id lookup
NOTE: Internal call, assumes under object manager lock
:param path: Path to object we looked up
:param lvm_id: lvm_id used to find object
:param uuid: lvm uuid to verify
:param lvm_id: lvm_id used to find object
:return: None
"""
# This gets called when we found an object based on lvm_id, ensure
@ -200,6 +201,17 @@ class ObjectManager(AutomatedProperties):
obj = self.get_object_by_path(path)
self._lookup_add(obj, path, lvm_id, uuid)
def _return_lookup(self, uuid, lvm_identifier):
"""
We found an identifier, so lets return the path to the found object
:param uuid: The lvm uuid
:param lvm_identifier: The lvm_id used to find object
:return:
"""
path = self._id_to_object_path[lvm_identifier]
self._uuid_verify(path, uuid, lvm_identifier)
return path
def get_object_path_by_lvm_id(self, uuid, lvm_id, path_create=None,
gen_new=True):
"""
@ -221,16 +233,19 @@ class ObjectManager(AutomatedProperties):
path = None
if lvm_id in self._id_to_object_path:
path = self._id_to_object_path[lvm_id]
self._uuid_verify(path, lvm_id, uuid)
return path
self._return_lookup(uuid, lvm_id)
if "/" in lvm_id:
vg, lv = lvm_id.split("/", 1)
int_lvm_id = vg + "/" + ("[%s]" % lv)
if int_lvm_id in self._id_to_object_path:
path = self._id_to_object_path[int_lvm_id]
self._uuid_verify(path, int_lvm_id, uuid)
return path
self._return_lookup(uuid, int_lvm_id)
elif lvm_id.startswith('/'):
# We could have a pv device path lookup that failed,
# lets try canonical form and try again.
canonical = os.path.realpath(lvm_id)
if canonical in self._id_to_object_path:
self._return_lookup(uuid, canonical)
if uuid and uuid in self._id_to_object_path:
# If we get here it indicates that we found the object, but