/* * Returns: 0 = success, < 0 error, 1 not found */ int loopcxt_find_by_backing_file(struct loopdev_cxt *lc, const char *filename, uint64_t offset, int flags) { int rc, hasst; struct stat st; if (!filename) return -EINVAL; hasst = !stat(filename, &st); rc = loopcxt_init_iterator(lc, LOOPITER_FL_USED); if (rc) return rc; while ((rc = loopcxt_next(lc)) == 0) { if (loopcxt_is_used(lc, hasst ? &st : NULL, filename, offset, flags)) break; } loopcxt_deinit_iterator(lc); return rc; }
/* * Returns: TRUE/FALSE */ int loopdev_is_used(const char *device, const char *filename, uint64_t offset, int flags) { struct loopdev_cxt lc; struct stat st; int rc = 0; if (!device || !filename) return 0; loopcxt_init(&lc, 0); loopcxt_set_device(&lc, device); rc = !stat(filename, &st); rc = loopcxt_is_used(&lc, rc ? &st : NULL, filename, offset, flags); loopcxt_deinit(&lc); return rc; }
static int show_all_loops(struct loopdev_cxt *lc, const char *file, uint64_t offset, int flags) { struct stat sbuf, *st = &sbuf; if (loopcxt_init_iterator(lc, LOOPITER_FL_USED)) return -1; if (!file || stat(file, st)) st = NULL; while (loopcxt_next(lc) == 0) { if (file && !loopcxt_is_used(lc, st, file, offset, flags)) continue; printf_loopdev(lc); } loopcxt_deinit_iterator(lc); return 0; }