1/* vi: set sw=4 ts=4: */ 2/* 3 * readahead implementation for busybox 4 * 5 * Preloads the given files in RAM, to reduce access time. 6 * Does this by calling the readahead(2) system call. 7 * 8 * Copyright (C) 2006 Michael Opdenacker <michael@free-electrons.com> 9 * 10 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 11 */ 12//config:config READAHEAD 13//config: bool "readahead (1.5 kb)" 14//config: default y 15//config: depends on LFS 16//config: help 17//config: Preload the files listed on the command line into RAM cache so that 18//config: subsequent reads on these files will not block on disk I/O. 19//config: 20//config: This applet just calls the readahead(2) system call on each file. 21//config: It is mainly useful in system startup scripts to preload files 22//config: or executables before they are used. When used at the right time 23//config: (in particular when a CPU bound process is running) it can 24//config: significantly speed up system startup. 25//config: 26//config: As readahead(2) blocks until each file has been read, it is best to 27//config: run this applet as a background job. 28 29//applet:IF_READAHEAD(APPLET(readahead, BB_DIR_USR_SBIN, BB_SUID_DROP)) 30 31//kbuild:lib-$(CONFIG_READAHEAD) += readahead.o 32 33//usage:#define readahead_trivial_usage 34//usage: "[FILE]..." 35//usage:#define readahead_full_usage "\n\n" 36//usage: "Preload FILEs to RAM" 37 38#include "libbb.h" 39 40int readahead_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 41int readahead_main(int argc UNUSED_PARAM, char **argv) 42{ 43 int retval = EXIT_SUCCESS; 44 45 if (!argv[1]) { 46 bb_show_usage(); 47 } 48 49 while (*++argv) { 50 int fd = open_or_warn(*argv, O_RDONLY); 51 if (fd >= 0) { 52 off_t len; 53 int r; 54 55 /* fdlength was reported to be unreliable - use seek */ 56 len = xlseek(fd, 0, SEEK_END); 57 xlseek(fd, 0, SEEK_SET); 58 r = readahead(fd, 0, len); 59 close(fd); 60 if (r >= 0) 61 continue; 62 } 63 retval = EXIT_FAILURE; 64 } 65 66 return retval; 67} 68