.. | .. |
---|
14 | 14 | |
---|
15 | 15 | #include <linux/decompress/generic.h> |
---|
16 | 16 | |
---|
17 | | - |
---|
18 | | -int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ |
---|
| 17 | +static struct file *in_file, *out_file; |
---|
| 18 | +static loff_t in_pos, out_pos; |
---|
19 | 19 | |
---|
20 | 20 | static int __init prompt_ramdisk(char *str) |
---|
21 | 21 | { |
---|
22 | | - rd_prompt = simple_strtol(str,NULL,0) & 1; |
---|
| 22 | + pr_warn("ignoring the deprecated prompt_ramdisk= option\n"); |
---|
23 | 23 | return 1; |
---|
24 | 24 | } |
---|
25 | 25 | __setup("prompt_ramdisk=", prompt_ramdisk); |
---|
.. | .. |
---|
33 | 33 | } |
---|
34 | 34 | __setup("ramdisk_start=", ramdisk_start_setup); |
---|
35 | 35 | |
---|
36 | | -static int __init crd_load(int in_fd, int out_fd, decompress_fn deco); |
---|
| 36 | +static int __init crd_load(decompress_fn deco); |
---|
37 | 37 | |
---|
38 | 38 | /* |
---|
39 | 39 | * This routine tries to find a RAM disk image to load, and returns the |
---|
.. | .. |
---|
55 | 55 | * lz4 |
---|
56 | 56 | */ |
---|
57 | 57 | static int __init |
---|
58 | | -identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) |
---|
| 58 | +identify_ramdisk_image(struct file *file, loff_t pos, |
---|
| 59 | + decompress_fn *decompressor) |
---|
59 | 60 | { |
---|
60 | 61 | const int size = 512; |
---|
61 | 62 | struct minix_super_block *minixsb; |
---|
.. | .. |
---|
66 | 67 | unsigned char *buf; |
---|
67 | 68 | const char *compress_name; |
---|
68 | 69 | unsigned long n; |
---|
| 70 | + int start_block = rd_image_start; |
---|
69 | 71 | |
---|
70 | 72 | buf = kmalloc(size, GFP_KERNEL); |
---|
71 | 73 | if (!buf) |
---|
.. | .. |
---|
80 | 82 | /* |
---|
81 | 83 | * Read block 0 to test for compressed kernel |
---|
82 | 84 | */ |
---|
83 | | - ksys_lseek(fd, start_block * BLOCK_SIZE, 0); |
---|
84 | | - ksys_read(fd, buf, size); |
---|
| 85 | + pos = start_block * BLOCK_SIZE; |
---|
| 86 | + kernel_read(file, buf, size, &pos); |
---|
85 | 87 | |
---|
86 | 88 | *decompressor = decompress_method(buf, size, &compress_name); |
---|
87 | 89 | if (compress_name) { |
---|
.. | .. |
---|
126 | 128 | /* |
---|
127 | 129 | * Read 512 bytes further to check if cramfs is padded |
---|
128 | 130 | */ |
---|
129 | | - ksys_lseek(fd, start_block * BLOCK_SIZE + 0x200, 0); |
---|
130 | | - ksys_read(fd, buf, size); |
---|
| 131 | + pos = start_block * BLOCK_SIZE + 0x200; |
---|
| 132 | + kernel_read(file, buf, size, &pos); |
---|
131 | 133 | |
---|
132 | 134 | if (cramfsb->magic == CRAMFS_MAGIC) { |
---|
133 | 135 | printk(KERN_NOTICE |
---|
.. | .. |
---|
140 | 142 | /* |
---|
141 | 143 | * Read block 1 to test for minix and ext2 superblock |
---|
142 | 144 | */ |
---|
143 | | - ksys_lseek(fd, (start_block+1) * BLOCK_SIZE, 0); |
---|
144 | | - ksys_read(fd, buf, size); |
---|
| 145 | + pos = (start_block + 1) * BLOCK_SIZE; |
---|
| 146 | + kernel_read(file, buf, size, &pos); |
---|
145 | 147 | |
---|
146 | 148 | /* Try minix */ |
---|
147 | 149 | if (minixsb->s_magic == MINIX_SUPER_MAGIC || |
---|
.. | .. |
---|
168 | 170 | start_block); |
---|
169 | 171 | |
---|
170 | 172 | done: |
---|
171 | | - ksys_lseek(fd, start_block * BLOCK_SIZE, 0); |
---|
172 | 173 | kfree(buf); |
---|
173 | 174 | return nblocks; |
---|
| 175 | +} |
---|
| 176 | + |
---|
| 177 | +static unsigned long nr_blocks(struct file *file) |
---|
| 178 | +{ |
---|
| 179 | + struct inode *inode = file->f_mapping->host; |
---|
| 180 | + |
---|
| 181 | + if (!S_ISBLK(inode->i_mode)) |
---|
| 182 | + return 0; |
---|
| 183 | + return i_size_read(inode) >> 10; |
---|
174 | 184 | } |
---|
175 | 185 | |
---|
176 | 186 | int __init rd_load_image(char *from) |
---|
177 | 187 | { |
---|
178 | 188 | int res = 0; |
---|
179 | | - int in_fd, out_fd; |
---|
180 | 189 | unsigned long rd_blocks, devblocks; |
---|
181 | | - int nblocks, i, disk; |
---|
| 190 | + int nblocks, i; |
---|
182 | 191 | char *buf = NULL; |
---|
183 | 192 | unsigned short rotate = 0; |
---|
184 | 193 | decompress_fn decompressor = NULL; |
---|
.. | .. |
---|
186 | 195 | char rotator[4] = { '|' , '/' , '-' , '\\' }; |
---|
187 | 196 | #endif |
---|
188 | 197 | |
---|
189 | | - out_fd = ksys_open("/dev/ram", O_RDWR, 0); |
---|
190 | | - if (out_fd < 0) |
---|
| 198 | + out_file = filp_open("/dev/ram", O_RDWR, 0); |
---|
| 199 | + if (IS_ERR(out_file)) |
---|
191 | 200 | goto out; |
---|
192 | 201 | |
---|
193 | | - in_fd = ksys_open(from, O_RDONLY, 0); |
---|
194 | | - if (in_fd < 0) |
---|
| 202 | + in_file = filp_open(from, O_RDONLY, 0); |
---|
| 203 | + if (IS_ERR(in_file)) |
---|
195 | 204 | goto noclose_input; |
---|
196 | 205 | |
---|
197 | | - nblocks = identify_ramdisk_image(in_fd, rd_image_start, &decompressor); |
---|
| 206 | + in_pos = rd_image_start * BLOCK_SIZE; |
---|
| 207 | + nblocks = identify_ramdisk_image(in_file, in_pos, &decompressor); |
---|
198 | 208 | if (nblocks < 0) |
---|
199 | 209 | goto done; |
---|
200 | 210 | |
---|
201 | 211 | if (nblocks == 0) { |
---|
202 | | - if (crd_load(in_fd, out_fd, decompressor) == 0) |
---|
| 212 | + if (crd_load(decompressor) == 0) |
---|
203 | 213 | goto successful_load; |
---|
204 | 214 | goto done; |
---|
205 | 215 | } |
---|
.. | .. |
---|
208 | 218 | * NOTE NOTE: nblocks is not actually blocks but |
---|
209 | 219 | * the number of kibibytes of data to load into a ramdisk. |
---|
210 | 220 | */ |
---|
211 | | - if (ksys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0) |
---|
212 | | - rd_blocks = 0; |
---|
213 | | - else |
---|
214 | | - rd_blocks >>= 1; |
---|
215 | | - |
---|
| 221 | + rd_blocks = nr_blocks(out_file); |
---|
216 | 222 | if (nblocks > rd_blocks) { |
---|
217 | 223 | printk("RAMDISK: image too big! (%dKiB/%ldKiB)\n", |
---|
218 | 224 | nblocks, rd_blocks); |
---|
.. | .. |
---|
222 | 228 | /* |
---|
223 | 229 | * OK, time to copy in the data |
---|
224 | 230 | */ |
---|
225 | | - if (ksys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0) |
---|
226 | | - devblocks = 0; |
---|
227 | | - else |
---|
228 | | - devblocks >>= 1; |
---|
229 | | - |
---|
230 | 231 | if (strcmp(from, "/initrd.image") == 0) |
---|
231 | 232 | devblocks = nblocks; |
---|
| 233 | + else |
---|
| 234 | + devblocks = nr_blocks(in_file); |
---|
232 | 235 | |
---|
233 | 236 | if (devblocks == 0) { |
---|
234 | 237 | printk(KERN_ERR "RAMDISK: could not determine device size\n"); |
---|
.. | .. |
---|
243 | 246 | |
---|
244 | 247 | printk(KERN_NOTICE "RAMDISK: Loading %dKiB [%ld disk%s] into ram disk... ", |
---|
245 | 248 | nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : ""); |
---|
246 | | - for (i = 0, disk = 1; i < nblocks; i++) { |
---|
| 249 | + for (i = 0; i < nblocks; i++) { |
---|
247 | 250 | if (i && (i % devblocks == 0)) { |
---|
248 | | - pr_cont("done disk #%d.\n", disk++); |
---|
| 251 | + pr_cont("done disk #1.\n"); |
---|
249 | 252 | rotate = 0; |
---|
250 | | - if (ksys_close(in_fd)) { |
---|
251 | | - printk("Error closing the disk.\n"); |
---|
252 | | - goto noclose_input; |
---|
253 | | - } |
---|
254 | | - change_floppy("disk #%d", disk); |
---|
255 | | - in_fd = ksys_open(from, O_RDONLY, 0); |
---|
256 | | - if (in_fd < 0) { |
---|
257 | | - printk("Error opening disk.\n"); |
---|
258 | | - goto noclose_input; |
---|
259 | | - } |
---|
260 | | - printk("Loading disk #%d... ", disk); |
---|
| 253 | + fput(in_file); |
---|
| 254 | + break; |
---|
261 | 255 | } |
---|
262 | | - ksys_read(in_fd, buf, BLOCK_SIZE); |
---|
263 | | - ksys_write(out_fd, buf, BLOCK_SIZE); |
---|
| 256 | + kernel_read(in_file, buf, BLOCK_SIZE, &in_pos); |
---|
| 257 | + kernel_write(out_file, buf, BLOCK_SIZE, &out_pos); |
---|
264 | 258 | #if !defined(CONFIG_S390) |
---|
265 | 259 | if (!(i % 16)) { |
---|
266 | 260 | pr_cont("%c\b", rotator[rotate & 0x3]); |
---|
.. | .. |
---|
273 | 267 | successful_load: |
---|
274 | 268 | res = 1; |
---|
275 | 269 | done: |
---|
276 | | - ksys_close(in_fd); |
---|
| 270 | + fput(in_file); |
---|
277 | 271 | noclose_input: |
---|
278 | | - ksys_close(out_fd); |
---|
| 272 | + fput(out_file); |
---|
279 | 273 | out: |
---|
280 | 274 | kfree(buf); |
---|
281 | | - ksys_unlink("/dev/ram"); |
---|
| 275 | + init_unlink("/dev/ram"); |
---|
282 | 276 | return res; |
---|
283 | 277 | } |
---|
284 | 278 | |
---|
285 | 279 | int __init rd_load_disk(int n) |
---|
286 | 280 | { |
---|
287 | | - if (rd_prompt) |
---|
288 | | - change_floppy("root floppy disk to be loaded into RAM disk"); |
---|
289 | 281 | create_dev("/dev/root", ROOT_DEV); |
---|
290 | 282 | create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n)); |
---|
291 | 283 | return rd_load_image("/dev/root"); |
---|
.. | .. |
---|
293 | 285 | |
---|
294 | 286 | static int exit_code; |
---|
295 | 287 | static int decompress_error; |
---|
296 | | -static int crd_infd, crd_outfd; |
---|
297 | 288 | |
---|
298 | 289 | static long __init compr_fill(void *buf, unsigned long len) |
---|
299 | 290 | { |
---|
300 | | - long r = ksys_read(crd_infd, buf, len); |
---|
| 291 | + long r = kernel_read(in_file, buf, len, &in_pos); |
---|
301 | 292 | if (r < 0) |
---|
302 | 293 | printk(KERN_ERR "RAMDISK: error while reading compressed data"); |
---|
303 | 294 | else if (r == 0) |
---|
.. | .. |
---|
307 | 298 | |
---|
308 | 299 | static long __init compr_flush(void *window, unsigned long outcnt) |
---|
309 | 300 | { |
---|
310 | | - long written = ksys_write(crd_outfd, window, outcnt); |
---|
| 301 | + long written = kernel_write(out_file, window, outcnt, &out_pos); |
---|
311 | 302 | if (written != outcnt) { |
---|
312 | 303 | if (decompress_error == 0) |
---|
313 | 304 | printk(KERN_ERR |
---|
.. | .. |
---|
326 | 317 | decompress_error = 1; |
---|
327 | 318 | } |
---|
328 | 319 | |
---|
329 | | -static int __init crd_load(int in_fd, int out_fd, decompress_fn deco) |
---|
| 320 | +static int __init crd_load(decompress_fn deco) |
---|
330 | 321 | { |
---|
331 | 322 | int result; |
---|
332 | | - crd_infd = in_fd; |
---|
333 | | - crd_outfd = out_fd; |
---|
334 | 323 | |
---|
335 | 324 | if (!deco) { |
---|
336 | 325 | pr_emerg("Invalid ramdisk decompression routine. " |
---|