From: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
To: ltp-list@lists.sourceforge.net
Cc: vasily.isaenko@oracle.com
Subject: Re: [LTP] [PATCH] detach_device: Wait until the kernel frees the loop device
Date: Wed, 10 Jun 2015 11:16:00 +0300 [thread overview]
Message-ID: <5577F240.8000101@oracle.com> (raw)
In-Reply-To: <1433923871-10933-1-git-send-email-stanislav.kholmanskikh@oracle.com>
[-- Attachment #1: Type: text/plain, Size: 1429 bytes --]
On 06/10/2015 11:11 AM, Stanislav Kholmanskikh wrote:
> On systems employing the "lazy loop device removal",
> kernel commit commit a1ecac3b0656a68259927c234e505804d33a7b83
> ("loop: Make explicit loop device destruction lazy"),
> ioctl(LOOP_CLR_FD) may return 0 when the loop device is in use,
> for example by udev.
>
> Therefore, there is a chance that a quick attach/detach may not
> give udev enough time to complete, like this:
>
> open("file.img", O_RDWR) = 4
> ioctl(3, LOOP_SET_FD, 0x4) = 0
> close(3) = 0
> close(4) = 0
> open("/dev/loop0", O_RDONLY) = 3
> ioctl(3, LOOP_CLR_FD, 0) = 0
> close(3) = 0
> open("/dev/loop0", O_RDWR) = 3
> open("file.img", O_RDWR) = 4
> ioctl(3, LOOP_SET_FD, 0x4) = -1 EBUSY (Device or resource busy)
>
> So let's wait until the kernel frees the loop device, i.e.
> when ioctl(LOOP_CLR_FD) starts failing with ENXIO.
>
> Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
I tested it the attached test case (plus you need to remove 'static'
next to attach_device and detach_device).
Without the patch it fails with:
[root@kholmanskikh test]# ./loop_test
loop_test 1 TBROK : tst_device.c:144: ioctl(/dev/loop0,
LOOP_SET_FD, file.img) failed: EBUSY
loop_test 2 TBROK : tst_device.c:144: Remaining cases broken
[-- Attachment #2: loop_test.c --]
[-- Type: text/x-csrc, Size: 592 bytes --]
#include "test.h"
#include "safe_macros.h"
char *TCID = "loop_test";
int TST_TOTAL = 1;
void attach_device(void (*cleanup_fn)(void),
const char *dev, const char *file);
void detach_device(void (*cleanup_fn)(void), const char *dev);
int main(void)
{
int i, fd;
tst_tmpdir();
fd = SAFE_OPEN(NULL, "file.img", O_RDWR | O_CREAT, 0644);
SAFE_FTRUNCATE(NULL, fd, 1024 * 1024UL);
SAFE_CLOSE(NULL, fd);
for (i = 0; i < 1000; i++) {
attach_device(NULL, "/dev/loop0", "file.img");
detach_device(NULL, "/dev/loop0");
}
tst_rmdir();
tst_resm(TPASS, "Finished");
tst_exit();
}
[-- Attachment #3: Type: text/plain, Size: 79 bytes --]
------------------------------------------------------------------------------
[-- Attachment #4: Type: text/plain, Size: 155 bytes --]
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
next parent reply other threads:[~2015-06-10 8:16 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1433923871-10933-1-git-send-email-stanislav.kholmanskikh@oracle.com>
2015-06-10 8:16 ` Stanislav Kholmanskikh [this message]
2015-06-10 10:08 ` [LTP] [PATCH] detach_device: Wait until the kernel frees the loop device Cyril Hrubis
[not found] ` <55780FC7.1090100@oracle.com>
2015-06-10 10:24 ` Cyril Hrubis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5577F240.8000101@oracle.com \
--to=stanislav.kholmanskikh@oracle.com \
--cc=ltp-list@lists.sourceforge.net \
--cc=vasily.isaenko@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.