master - raid: reject conversion request to striped/raid0 on 2-legged raid4/5
by Heinz Mauelshagen
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=763db8aab02d7df551a...
Commit: 763db8aab02d7df551a3e8500d261ef6c9651bdb
Parent: b78add3df5bcb40708c71c153ae2e6a8e2c109f2
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Wed Nov 8 17:49:04 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Wed Nov 8 17:49:04 2017 +0100
raid: reject conversion request to striped/raid0 on 2-legged raid4/5
raid4/5 LVs may only be converted to striped or raid0/raid0_meta
in case they have at least 3 legs. 2-legged raid4/5 are a result
of either converting a raid1 to raid4/5 (takeover) or converting
a raid4/5 with more than 2 legs to raid1 with 2 legs (reshape).
The raid4/5 personalities map those as raid1,
thus reject conversion to striped/raid0.
Resolves: rhbz1511047
---
lib/metadata/raid_manip.c | 24 ++++++++++++++++--------
1 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index da00905..816c6d4 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -5163,15 +5163,23 @@ static int _takeover_downconvert_wrapper(TAKEOVER_FN_ARGS)
return 0;
}
- if (seg_is_any_raid5(seg) &&
- segtype_is_raid1(new_segtype)) {
- if (seg->area_count != 2) {
- log_error("Can't convert %s LV %s to %s with != 2 legs.",
- lvseg_name(seg), display_lvname(lv), new_segtype->name);
- return 0;
+ if (seg_is_raid4(seg) || seg_is_any_raid5(seg)) {
+ if (segtype_is_raid1(new_segtype)) {
+ if (seg->area_count != 2) {
+ log_error("Can't convert %s LV %s to %s with != 2 legs.",
+ lvseg_name(seg), display_lvname(lv), new_segtype->name);
+ return 0;
+ }
+ if (seg->area_count != new_image_count) {
+ log_error(INTERNAL_ERROR "Bogus new_image_count converting %s LV %s to %s.",
+ lvseg_name(seg), display_lvname(lv), new_segtype->name);
+ return 0;
+ }
}
- if (seg->area_count != new_image_count) {
- log_error(INTERNAL_ERROR "Bogus new_image_count converting %s LV %s to %s.",
+
+ if ((segtype_is_striped_target(new_segtype) || segtype_is_any_raid0(new_segtype)) &&
+ seg->area_count < 3) {
+ log_error("Can't convert %s LV %s to %s with < 3 legs.",
lvseg_name(seg), display_lvname(lv), new_segtype->name);
return 0;
}
6 years, 5 months
master - tests: allow to proceed futher with test
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=b78add3df5bcb40708c...
Commit: b78add3df5bcb40708c71c153ae2e6a8e2c109f2
Parent: d6473b20183b873d9ea3480e2f34428539ee1fd5
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Nov 8 00:00:06 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Nov 8 00:02:54 2017 +0100
tests: allow to proceed futher with test
So raid doesn't want to create raid arrays with bigger regionsize ATM,
so just use smaller regionsize.
---
test/shell/pvmove-raid-segtypes.sh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/test/shell/pvmove-raid-segtypes.sh b/test/shell/pvmove-raid-segtypes.sh
index 28e3e56..667c7d9 100644
--- a/test/shell/pvmove-raid-segtypes.sh
+++ b/test/shell/pvmove-raid-segtypes.sh
@@ -35,7 +35,7 @@ do
# Testing pvmove of RAID1 LV
lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
-lvcreate -l 2 --type raid1 -m 1 -n $lv1 $vg "$dev1" "$dev2"
+lvcreate --regionsize 16K -l 2 --type raid1 -m 1 -n $lv1 $vg "$dev1" "$dev2"
check lv_tree_on $vg ${lv1}_foo "$dev1"
check lv_tree_on $vg $lv1 "$dev1" "$dev2"
aux mkdev_md5sum $vg $lv1
6 years, 5 months
master - tests: detect racy systemd version
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d6473b20183b873d9ea...
Commit: d6473b20183b873d9ea3480e2f34428539ee1fd5
Parent: 2172115379386b63fca2f31337dcb0e2e92ac4c0
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Nov 7 23:59:04 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Nov 8 00:02:54 2017 +0100
tests: detect racy systemd version
Systemd 222 has a bug - where it's sometimes umount unpredictibly just
mounted device - skip testing when this happens.
---
test/shell/fsadm-renamed.sh | 22 +++++++++++++++-------
1 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/test/shell/fsadm-renamed.sh b/test/shell/fsadm-renamed.sh
index 7f3a9fd..e88846a 100644
--- a/test/shell/fsadm-renamed.sh
+++ b/test/shell/fsadm-renamed.sh
@@ -43,6 +43,17 @@ cleanup_mounted_and_teardown()
aux teardown
}
+check_mounted()
+{
+ mount | tee out
+ grep $vg out || {
+ # older versions of systemd sometimes umount volume by mistake
+ # skip further test when this case happens
+ systemctl --version | grep "systemd 222" && \
+ skip "System is running old racy systemd version."
+ }
+}
+
# Test for block sizes != 1024 (rhbz #480022)
trap 'cleanup_mounted_and_teardown' EXIT
@@ -81,11 +92,10 @@ aux udev_wait
lvrename $vg_lv $vg_lv_ren
-mount | tee out
-grep $vg out
+check_mounted
# fails on renamed LV
-fail lvresize -L+10M -r $vg_lv_ren
+fail lvresize -y -L+10M -r $vg_lv_ren
# fails on unknown mountpoint (FIXME: umount)
not umount "$dev_vg_lv"
@@ -97,15 +107,13 @@ aux udev_wait
mount "$dev_vg_lv" "$mount_dolar_dir"
-mount | tee out
-grep $vg out
+check_mounted
not lvresize -L+10M -r $vg_lv_ren
umount "$mount_dir"
-# FIXME: lvresize CANNOT handle/propagage '--yes' to fsadm
-echo y | lvresize -L+10M -r $vg_lv
+lvresize -y -L+10M -r $vg_lv
aux udev_wait
6 years, 5 months
master - tests: have some space for 2nd mda
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2172115379386b63fca...
Commit: 2172115379386b63fca2f31337dcb0e2e92ac4c0
Parent: f7fc7bc44a6e63f06363e27ca9f3b499d9a39eee
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Nov 7 23:17:52 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Nov 8 00:02:54 2017 +0100
tests: have some space for 2nd mda
pvcreate with 2MDAs needs some extra space.
---
test/api/python_lvm_unit.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/test/api/python_lvm_unit.py b/test/api/python_lvm_unit.py
index 75c370e..3ffb3ad 100755
--- a/test/api/python_lvm_unit.py
+++ b/test/api/python_lvm_unit.py
@@ -902,7 +902,7 @@ class TestLvm(unittest.TestCase):
lvm.pvCreate(d)
def test_pv_create(self):
- size = [0, 1024 * 1024 * 4]
+ size = [0, 1024 * 1024 * 8]
pvmeta_copies = [0, 1, 2]
pvmeta_size = [0, 255, 512, 1024]
data_alignment = [0, 2048, 4096]
6 years, 5 months
master - lvconvert: update delaying message
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f7fc7bc44a6e63f0636...
Commit: f7fc7bc44a6e63f06363e27ca9f3b499d9a39eee
Parent: e822a9f38ddf416378ccc5c09859a39ed9794306
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Nov 7 23:19:17 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Nov 8 00:02:54 2017 +0100
lvconvert: update delaying message
Make more obvious the operation just got delayed
(using same wording as with thin snapshots)
---
tools/lvconvert.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 8480072..eab7e6d 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2057,15 +2057,15 @@ static int _lvconvert_merge_old_snapshot(struct cmd_context *cmd,
*/
if (lv_is_active_locally(origin)) {
if (!lv_check_not_in_use(origin, 0)) {
- log_print_unless_silent("Can't merge until origin volume is closed.");
+ log_print_unless_silent("Delaying merge since origin is open.");
merge_on_activate = 1;
} else if (!lv_check_not_in_use(lv, 0)) {
- log_print_unless_silent("Can't merge until snapshot is closed.");
+ log_print_unless_silent("Delaying merge since snapshot is open.");
merge_on_activate = 1;
}
} else if (vg_is_clustered(origin->vg) && lv_is_active(origin)) {
/* When it's active somewhere else */
- log_print_unless_silent("Can't check whether remotely active snapshot is open.");
+ log_print_unless_silent("Delaying merge since origin is remotely active.");
merge_on_activate = 1;
}
6 years, 5 months
master - tests: snasphot merging
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=e822a9f38ddf416378c...
Commit: e822a9f38ddf416378ccc5c09859a39ed9794306
Parent: 0c9e3e8df25e4c8239945de7ea3629426ffe08bb
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Nov 5 22:59:43 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Nov 7 21:34:35 2017 +0100
tests: snasphot merging
---
test/shell/snapshot-merge.sh | 10 +++++++++-
test/shell/thin-merge.sh | 12 +++++++++---
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/test/shell/snapshot-merge.sh b/test/shell/snapshot-merge.sh
index 9b2d663..9d0a264 100644
--- a/test/shell/snapshot-merge.sh
+++ b/test/shell/snapshot-merge.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-# Copyright (C) 2010-2012 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2010-2017 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
@@ -106,6 +106,14 @@ setup_merge_ $vg $lv1 1
lvconvert --merge "$vg/$(snap_lv_name_ "$lv1")"
lvremove -f $vg/$lv1
+# test merging cannot start on already merging origin
+setup_merge_ $vg $lv1 3
+lvchange -an $vg
+lvs -a $vg
+lvconvert --merge "$vg/$(snap_lv_name_ "$lv1")"
+not lvconvert --merge "$vg/$(snap_lv_name_ "$lv1")_1" 2>&1 | tee err
+grep "Cannot merge snapshot" err
+lvremove -f $vg/$lv1
# test merging multiple snapshots that share the same tag
setup_merge_ $vg $lv1
diff --git a/test/shell/thin-merge.sh b/test/shell/thin-merge.sh
index 1841bf7..3abda40 100644
--- a/test/shell/thin-merge.sh
+++ b/test/shell/thin-merge.sh
@@ -45,9 +45,15 @@ touch mntsnap/test_snap
lvs -o+tags,thin_id $vg
+lvcreate -s -n snap1 $vg/$lv1
+
lvconvert --merge $vg/snap &>out
grep "Merging of thin snapshot $vg/snap will occur on next activation of $vg/${lv1}." out
+# Can't merge another snapshot while "snap" is still being 'merged'.
+not lvconvert --merge $vg/snap1 &>out
+grep "Cannot merge snapshot" out
+
umount mnt
# Merge cannot happen
@@ -111,13 +117,13 @@ check lv_not_exists $vg oldsnapof_${lv1}
lvcreate -s -L10 -n oldsnapof_snap $vg/snap
lvconvert --merge $vg/snap
lvremove -f $vg/oldsnapof_snap
-check lv_field $vg/$lv1 thin_id "3"
+check lv_field $vg/$lv1 thin_id "4"
# Check --mergethin
lvcreate -s -n snap $vg/$lv1
-check lv_field $vg/snap thin_id "4"
+check lv_field $vg/snap thin_id "5"
lvconvert --mergethin $vg/snap &>out
grep "Volume $vg/snap replaced origin $vg/${lv1}." out
-check lv_field $vg/$lv1 thin_id "4"
+check lv_field $vg/$lv1 thin_id "5"
vgremove -ff $vg
6 years, 5 months
master - coverity: add some initilizers
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=0c9e3e8df25e4c82399...
Commit: 0c9e3e8df25e4c8239945de7ea3629426ffe08bb
Parent: 3076a839a507196548b664ac9fd2307d7fbdb47e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Nov 7 20:54:51 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Nov 7 21:26:11 2017 +0100
coverity: add some initilizers
Coverity cannot do a deeper analyzis so let's make just reports
go away and initialize them to 0.
---
daemons/dmeventd/dmeventd.c | 1 +
lib/activate/dev_manager.c | 2 +-
libdm/libdm-report.c | 2 +-
tools/lvconvert.c | 8 ++++----
tools/toollib.c | 6 +++---
5 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
index cc520d3..7ad7f81 100644
--- a/daemons/dmeventd/dmeventd.c
+++ b/daemons/dmeventd/dmeventd.c
@@ -865,6 +865,7 @@ static int _event_wait(struct thread_status *thread)
* This is so that you can break out of waiting on an event,
* either for a timeout event, or to cancel the thread.
*/
+ sigemptyset(&old);
sigemptyset(&set);
sigaddset(&set, SIGALRM);
if (pthread_sigmask(SIG_UNBLOCK, &set, &old) != 0) {
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 9b98c92..29727df 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1787,7 +1787,7 @@ struct pool_cb_data {
static int _pool_callback(struct dm_tree_node *node,
dm_node_callback_t type, void *cb_data)
{
- int ret, status, fd;
+ int ret, status = 0, fd;
const struct dm_config_node *cn;
const struct dm_config_value *cv;
const struct pool_cb_data *data = cb_data;
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 05f5ea0..6d140af 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -2626,7 +2626,7 @@ static const char *_tok_value_string_list(const struct dm_report_field_type *ft,
"for selection field %s.";
struct selection_str_list *ssl = NULL;
struct dm_str_list *item;
- const char *begin_item, *end_item, *tmp;
+ const char *begin_item = NULL, *end_item = NULL, *tmp;
uint32_t op_flags, end_op_flag_expected, end_op_flag_hit = 0;
struct dm_str_list **arr;
size_t list_size;
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 50c77d8..8480072 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1158,10 +1158,10 @@ static int _lvconvert_mirrors(struct cmd_context *cmd,
struct logical_volume *lv,
struct lvconvert_params *lp)
{
- uint32_t old_mimage_count;
- uint32_t old_log_count;
- uint32_t new_mimage_count;
- uint32_t new_log_count;
+ uint32_t old_mimage_count = 0;
+ uint32_t old_log_count = 0;
+ uint32_t new_mimage_count = 0;
+ uint32_t new_log_count = 0;
if ((lp->corelog || lp->mirrorlog) && *lp->type_str && strcmp(lp->type_str, SEG_TYPE_NAME_MIRROR)) {
log_error("--corelog and --mirrorlog are only compatible with mirror devices.");
diff --git a/tools/toollib.c b/tools/toollib.c
index 7eb0bed..3b89568 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -2723,9 +2723,9 @@ static int _check_lv_rules(struct cmd_context *cmd, struct logical_volume *lv)
char buf[64];
struct cmd_rule *rule;
struct lv_type *lvtype = NULL;
- uint64_t lv_props_match_bits, lv_props_unmatch_bits;
- uint64_t lv_types_match_bits, lv_types_unmatch_bits;
- int opts_match_count, opts_unmatch_count;
+ uint64_t lv_props_match_bits = 0, lv_props_unmatch_bits = 0;
+ uint64_t lv_types_match_bits = 0, lv_types_unmatch_bits = 0;
+ int opts_match_count = 0, opts_unmatch_count = 0;
int lvt_enum;
int ret = 1;
int i;
6 years, 5 months
master - cleanup: drop unneeded headerfiles
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=3076a839a507196548b...
Commit: 3076a839a507196548b664ac9fd2307d7fbdb47e
Parent: f7f2f77dcad0d23c84a1146de05217beeb3fbde5
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Nov 5 18:21:16 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Nov 7 21:26:11 2017 +0100
cleanup: drop unneeded headerfiles
Coverity reported these are no longer in use.
---
lib/metadata/metadata.c | 1 -
lib/metadata/pv_manip.c | 4 ----
2 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 2a9819d..b5acf07 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -19,7 +19,6 @@
#include "toolcontext.h"
#include "lvm-string.h"
#include "lvm-file.h"
-#include "lvm-signal.h"
#include "lvmcache.h"
#include "lvmetad.h"
#include "memlock.h"
diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c
index d68561c..e75be76 100644
--- a/lib/metadata/pv_manip.c
+++ b/lib/metadata/pv_manip.c
@@ -19,12 +19,8 @@
#include "toolcontext.h"
#include "locking.h"
#include "defaults.h"
-#include "lvmcache.h"
-#include "lvmetad.h"
#include "display.h"
-#include "label.h"
#include "archiver.h"
-#include "lvm-signal.h"
static struct pv_segment *_alloc_pv_segment(struct dm_pool *mem,
struct physical_volume *pv,
6 years, 5 months
master - cleanup: update messages in lvconvert
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f7f2f77dcad0d23c84a...
Commit: f7f2f77dcad0d23c84a1146de05217beeb3fbde5
Parent: e2fce429cfccf974be93bc939eed6f111738659c
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Nov 5 10:22:31 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Nov 7 21:26:11 2017 +0100
cleanup: update messages in lvconvert
Use display_lvname and update thin snapshot merge error message.
---
tools/lvconvert.c | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 438f34b..50c77d8 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2018,9 +2018,10 @@ static int _lvconvert_merge_old_snapshot(struct cmd_context *cmd,
}
if (lv_is_external_origin(origin_from_cow(lv))) {
- log_error("Cannot merge snapshot \"%s\" into "
- "the read-only external origin \"%s\".",
- lv->name, origin_from_cow(lv)->name);
+ log_error("Cannot merge snapshot %s into "
+ "the read-only external origin %s.",
+ display_lvname(lv),
+ display_lvname(origin_from_cow(lv)));
return 0;
}
@@ -2029,8 +2030,8 @@ static int _lvconvert_merge_old_snapshot(struct cmd_context *cmd,
&& info.exists && info.live_table &&
(!lv_snapshot_percent(lv, &snap_percent) ||
snap_percent == DM_PERCENT_INVALID)) {
- log_error("Unable to merge invalidated snapshot LV \"%s\".",
- lv->name);
+ log_error("Unable to merge invalidated snapshot LV %s.",
+ display_lvname(lv));
return 0;
}
@@ -2119,7 +2120,9 @@ static int _lvconvert_merge_thin_snapshot(struct cmd_context *cmd,
/* Check if merge is possible */
if (lv_is_merging_origin(origin)) {
- log_error("Snapshot %s is already merging into the origin.",
+ log_error("Cannot merge snapshot %s into the origin %s "
+ "with merging snapshot %s.",
+ display_lvname(lv), display_lvname(origin),
display_lvname(find_snapshot(origin)->lv));
return 0;
}
6 years, 5 months
master - cleanup: gcc const warning
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=e2fce429cfccf974be9...
Commit: e2fce429cfccf974be93bc939eed6f111738659c
Parent: d45a9c0f5b2c5c7d5098abc056174fa09f88cc58
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Nov 5 09:20:08 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Nov 7 21:26:11 2017 +0100
cleanup: gcc const warning
---
tools/dmsetup.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index 53097b3..ced0311 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -902,7 +902,7 @@ static int _display_info_cols(struct dm_task *dmt, struct dm_info *info)
if (!dm_report_object_is_selected(_report, &obj, _selection_cmd ? 0 : 1, &selected))
goto_out;
if (_selection_cmd && selected) {
- device_name = dm_task_get_name(dmt);
+ device_name = (char*) dm_task_get_name(dmt);
if (!_selection_cmd->fn(_selection_cmd, NULL, 1, &device_name, NULL, 1))
goto_out;
}
6 years, 5 months