| .. | .. |
|---|
| 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. " |
|---|