1 Star 0 Fork 49

yuguorui96/systemd_os

forked from src-anolis-os/systemd 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0905-umount-check-LO_FLAGS_AUTOCLEAR-after-LOOP_CLR_FD-cl.patch 2.42 KB
一键复制 编辑 原始数据 按行查看 历史
From b877c3b06f15a025748b9f09621ddf1bd00cacce Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 20 Dec 2019 17:58:03 +0100
Subject: [PATCH] umount: check LO_FLAGS_AUTOCLEAR after LOOP_CLR_FD claimed
success
Fixes: #14410
Replaces: #14386
---
systemd-239/src/core/umount.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/src/core/umount.c b/src/core/umount.c
index 241fe6f..4400b3c 100644
--- a/src/core/umount.c
+++ b/src/core/umount.c
@@ -334,23 +334,38 @@ static int dm_list_get(MountPoint **head) {
static int delete_loopback(const char *device) {
_cleanup_close_ int fd = -1;
- int r;
+ struct loop_info64 info;
assert(device);
fd = open(device, O_RDONLY|O_CLOEXEC);
if (fd < 0)
return errno == ENOENT ? 0 : -errno;
+
+ if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
+ if (errno == ENXIO) /* Nothing bound, didn't do anything */
+ return 0;
+
+ return -errno;
+ }
- r = ioctl(fd, LOOP_CLR_FD, 0);
- if (r >= 0)
+ if (ioctl(fd, LOOP_GET_STATUS64, &info) < 0) {
+ /* If the LOOP_CLR_FD above succeeded we'll see ENXIO here. */
+ if (errno == ENXIO)
+ log_debug("Successfully detached loopback device %s.", device);
+ else
+ log_debug_errno(errno, "Failed to invoke LOOP_GET_STATUS64 on loopback device %s, ignoring: %m", device); /* the LOOP_CLR_FD at least worked, let's hope for the best */
return 1;
+ }
- /* ENXIO: not bound, so no error */
- if (errno == ENXIO)
- return 0;
+ /* Linux makes LOOP_CLR_FD succeed whenever LO_FLAGS_AUTOCLEAR is set without actually doing
+ * anything. Very confusing. Let's hence not claim we did anything in this case. */
+ if (FLAGS_SET(info.lo_flags, LO_FLAGS_AUTOCLEAR))
+ log_debug("Successfully called LOOP_CLR_FD on a loopback device %s with autoclear set, which is a NOP.", device);
+ else
+ log_debug("Weird, LOOP_CLR_FD succeeded but the device is still attached on %s.", device);
- return -errno;
+ return -EBUSY; /* Nothing changed, the device is still attached, hence it apparently is still busy */;
}
static int delete_dm(dev_t devnum) {
--
2.31.1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/yuguorui96/systemd_os.git
git@gitee.com:yuguorui96/systemd_os.git
yuguorui96
systemd_os
systemd_os
a8

搜索帮助

0d507c66 1850385 C8b1a773 1850385