Skip to content

Commit 0c8d6c6

Browse files
Merge pull request #1173 from vojtechtrefny/master_loop-setup-fail-clear
loop: Remove the loop device when setting sector size fails
2 parents ebb3e9f + 302002e commit 0c8d6c6

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

src/plugins/loop.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,9 @@ gboolean bd_loop_setup_from_fd (gint fd, guint64 offset, guint64 size, gboolean
372372
if (status != 0) {
373373
g_set_error (&l_error, BD_LOOP_ERROR, BD_LOOP_ERROR_FAIL,
374374
"Failed to set status for the %s device: %m", loop_device);
375+
if (ioctl (loop_fd, LOOP_CLR_FD) < 0)
376+
bd_utils_log_format (BD_UTILS_LOG_WARNING,
377+
"Failed to clear the %s device: %m", loop_device);
375378
g_free (loop_device);
376379
close (loop_fd);
377380
bd_utils_report_finished (progress_id, l_error->message);
@@ -391,6 +394,9 @@ gboolean bd_loop_setup_from_fd (gint fd, guint64 offset, guint64 size, gboolean
391394
if (status != 0) {
392395
g_set_error (&l_error, BD_LOOP_ERROR, BD_LOOP_ERROR_FAIL,
393396
"Failed to set sector size for the %s device: %m", loop_device);
397+
if (ioctl (loop_fd, LOOP_CLR_FD) < 0)
398+
bd_utils_log_format (BD_UTILS_LOG_WARNING,
399+
"Failed to clear the %s device: %m", loop_device);
394400
g_free (loop_device);
395401
close (loop_fd);
396402
bd_utils_report_finished (progress_id, l_error->message);

tests/loop_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import time
23
import unittest
34
import overrides_hack
45

@@ -142,6 +143,17 @@ def test_loop_setup_sector_size(self):
142143
with open("/sys/block/%s/queue/logical_block_size" % self.loop, "r") as f:
143144
self.assertEqual(f.read().strip(), "4096")
144145

146+
succ = BlockDev.loop_teardown(self.loop)
147+
self.assertTrue(succ)
148+
149+
# invalid sector size -- setup should fail, make sure we also removed the loop device after
150+
with self.assertRaisesRegex(GLib.GError, "Failed to set sector size"):
151+
BlockDev.loop_setup(self.dev_file, sector_size=7)
152+
153+
time.sleep(2)
154+
loop_name = BlockDev.loop_get_loop_name(self.dev_file)
155+
self.assertIsNone(loop_name)
156+
145157

146158
class LoopTestSetupPartprobe(LoopTestCase):
147159
def test_loop_setup_partprobe(self):

0 commit comments

Comments
 (0)