← Commit list

4470b74e2

Rob Landley
Rob Landley
2006-08-17
SOURCE BUG Duration: 31s

Subject

The kernel can't handle umount /dev/hdc, we have to do it through mtab, except that we still have to work when there is no mtab.

SOURCE BUG

This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

util-linux/umount.c+14 -8
@@ -78,6 +78,7 @@ int umount_main(int argc, char **argv)
// Loop through everything we're supposed to umount, and do so.
for (;;) {
int curstat;
+ char *zapit = *argv;
// Do we already know what to umount this time through the loop?
if (m) safe_strncpy(path, m->dir, PATH_MAX);
@@ -86,32 +87,37 @@ int umount_main(int argc, char **argv)
// Get next command line argument (and look it up in mtab list)
else if (!argc--) break;
else {
- realpath(*argv++, path);
+ argv++;
+ realpath(zapit, path);
for (m = mtl; m; m = m->next)
if (!strcmp(path, m->dir) || !strcmp(path, m->device))
break;
}
+ // If we couldn't find this sucker in /etc/mtab, punt by passing our
+ // command line argument straight to the umount syscall. Otherwise,
+ // umount the directory even if we were given the block device.
+ if (m) zapit = m->dir;
// Let's ask the thing nicely to unmount.
- curstat = umount(path);
+ curstat = umount(zapit);
// Force the unmount, if necessary.
if (curstat && doForce) {
- curstat = umount2(path, doForce);
+ curstat = umount2(zapit, doForce);
if (curstat)
- bb_error_msg_and_die("forced umount of %s failed!", path);
+ bb_error_msg_and_die("forced umount of %s failed!", zapit);
}
// If still can't umount, maybe remount read-only?
if (curstat && (opt & OPT_REMOUNT) && errno == EBUSY && m) {
- curstat = mount(m->device, path, NULL, MS_REMOUNT|MS_RDONLY, NULL);
+ curstat = mount(m->device, zapit, NULL, MS_REMOUNT|MS_RDONLY, NULL);
bb_error_msg(curstat ? "Cannot remount %s read-only" :
"%s busy - remounted read-only", m->device);
}
if (curstat) {
status = EXIT_FAILURE;
- bb_perror_msg("Couldn't umount %s", path);
+ bb_perror_msg("Couldn't umount %s", zapit);
} else {
/* De-allocate the loop device. This ioctl should be ignored on
* any non-loop block devices. */
@@ -121,9 +127,9 @@ int umount_main(int argc, char **argv)
erase_mtab(m->dir);
}
-
-
// Find next matching mtab entry for -a or umount /dev
+ // Note this means that "umount /dev/blah" will unmount all instances
+ // of /dev/blah, not just the most recent.
while (m && (m = m->next))
if ((opt & OPT_ALL) || !strcmp(path,m->device))
break;