mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
e53454d6de
We need to place query operations in the queue to prevent the case where a client knows of something before the service does. For example if a client creates a PV/VG/LV outside of the dbus API and then immediately tries to lookup and use that resource in the lvm dbus service it should be present. By placing the queries in the work queue any previous refresh operation will complete before we process the query.
71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
# Copyright (C) 2015-2016 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import pyudev
|
|
import threading
|
|
from . import cfg
|
|
from .request import RequestEntry
|
|
from . import utils
|
|
|
|
observer = None
|
|
observer_lock = threading.RLock()
|
|
|
|
|
|
def _udev_event():
|
|
utils.log_debug("Processing udev event")
|
|
cfg.load()
|
|
|
|
|
|
# noinspection PyUnusedLocal
|
|
def filter_event(action, device):
|
|
# Filter for events of interest and add a request object to be processed
|
|
# when appropriate.
|
|
refresh = False
|
|
|
|
if '.ID_FS_TYPE_NEW' in device:
|
|
fs_type_new = device['.ID_FS_TYPE_NEW']
|
|
|
|
if 'LVM' in fs_type_new:
|
|
refresh = True
|
|
elif fs_type_new == '':
|
|
# Check to see if the device was one we knew about
|
|
if 'DEVNAME' in device:
|
|
found = cfg.om.get_object_by_lvm_id(device['DEVNAME'])
|
|
if found:
|
|
refresh = True
|
|
|
|
if 'DM_LV_NAME' in device:
|
|
refresh = True
|
|
|
|
if refresh:
|
|
# Place this on the queue so any other operations will sequence behind it
|
|
r = RequestEntry(
|
|
-1, _udev_event, (), None, None, False)
|
|
cfg.worker_q.put(r)
|
|
|
|
|
|
def add():
|
|
with observer_lock:
|
|
global observer
|
|
context = pyudev.Context()
|
|
monitor = pyudev.Monitor.from_netlink(context)
|
|
monitor.filter_by('block')
|
|
observer = pyudev.MonitorObserver(monitor, filter_event)
|
|
observer.start()
|
|
|
|
|
|
def remove():
|
|
with observer_lock:
|
|
global observer
|
|
if observer:
|
|
observer.stop()
|
|
observer = None
|
|
return True
|
|
return False
|