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