static void lock_disk(struct fsck_instance *inst) { dev_t disk = fs_get_disk(inst->fs, 1); char *diskname; if (!disk || is_irrotational_disk(disk)) return; diskname = blkid_devno_to_devname(disk); if (!diskname) return; if (verbose) printf(_("Locking disk %s ... "), diskname); inst->lock = open(diskname, O_CLOEXEC | O_RDONLY); if (inst->lock >= 0) { int rc = -1; /* inform users that we're waiting on the lock */ if (verbose && (rc = flock(inst->lock, LOCK_EX | LOCK_NB)) != 0 && errno == EWOULDBLOCK) printf(_("(waiting) ")); if (rc != 0 && flock(inst->lock, LOCK_EX) != 0) { close(inst->lock); /* failed */ inst->lock = -1; } } if (verbose) /* TRANSLATORS: These are followups to "Locking disk...". */ printf("%s.\n", inst->lock >= 0 ? _("succeeded") : _("failed")); free(diskname); return; }
static void lock_disk(struct fsck_instance *inst) { dev_t disk = fs_get_disk(inst->fs, 1); char *diskpath = NULL, *diskname; inst->lock = -1; if (!disk || is_irrotational_disk(disk)) goto done; diskpath = blkid_devno_to_devname(disk); if (!diskpath) goto done; if (access(FSCK_RUNTIME_DIRNAME, F_OK) != 0) { int rc = mkdir(FSCK_RUNTIME_DIRNAME, S_IWUSR| S_IRUSR|S_IRGRP|S_IROTH| S_IXUSR|S_IXGRP|S_IXOTH); if (rc && errno != EEXIST) { warn(_("cannot create directory %s"), FSCK_RUNTIME_DIRNAME); goto done; } } diskname = stripoff_last_component(diskpath); if (!diskname) diskname = diskpath; xasprintf(&inst->lockpath, FSCK_RUNTIME_DIRNAME "/%s.lock", diskname); if (verbose) printf(_("Locking disk by %s ... "), inst->lockpath); inst->lock = open(inst->lockpath, O_RDONLY|O_CREAT|O_CLOEXEC, S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH); if (inst->lock >= 0) { int rc = -1; /* inform users that we're waiting on the lock */ if (verbose && (rc = flock(inst->lock, LOCK_EX | LOCK_NB)) != 0 && errno == EWOULDBLOCK) printf(_("(waiting) ")); if (rc != 0 && flock(inst->lock, LOCK_EX) != 0) { close(inst->lock); /* failed */ inst->lock = -1; } } if (verbose) /* TRANSLATORS: These are followups to "Locking disk...". */ printf("%s.\n", inst->lock >= 0 ? _("succeeded") : _("failed")); done: if (inst->lock < 0) { free(inst->lockpath); inst->lockpath = NULL; } free(diskpath); return; }