[PATCH 2/2] remove lock file after using it
Heming Zhao <[email protected]> Wed, 14 May 2025 23:04:00 +0800
| Newsgroups | dev.linux.lists.drbd-dev |
|---|---|
| Message-ID | <[email protected]> |
In a SELinux env, if a user runs as root to set up a DRBD device, it will leave a lock file in "/var/run/drbd/lock/". Then HA pacemaker will fail to set up DRBD because of a permission issue. This commit removes the lock file when drbdsetup and drbdmeta close the lock fd. Signed-off-by: Heming Zhao <[email protected]> --- user/shared/drbdmeta.c | 3 +++ user/shared/shared_tool.c | 16 +++++++++++++++- user/shared/shared_tool.h | 2 +- user/v84/drbdsetup.c | 2 +- user/v9/drbdsetup.c | 2 +- 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/user/shared/drbdmeta.c b/user/shared/drbdmeta.c index 099592a530da..c84c09abef86 100644 --- a/user/shared/drbdmeta.c +++ b/user/shared/drbdmeta.c @@ -5482,6 +5482,9 @@ int main(int argc, char **argv) if (minor_attached) fprintf(stderr, "# Output might be stale, since minor %d is attached\n", cfg->minor); + if ((cfg->minor != -1) && (cfg->lock_fd != -1)) + dt_unlock_drbd(cfg->lock_fd, cfg->minor); + // dummy bool normalization to not return negative values, the usual "FIXME sane exit codes" still applies */ return !!rv; /* and if we want an explicit free, diff --git a/user/shared/shared_tool.c b/user/shared/shared_tool.c index 20598132a0ac..f9ed4e7258f8 100644 --- a/user/shared/shared_tool.c +++ b/user/shared/shared_tool.c @@ -793,10 +793,24 @@ int dt_lock_drbd(int minor) } /* ignore errors */ -void dt_unlock_drbd(int lock_fd) +void dt_unlock_drbd(int lock_fd, int minor) { + int sz; + char *lfname; + if (lock_fd >= 0) unlock_fd(lock_fd); + + sz = asprintf(&lfname, "%s/drbd-%d-%d", + drbd_lock_dir(), LANANA_DRBD_MAJOR, minor); + if (sz < 0) { + perror(""); + exit(20); + } + if (unlink(lfname) < 0) { + perror("unlink"); + exit(20); + } } void dt_print_gc(const uint32_t* gen_cnt) diff --git a/user/shared/shared_tool.h b/user/shared/shared_tool.h index 3dedf79683f5..44f10b549a77 100644 --- a/user/shared/shared_tool.h +++ b/user/shared/shared_tool.h @@ -108,7 +108,7 @@ extern bool addr_scope_local(const char *input); extern unsigned long long m_strtoll(const char* s,const char def_unit); extern int only_digits(const char *s); extern int dt_lock_drbd(int minor); -extern void dt_unlock_drbd(int lock_fd); +extern void dt_unlock_drbd(int lock_fd, int minor); extern int dt_minor_of_dev(const char *device); extern void dt_print_gc(const uint32_t* gen_cnt); extern void dt_pretty_print_gc(const uint32_t* gen_cnt); diff --git a/user/v84/drbdsetup.c b/user/v84/drbdsetup.c index 9127a4462a0e..530af7b70b95 100644 --- a/user/v84/drbdsetup.c +++ b/user/v84/drbdsetup.c @@ -3715,7 +3715,7 @@ int main(int argc, char **argv) rv = cmd->function(cmd, argc, argv); if ((context & CTX_MINOR) && !cmd->lockless) - dt_unlock_drbd(lock_fd); + dt_unlock_drbd(lock_fd, minor); return rv; } #endif diff --git a/user/v9/drbdsetup.c b/user/v9/drbdsetup.c index 8aa9b7c48a6a..e7fa4d8bad7b 100644 --- a/user/v9/drbdsetup.c +++ b/user/v9/drbdsetup.c @@ -4779,6 +4779,6 @@ int drbdsetup_main(int argc, char **argv) rv = cmd->function(cmd, argc, argv); if ((context & CTX_MINOR) && !cmd->lockless) - dt_unlock_drbd(lock_fd); + dt_unlock_drbd(lock_fd, minor); return rv; } -- 2.43.0