blkid.c revision e12f2ae74c2eb8997bf13adf8fdd7e7313971eae
1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * blkid.c - User command-line interface for libblkid 3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * 4e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Copyright (C) 2001 Andreas Dilger 5e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * 6e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %Begin-Header% 7e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * This file may be redistributed under the terms of the 8e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * GNU Lesser General Public License. 9e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %End-Header% 10e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o */ 11e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 12e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <stdio.h> 13e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#ifdef HAVE_GETOPT_H 14e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <getopt.h> 15e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#else 16e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oextern char *optarg; 17e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oextern int optind; 18e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#endif 19e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 20e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "blkid/blkid.h" 21e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 22e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'ochar *progname = "blkid"; 23e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'ovoid print_version(FILE *out) 24e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 25e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, "%s %s (%s)\n", progname, BLKID_VERSION, BLKID_DATE); 26e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 27e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 28e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'ovoid usage(int error) 29e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 30e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o FILE *out = error ? stderr : stdout; 31e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 32e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_version(out); 33e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(out, 34e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "usage:\t%s [-c <file>] [-h] " 35e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "[-p] [-s <tag>] [-t <token>] [-v] [-w <file>] [dev ...]\n" 36e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-c\tcache file (default: /etc/blkid.tab, /dev/null = none)\n" 37e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-h\tprint this usage message and exit\n" 38e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-s\tshow specified tag(s) (default show all tags)\n" 39e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-t\tfind device with a specific token (NAME=value pair)\n" 40e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-v\tprint version and exit\n" 41e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t-w\twrite cache to different file (/dev/null = no write)\n" 42e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\tdev\tspecify device(s) to probe (default: all devices)\n", 43e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o progname); 44e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o exit(error); 45e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 46e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 47e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#define PT_FL_START 0x0001 48e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#define PT_FL_TYPE 0x0002 49e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 50e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'ostatic void print_tag(blkid_dev *dev, blkid_tag *tag, int *flags) 51e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 52e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Print only one "dev:" per device */ 53e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!*flags & PT_FL_START) { 54e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o printf("%s: ", dev->bid_name); 55e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *flags |= PT_FL_START; 56e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 57e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Print only the primary TYPE per device */ 58e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!strcmp(tag->bit_name, "TYPE")) { 59e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (*flags & PT_FL_TYPE) 60e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return; 61e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *flags |= PT_FL_TYPE; 62e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 63e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o printf("%s=\"%s\" ", tag->bit_name, tag->bit_val); 64e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 65e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 66e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'ovoid print_tags(blkid_dev *dev, char *show[], int numtag) 67e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 68e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o struct list_head *p; 69e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int flags = 0; 70e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 71e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!dev) 72e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return; 73e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 74e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o list_for_each(p, &dev->bid_tags) { 75e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_tag *tag = list_entry(p, blkid_tag, bit_tags); 76e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int i; 77e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 78e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Print all tokens if none is specified */ 79e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (numtag == 0 || !show) { 80e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_tag(dev, tag, &flags); 81e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Otherwise, only print specific tokens */ 82e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } else for (i = 0; i < numtag; i++) { 83e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!strcmp(tag->bit_name, show[i])) 84e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_tag(dev, tag, &flags); 85e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 86e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 87e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 88e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (flags) 89e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o printf("\n"); 90e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 91e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 92e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oint main(int argc, char **argv) 93e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 94e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_cache *cache = NULL; 95e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *devices[128] = { NULL, }; 96e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *show[128] = { NULL, }; 97e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_tag *tag = NULL; 98e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *read = NULL; 99e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *write = NULL; 100e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int numdev = 0, numtag = 0; 101e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int version = 0; 102e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int err = 4; 103e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o int i; 104e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char c; 105e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 106e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o while ((c = getopt (argc, argv, "c:d:f:hps:t:w:v")) != EOF) 107e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o switch (c) { 108e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 'd': /* deprecated */ 109e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (numdev >= sizeof(devices) / sizeof(*devices)) { 110e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, 111e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "Too many devices specified\n"); 112e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o usage(err); 113e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 114e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o devices[numdev++] = optarg; 115e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 116e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 'c': 117e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (optarg && !*optarg) 118e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o read = NULL; 119e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o else 120e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o read = optarg; 121e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!write) 122e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o write = read; 123e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 124e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 's': 125e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (numtag >= sizeof(show) / sizeof(*show)) { 126e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, "Too many tags specified\n"); 127e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o usage(err); 128e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 129e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o show[numtag++] = optarg; 130e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 131e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 't': 132e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (tag) { 133e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, "Can only search for " 134e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "one NAME=value pair\n"); 135e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o usage(err); 136e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 137e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!(tag = blkid_token_to_tag(optarg))) { 138e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, "-t needs NAME=value pair\n"); 139e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o usage(err); 140e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 141e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 142e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 'v': 143e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o version = 1; 144e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 145e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 'w': 146e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (optarg && !*optarg) 147e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o write = NULL; 148e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o else 149e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o write = optarg; 150e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o break; 151e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o case 'h': 152e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o err = 0; 153e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o default: 154e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o usage(err); 155e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 156e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 157e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o while (optind < argc) 158e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o devices[numdev++] = argv[optind++]; 159e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 160e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (version) { 161e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_version(stdout); 162e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o goto exit; 163e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 164e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 165e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (blkid_read_cache(&cache, read) < 0) 166e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o goto exit; 167e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 168e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o err = 2; 169e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* If looking for a specific NAME=value pair, print only that */ 170e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (tag) { 171e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_tag *found = NULL; 172e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 173e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Load any additional devices not in the cache */ 174e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o for (i = 0; i < numdev; i++) 175e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_get_devname(cache, devices[i]); 176e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 177e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if ((found = blkid_get_tag_cache(cache, tag))) { 178e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_tags(found->bit_dev, show, numtag); 179e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o err = 0; 180e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 181e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* If we didn't specify a single device, show all available devices */ 182e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } else if (!numdev) { 183e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o struct list_head *p; 184e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 185e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_probe_all(&cache); 186e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 187e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o list_for_each(p, &cache->bic_devs) { 188e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_dev *dev = list_entry(p, blkid_dev, bid_devs); 189e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_tags(dev, show, numtag); 190e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o err = 0; 191e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 192e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o /* Add all specified devices to cache (optionally display tags) */ 193e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } else for (i = 0; i < numdev; i++) { 194e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_dev *dev = blkid_get_devname(cache, devices[i]); 195e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 196e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (dev) { 197e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o print_tags(dev, show, numtag); 198e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o err = 0; 199e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 200e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 201e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 202e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oexit: 203e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_free_tag(tag); 204e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_save_cache(cache, write); 205e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_free_cache(cache); 206e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return err; 207e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 208