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