13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * flushb.c --- This routine flushes the disk buffers for a disk
3bf2d4999040f1165734777c10b17cc12b905e38aTheodore Ts'o *
4bf2d4999040f1165734777c10b17cc12b905e38aTheodore Ts'o * Copyright 1997, 2000, by Theodore Ts'o.
5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
616fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * WARNING: use of flushb on some older 2.2 kernels on a heavily loaded
716fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * system will corrupt filesystems.  This program is not really useful
816fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * beyond for benchmarking scripts.
916fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o *
1016fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * %Begin-Header%
1116fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * This file may be redistributed under the terms of the GNU Public
1216fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * License.
1316fa86b9c5618d72ab88918ac3a3e2af95290628Theodore Ts'o * %End-Header%
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h>
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h>
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h>
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h>
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h>
22d90f3494b219f9fe327eaa561faf75582f65ad9eTheodore Ts'o#include <sys/mount.h>
23adfca56f9f7fb175b829a9f678c83ac7f7c87d1eTheodore Ts'o#include "../misc/nls-enable.h"
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
25d90f3494b219f9fe327eaa561faf75582f65ad9eTheodore Ts'o/* For Linux, define BLKFLSBUF if necessary */
26d90f3494b219f9fe327eaa561faf75582f65ad9eTheodore Ts'o#if (!defined(BLKFLSBUF) && defined(__linux__))
27d90f3494b219f9fe327eaa561faf75582f65ad9eTheodore Ts'o#define BLKFLSBUF	_IO(0x12,97)	/* flush buffer cache */
28bf2d4999040f1165734777c10b17cc12b905e38aTheodore Ts'o#endif
29bf2d4999040f1165734777c10b17cc12b905e38aTheodore Ts'o
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oconst char *progname;
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
325ba23cb149f2ff629446fb8cb5f1012c05f7a4f4Theodore Ts'ostatic void usage(void)
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
340c4a07264e55b42c6e30230e66b1dea7d4b94ea9Theodore Ts'o	fprintf(stderr, _("Usage: %s disk\n"), progname);
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	exit(1);
36efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o}
37efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint main(int argc, char **argv)
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int	fd;
41efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	progname = argv[0];
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (argc != 2)
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		usage();
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fd = open(argv[1], O_RDONLY, 0);
473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (fd < 0) {
483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		perror("open");
493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		exit(1);
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	/*
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * Note: to reread the partition table, use the ioctl
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 * BLKRRPART instead of BLKFSLBUF.
543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 */
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef BLKFLSBUF
563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (ioctl(fd, BLKFLSBUF, 0) < 0) {
5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		perror("ioctl BLKFLSBUF");
583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		exit(1);
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return 0;
6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else
6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	fprintf(stderr,
630c4a07264e55b42c6e30230e66b1dea7d4b94ea9Theodore Ts'o		_("BLKFLSBUF ioctl not supported!  Can't flush buffers.\n"));
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return 1;
6550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
67