diff options
Diffstat (limited to 'libblkid/superblocks.c')
-rw-r--r-- | libblkid/superblocks.c | 804 |
1 files changed, 0 insertions, 804 deletions
diff --git a/libblkid/superblocks.c b/libblkid/superblocks.c deleted file mode 100644 index 384d2cad7..000000000 --- a/libblkid/superblocks.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - * superblocks.c - reads information from filesystem and raid superblocks - * - * Copyright (C) 2008-2009 Karel Zak <kzak@redhat.com> - * - * This file may be redistributed under the terms of the - * GNU Lesser General Public License. - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <stdint.h> -#include <stdarg.h> - -#include "superblocks.h" - -/** - * SECTION:superblocks - * @title: Superblocks probing - * @short_description: filesystems and raids superblocks probing. - * - * The library API has been originally designed for superblocks probing only. - * This is reason why some *deprecated* superblock specific functions don't use - * '_superblocks_' namespace in the function name. Please, don't use these - * functions in new code. - * - * The 'superblocks' probers support NAME=value (tags) interface only. The - * superblocks probing is enabled by default (and controlled by - * blkid_probe_enable_superblocks()). - * - * Currently supported tags: - * - * @TYPE: filesystem type - * - * @SEC_TYPE: secondary filesystem type - * - * @LABEL: filesystem label - * - * @LABEL_RAW: raw label from FS superblock - * - * @UUID: filesystem UUID (lower case) - * - * @UUID_SUB: subvolume uuid (e.g. btrfs) - * - * @UUID_RAW: raw UUID from FS superblock - * - * @EXT_JOURNAL: external journal UUID - * - * @USAGE: usage string: "raid", "filesystem", ... - * - * @VERSION: filesystem version - * - * @MOUNT: cluster mount name (?) -- ocfs only - * - * @SBMAGIC: super block magic string - * - * @SBMAGIC_OFFSET: offset of SBMAGIC - * - * @FSSIZE: size of filessystem [not-implemented yet] - * - * @SYSTEM_ID: ISO9660 system identifier - * - * @PUBLISHER_ID: ISO9660 publisher identifier - * - * @APPLICATION_ID: ISO9660 application identifier - * - * @BOOT_SYSTEM_ID: ISO9660 boot system identifier - */ - -static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn); -static int superblocks_safeprobe(blkid_probe pr, struct blkid_chain *chn); - -static int blkid_probe_set_usage(blkid_probe pr, int usage); - - -/* - * Superblocks chains probing functions - */ -static const struct blkid_idinfo *idinfos[] = -{ - /* RAIDs */ - &linuxraid_idinfo, - &ddfraid_idinfo, - &iswraid_idinfo, - &lsiraid_idinfo, - &viaraid_idinfo, - &silraid_idinfo, - &nvraid_idinfo, - &pdcraid_idinfo, - &highpoint45x_idinfo, - &highpoint37x_idinfo, - &adraid_idinfo, - &jmraid_idinfo, - - &drbd_idinfo, - &drbdproxy_datalog_idinfo, - &lvm2_idinfo, - &lvm1_idinfo, - &snapcow_idinfo, - &verity_hash_idinfo, - &luks_idinfo, - &vmfs_volume_idinfo, - - /* Filesystems */ - &vfat_idinfo, - &swsuspend_idinfo, - &swap_idinfo, - &xfs_idinfo, - &ext4dev_idinfo, - &ext4_idinfo, - &ext3_idinfo, - &ext2_idinfo, - &jbd_idinfo, - &reiser_idinfo, - &reiser4_idinfo, - &jfs_idinfo, - &udf_idinfo, - &iso9660_idinfo, - &zfs_idinfo, - &hfsplus_idinfo, - &hfs_idinfo, - &ufs_idinfo, - &hpfs_idinfo, - &sysv_idinfo, - &xenix_idinfo, - &ntfs_idinfo, - &cramfs_idinfo, - &romfs_idinfo, - &minix_idinfo, - &gfs_idinfo, - &gfs2_idinfo, - &ocfs_idinfo, - &ocfs2_idinfo, - &oracleasm_idinfo, - &vxfs_idinfo, - &squashfs_idinfo, - &netware_idinfo, - &btrfs_idinfo, - &ubifs_idinfo, - &bfs_idinfo, - &vmfs_fs_idinfo, - &befs_idinfo, - &nilfs2_idinfo, - &exfat_idinfo, - &f2fs_idinfo -}; - -/* - * Driver definition - */ -const struct blkid_chaindrv superblocks_drv = { - .id = BLKID_CHAIN_SUBLKS, - .name = "superblocks", - .dflt_enabled = TRUE, - .dflt_flags = BLKID_SUBLKS_DEFAULT, - .idinfos = idinfos, - .nidinfos = ARRAY_SIZE(idinfos), - .has_fltr = TRUE, - .probe = superblocks_probe, - .safeprobe = superblocks_safeprobe, -}; - -/** - * blkid_probe_enable_superblocks: - * @pr: probe - * @enable: TRUE/FALSE - * - * Enables/disables the superblocks probing for non-binary interface. - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_enable_superblocks(blkid_probe pr, int enable) -{ - if (!pr) - return -1; - pr->chains[BLKID_CHAIN_SUBLKS].enabled = enable; - return 0; -} - -/** - * blkid_probe_set_superblocks_flags: - * @pr: prober - * @flags: BLKID_SUBLKS_* flags - * - * Sets probing flags to the superblocks prober. This function is optional, the - * default are BLKID_SUBLKS_DEFAULTS flags. - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_set_superblocks_flags(blkid_probe pr, int flags) -{ - if (!pr) - return -1; - - pr->chains[BLKID_CHAIN_SUBLKS].flags = flags; - return 0; -} - -/** - * blkid_probe_reset_superblocks_filter: - * @pr: prober - * - * Resets superblocks probing filter - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_reset_superblocks_filter(blkid_probe pr) -{ - return __blkid_probe_reset_filter(pr, BLKID_CHAIN_SUBLKS); -} - -/** - * blkid_probe_invert_superblocks_filter: - * @pr: prober - * - * Inverts superblocks probing filter - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_invert_superblocks_filter(blkid_probe pr) -{ - return __blkid_probe_invert_filter(pr, BLKID_CHAIN_SUBLKS); -} - -/** - * blkid_probe_filter_superblocks_type: - * @pr: prober - * @flag: filter BLKID_FLTR_{NOTIN,ONLYIN} flag - * @names: NULL terminated array of probing function names (e.g. "vfat"). - * - * %BLKID_FLTR_NOTIN - probe for all items which are NOT IN @names; - * - * %BLKID_FLTR_ONLYIN - probe for items which are IN @names - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_filter_superblocks_type(blkid_probe pr, int flag, char *names[]) -{ - return __blkid_probe_filter_types(pr, BLKID_CHAIN_SUBLKS, flag, names); -} - -/** - * blkid_probe_filter_superblocks_usage: - * @pr: prober - * @flag: filter BLKID_FLTR_{NOTIN,ONLYIN} flag - * @usage: BLKID_USAGE_* flags - * - * %BLKID_FLTR_NOTIN - probe for all items which are NOT IN @usage; - * - * %BLKID_FLTR_ONLYIN - probe for items which are IN @usage - * - * Returns: 0 on success, or -1 in case of error. - */ -int blkid_probe_filter_superblocks_usage(blkid_probe pr, int flag, int usage) -{ - unsigned long *fltr; - struct blkid_chain *chn; - size_t i; - - fltr = blkid_probe_get_filter(pr, BLKID_CHAIN_SUBLKS, TRUE); - if (!fltr) - return -1; - - chn = &pr->chains[BLKID_CHAIN_SUBLKS]; - - for (i = 0; i < chn->driver->nidinfos; i++) { - const struct blkid_idinfo *id = chn->driver->idinfos[i]; - - if (id->usage & usage) { - if (flag & BLKID_FLTR_NOTIN) - blkid_bmp_set_item(chn->fltr, i); - } else if (flag & BLKID_FLTR_ONLYIN) - blkid_bmp_set_item(chn->fltr, i); - } - DBG(DEBUG_LOWPROBE, printf("a new probing usage-filter initialized\n")); - return 0; -} - -/** - * blkid_known_fstype: - * @fstype: filesystem name - * - * Returns: 1 for known filesytems, or 0 for unknown filesystem. - */ -int blkid_known_fstype(const char *fstype) -{ - size_t i; - - if (!fstype) - return 0; - - for (i = 0; i < ARRAY_SIZE(idinfos); i++) { - const struct blkid_idinfo *id = idinfos[i]; - if (strcmp(id->name, fstype) == 0) - return 1; - } - return 0; -} - -/** - * blkid_superblocks_get_name: - * @idx: number >= 0 - * @name: returns name of supported filesystem/raid (optional) - * @usage: returns BLKID_USAGE_* flags, (optional) - * - * Returns: -1 if @idx is out of range, or 0 on success. - */ -int blkid_superblocks_get_name(size_t idx, const char **name, int *usage) -{ - if (idx < ARRAY_SIZE(idinfos)) { - if (name) - *name = idinfos[idx]->name; - if (usage) - *usage = idinfos[idx]->usage; - return 0; - } - return -1; -} - -/* - * The blkid_do_probe() backend. - */ -static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn) -{ - size_t i; - - if (!pr || chn->idx < -1) - return -1; - blkid_probe_chain_reset_vals(pr, chn); - - DBG(DEBUG_LOWPROBE, - printf("--> starting probing loop [SUBLKS idx=%d]\n", - chn->idx)); - - if (pr->size <= 0 || (pr->size <= 1024 && !S_ISCHR(pr->mode))) - /* Ignore very very small block devices or regular files (e.g. - * extended partitions). Note that size of the UBI char devices - * is 1 byte */ - goto nothing; - - i = chn->idx < 0 ? 0 : chn->idx + 1U; - - for ( ; i < ARRAY_SIZE(idinfos); i++) { - const struct blkid_idinfo *id; - const struct blkid_idmag *mag = NULL; - blkid_loff_t off = 0; - int rc = 0; - - chn->idx = i; - id = idinfos[i]; - - if (chn->fltr && blkid_bmp_get_item(chn->fltr, i)) { - DBG(DEBUG_LOWPROBE, printf("filter out: %s\n", id->name)); - continue; - } - - if (id->minsz && id->minsz > pr->size) - continue; /* the device is too small */ - - /* don't probe for RAIDs, swap or journal on CD/DVDs */ - if ((id->usage & (BLKID_USAGE_RAID | BLKID_USAGE_OTHER)) && - blkid_probe_is_cdrom(pr)) - continue; - - /* don't probe for RAIDs on floppies */ - if ((id->usage & BLKID_USAGE_RAID) && blkid_probe_is_tiny(pr)) - continue; - - DBG(DEBUG_LOWPROBE, printf("[%zd] %s:\n", i, id->name)); - - if (blkid_probe_get_idmag(pr, id, &off, &mag)) - continue; - - /* final check by probing function */ - if (id->probefunc) { - DBG(DEBUG_LOWPROBE, printf("\tcall probefunc()\n")); - if (id->probefunc(pr, mag) != 0) { - blkid_probe_chain_reset_vals(pr, chn); - continue; - } - } - - /* all cheks passed */ - if (chn->flags & BLKID_SUBLKS_TYPE) - rc = blkid_probe_set_value(pr, "TYPE", - (unsigned char *) id->name, - strlen(id->name) + 1); - - if (!rc) - rc = blkid_probe_set_usage(pr, id->usage); - - if (!rc && mag) - rc = blkid_probe_set_magic(pr, off, mag->len, - (unsigned char *) mag->magic); - if (rc) { - blkid_probe_chain_reset_vals(pr, chn); - DBG(DEBUG_LOWPROBE, printf("failed to set result -- ingnore\n")); - continue; - } - - DBG(DEBUG_LOWPROBE, - printf("<-- leaving probing loop (type=%s) [SUBLKS idx=%d]\n", - id->name, chn->idx)); - return 0; - } - -nothing: - DBG(DEBUG_LOWPROBE, - printf("<-- leaving probing loop (failed) [SUBLKS idx=%d]\n", - chn->idx)); - return 1; -} - -/* - * This is the same function as blkid_do_probe(), but returns only one result - * (cannot be used in while()) and checks for ambivalen results (more - * filesystems on the device) -- in such case returns -2. - * - * The function does not check for filesystems when a RAID or crypto signature - * is detected. The function also does not check for collision between RAIDs - * and crypto devices. The first detected RAID or crypto device is returned. - * - * The function does not probe for ambivalent results on very small devices - * (e.g. floppies), on small devices the first detected filesystem is returned. - */ -static int superblocks_safeprobe(blkid_probe pr, struct blkid_chain *chn) -{ - struct blkid_prval vals[BLKID_NVALS_SUBLKS]; - int nvals = BLKID_NVALS_SUBLKS; - int idx = -1; - int count = 0; - int intol = 0; - int rc; - - while ((rc = superblocks_probe(pr, chn)) == 0) { - - if (blkid_probe_is_tiny(pr) && !count) - /* floppy or so -- returns the first result. */ - return 0; - - count++; - - if (chn->idx >= 0 && - idinfos[chn->idx]->usage & (BLKID_USAGE_RAID | BLKID_USAGE_CRYPTO)) - break; - - if (chn->idx >= 0 && - !(idinfos[chn->idx]->flags & BLKID_IDINFO_TOLERANT)) - intol++; - - if (count == 1) { - /* save the first result */ - nvals = blkid_probe_chain_copy_vals(pr, chn, vals, nvals); - idx = chn->idx; - } - } - - if (rc < 0) - return rc; /* error */ - - if (count > 1 && intol) { - DBG(DEBUG_LOWPROBE, - printf("ERROR: superblocks chain: " - "ambivalent result detected (%d filesystems)!\n", - count)); - return -2; /* error, ambivalent result (more FS) */ - } - if (!count) - return 1; /* nothing detected */ - - if (idx != -1) { - /* restore the first result */ - blkid_probe_chain_reset_vals(pr, chn); - blkid_probe_append_vals(pr, vals, nvals); - chn->idx = idx; - } - - /* - * The RAID device could be partitioned. The problem are RAID1 devices - * where the partition table is visible from underlaying devices. We - * have to ignore such partition tables. - */ - if (chn->idx >= 0 && idinfos[chn->idx]->usage & BLKID_USAGE_RAID) - pr->prob_flags |= BLKID_PROBE_FL_IGNORE_PT; - - return 0; -} - -int blkid_probe_set_version(blkid_probe pr, const char *version) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - - if (chn->flags & BLKID_SUBLKS_VERSION) - return blkid_probe_set_value(pr, "VERSION", - (unsigned char *) version, strlen(version) + 1); - return 0; -} - - -int blkid_probe_sprintf_version(blkid_probe pr, const char *fmt, ...) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - int rc = 0; - - if (chn->flags & BLKID_SUBLKS_VERSION) { - va_list ap; - - va_start(ap, fmt); - rc = blkid_probe_vsprintf_value(pr, "VERSION", fmt, ap); - va_end(ap); - } - return rc; -} - -static int blkid_probe_set_usage(blkid_probe pr, int usage) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - char *u = NULL; - - if (!(chn->flags & BLKID_SUBLKS_USAGE)) - return 0; - - if (usage & BLKID_USAGE_FILESYSTEM) - u = "filesystem"; - else if (usage & BLKID_USAGE_RAID) - u = "raid"; - else if (usage & BLKID_USAGE_CRYPTO) - u = "crypto"; - else if (usage & BLKID_USAGE_OTHER) - u = "other"; - else - u = "unknown"; - - return blkid_probe_set_value(pr, "USAGE", (unsigned char *) u, strlen(u) + 1); -} - -int blkid_probe_set_id_label(blkid_probe pr, const char *name, - unsigned char *data, size_t len) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - struct blkid_prval *v; - - if (!(chn->flags & BLKID_SUBLKS_LABEL)) - return 0; - - v = blkid_probe_assign_value(pr, name); - if (!v) - return -1; - - if (len >= BLKID_PROBVAL_BUFSIZ) - len = BLKID_PROBVAL_BUFSIZ - 1; /* make a space for \0 */ - - memcpy(v->data, data, len); - v->data[len] = '\0'; - - /* remove white spaces */ - v->len = blkid_rtrim_whitespace(v->data) + 1; - if (v->len > 1) - v->len = blkid_ltrim_whitespace(v->data) + 1; - - if (v->len <= 1) - blkid_probe_reset_last_value(pr); /* ignore empty */ - return 0; -} - -int blkid_probe_set_label(blkid_probe pr, unsigned char *label, size_t len) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - struct blkid_prval *v; - if (len > BLKID_PROBVAL_BUFSIZ) - len = BLKID_PROBVAL_BUFSIZ; - - if ((chn->flags & BLKID_SUBLKS_LABELRAW) && - blkid_probe_set_value(pr, "LABEL_RAW", label, len) < 0) - return -1; - if (!(chn->flags & BLKID_SUBLKS_LABEL)) - return 0; - v = blkid_probe_assign_value(pr, "LABEL"); - if (!v) - return -1; - - if (len == BLKID_PROBVAL_BUFSIZ) - len--; /* make a space for \0 */ - - memcpy(v->data, label, len); - v->data[len] = '\0'; - - v->len = blkid_rtrim_whitespace(v->data) + 1; - if (v->len == 1) - blkid_probe_reset_last_value(pr); - return 0; -} - -int blkid_probe_set_utf8label(blkid_probe pr, unsigned char *label, - size_t len, int enc) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - struct blkid_prval *v; - - if ((chn->flags & BLKID_SUBLKS_LABELRAW) && - blkid_probe_set_value(pr, "LABEL_RAW", label, len) < 0) - return -1; - if (!(chn->flags & BLKID_SUBLKS_LABEL)) - return 0; - v = blkid_probe_assign_value(pr, "LABEL"); - if (!v) - return -1; - - blkid_encode_to_utf8(enc, v->data, sizeof(v->data), label, len); - v->len = blkid_rtrim_whitespace(v->data) + 1; - if (v->len == 1) - blkid_probe_reset_last_value(pr); - return 0; -} - -/* like uuid_is_null() from libuuid, but works with arbitrary size of UUID */ -static int uuid_is_empty(const unsigned char *buf, size_t len) -{ - size_t i; - - for (i = 0; i < len; i++) - if (buf[i]) - return 0; - return 1; -} - -int blkid_probe_sprintf_uuid(blkid_probe pr, unsigned char *uuid, - size_t len, const char *fmt, ...) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - int rc = -1; - va_list ap; - - if (len > BLKID_PROBVAL_BUFSIZ) - len = BLKID_PROBVAL_BUFSIZ; - - if (uuid_is_empty(uuid, len)) - return 0; - - if ((chn->flags & BLKID_SUBLKS_UUIDRAW) && - blkid_probe_set_value(pr, "UUID_RAW", uuid, len) < 0) - return -1; - if (!(chn->flags & BLKID_SUBLKS_UUID)) - return 0; - - va_start(ap, fmt); - rc = blkid_probe_vsprintf_value(pr, "UUID", fmt, ap); - va_end(ap); - - /* convert to lower case (..be paranoid) */ - if (!rc) { - size_t i; - struct blkid_prval *v = __blkid_probe_get_value(pr, - blkid_probe_numof_values(pr)); - if (v) { - for (i = 0; i < v->len; i++) - if (v->data[i] >= 'A' && v->data[i] <= 'F') - v->data[i] = (v->data[i] - 'A') + 'a'; - } - } - return rc; -} - -/* function to set UUIDs that are in suberblocks stored as strings */ -int blkid_probe_strncpy_uuid(blkid_probe pr, unsigned char *str, size_t len) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - struct blkid_prval *v; - - if (str == NULL || *str == '\0') - return -1; - if (!len) - len = strlen((char *) str); - if (len > BLKID_PROBVAL_BUFSIZ) - len = BLKID_PROBVAL_BUFSIZ; - - if ((chn->flags & BLKID_SUBLKS_UUIDRAW) && - blkid_probe_set_value(pr, "UUID_RAW", str, len) < 0) - return -1; - if (!(chn->flags & BLKID_SUBLKS_UUID)) - return 0; - - v = blkid_probe_assign_value(pr, "UUID"); - if (v) { - if (len == BLKID_PROBVAL_BUFSIZ) - len--; /* make a space for \0 */ - - memcpy((char *) v->data, str, len); - v->data[len] = '\0'; - v->len = len + 1; - return 0; - } - return -1; -} - -/* default _set_uuid function to set DCE UUIDs */ -int blkid_probe_set_uuid_as(blkid_probe pr, unsigned char *uuid, const char *name) -{ - struct blkid_chain *chn = blkid_probe_get_chain(pr); - struct blkid_prval *v; - - if (uuid_is_empty(uuid, 16)) - return 0; - - if (!name) { - if ((chn->flags & BLKID_SUBLKS_UUIDRAW) && - blkid_probe_set_value(pr, "UUID_RAW", uuid, 16) < 0) - return -1; - if (!(chn->flags & BLKID_SUBLKS_UUID)) - return 0; - - v = blkid_probe_assign_value(pr, "UUID"); - } else - v = blkid_probe_assign_value(pr, name); - - blkid_unparse_uuid(uuid, (char *) v->data, sizeof(v->data)); - v->len = 37; - - return 0; -} - -int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid) -{ - return blkid_probe_set_uuid_as(pr, uuid, NULL); -} - -/** - * blkid_probe_set_request: - * @pr: probe - * @flags: BLKID_PROBREQ_* (deprecated) or BLKID_SUBLKS_* flags - * - * Returns: 0 on success, or -1 in case of error. - * - * Deprecated: Use blkid_probe_set_superblocks_flags(). - */ -int blkid_probe_set_request(blkid_probe pr, int flags) -{ - return blkid_probe_set_superblocks_flags(pr, flags); -} - -/** - * blkid_probe_reset_filter: - * @pr: prober - * - * Returns: 0 on success, or -1 in case of error. - * - * Deprecated: Use blkid_probe_reset_superblocks_filter(). - */ -int blkid_probe_reset_filter(blkid_probe pr) -{ - return __blkid_probe_reset_filter(pr, BLKID_CHAIN_SUBLKS); -} - -/** - * blkid_probe_invert_filter: - * @pr: prober - * - * Returns: 0 on success, or -1 in case of error. - * - * Deprecated: Use blkid_probe_invert_superblocks_filter(). - */ -int blkid_probe_invert_filter(blkid_probe pr) -{ - return __blkid_probe_invert_filter(pr, BLKID_CHAIN_SUBLKS); -} - -/** - * blkid_probe_filter_types - * @pr: prober - * @flag: filter BLKID_FLTR_{NOTIN,ONLYIN} flag - * @names: NULL terminated array of probing function names (e.g. "vfat"). - * - * Returns: 0 on success, or -1 in case of error. - * - * Deprecated: Use blkid_probe_filter_superblocks_types(). - */ -int blkid_probe_filter_types(blkid_probe pr, int flag, char *names[]) -{ - return __blkid_probe_filter_types(pr, BLKID_CHAIN_SUBLKS, flag, names); -} - -/** - * blkid_probe_filter_usage - * @pr: prober - * @flag: filter BLKID_FLTR_{NOTIN,ONLYIN} flag - * @usage: BLKID_USAGE_* flags - * - * Returns: 0 on success, or -1 in case of error. - * - * Deprecated: Use blkid_probe_filter_superblocks_usage(). - */ -int blkid_probe_filter_usage(blkid_probe pr, int flag, int usage) -{ - return blkid_probe_filter_superblocks_usage(pr, flag, usage); -} - - |