hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/init/do_mounts_rd.c
....@@ -14,12 +14,12 @@
1414
1515 #include <linux/decompress/generic.h>
1616
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;
1919
2020 static int __init prompt_ramdisk(char *str)
2121 {
22
- rd_prompt = simple_strtol(str,NULL,0) & 1;
22
+ pr_warn("ignoring the deprecated prompt_ramdisk= option\n");
2323 return 1;
2424 }
2525 __setup("prompt_ramdisk=", prompt_ramdisk);
....@@ -33,7 +33,7 @@
3333 }
3434 __setup("ramdisk_start=", ramdisk_start_setup);
3535
36
-static int __init crd_load(int in_fd, int out_fd, decompress_fn deco);
36
+static int __init crd_load(decompress_fn deco);
3737
3838 /*
3939 * This routine tries to find a RAM disk image to load, and returns the
....@@ -55,7 +55,8 @@
5555 * lz4
5656 */
5757 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)
5960 {
6061 const int size = 512;
6162 struct minix_super_block *minixsb;
....@@ -66,6 +67,7 @@
6667 unsigned char *buf;
6768 const char *compress_name;
6869 unsigned long n;
70
+ int start_block = rd_image_start;
6971
7072 buf = kmalloc(size, GFP_KERNEL);
7173 if (!buf)
....@@ -80,8 +82,8 @@
8082 /*
8183 * Read block 0 to test for compressed kernel
8284 */
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);
8587
8688 *decompressor = decompress_method(buf, size, &compress_name);
8789 if (compress_name) {
....@@ -126,8 +128,8 @@
126128 /*
127129 * Read 512 bytes further to check if cramfs is padded
128130 */
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);
131133
132134 if (cramfsb->magic == CRAMFS_MAGIC) {
133135 printk(KERN_NOTICE
....@@ -140,8 +142,8 @@
140142 /*
141143 * Read block 1 to test for minix and ext2 superblock
142144 */
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);
145147
146148 /* Try minix */
147149 if (minixsb->s_magic == MINIX_SUPER_MAGIC ||
....@@ -168,17 +170,24 @@
168170 start_block);
169171
170172 done:
171
- ksys_lseek(fd, start_block * BLOCK_SIZE, 0);
172173 kfree(buf);
173174 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;
174184 }
175185
176186 int __init rd_load_image(char *from)
177187 {
178188 int res = 0;
179
- int in_fd, out_fd;
180189 unsigned long rd_blocks, devblocks;
181
- int nblocks, i, disk;
190
+ int nblocks, i;
182191 char *buf = NULL;
183192 unsigned short rotate = 0;
184193 decompress_fn decompressor = NULL;
....@@ -186,20 +195,21 @@
186195 char rotator[4] = { '|' , '/' , '-' , '\\' };
187196 #endif
188197
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))
191200 goto out;
192201
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))
195204 goto noclose_input;
196205
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);
198208 if (nblocks < 0)
199209 goto done;
200210
201211 if (nblocks == 0) {
202
- if (crd_load(in_fd, out_fd, decompressor) == 0)
212
+ if (crd_load(decompressor) == 0)
203213 goto successful_load;
204214 goto done;
205215 }
....@@ -208,11 +218,7 @@
208218 * NOTE NOTE: nblocks is not actually blocks but
209219 * the number of kibibytes of data to load into a ramdisk.
210220 */
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);
216222 if (nblocks > rd_blocks) {
217223 printk("RAMDISK: image too big! (%dKiB/%ldKiB)\n",
218224 nblocks, rd_blocks);
....@@ -222,13 +228,10 @@
222228 /*
223229 * OK, time to copy in the data
224230 */
225
- if (ksys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0)
226
- devblocks = 0;
227
- else
228
- devblocks >>= 1;
229
-
230231 if (strcmp(from, "/initrd.image") == 0)
231232 devblocks = nblocks;
233
+ else
234
+ devblocks = nr_blocks(in_file);
232235
233236 if (devblocks == 0) {
234237 printk(KERN_ERR "RAMDISK: could not determine device size\n");
....@@ -243,24 +246,15 @@
243246
244247 printk(KERN_NOTICE "RAMDISK: Loading %dKiB [%ld disk%s] into ram disk... ",
245248 nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : "");
246
- for (i = 0, disk = 1; i < nblocks; i++) {
249
+ for (i = 0; i < nblocks; i++) {
247250 if (i && (i % devblocks == 0)) {
248
- pr_cont("done disk #%d.\n", disk++);
251
+ pr_cont("done disk #1.\n");
249252 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;
261255 }
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);
264258 #if !defined(CONFIG_S390)
265259 if (!(i % 16)) {
266260 pr_cont("%c\b", rotator[rotate & 0x3]);
....@@ -273,19 +267,17 @@
273267 successful_load:
274268 res = 1;
275269 done:
276
- ksys_close(in_fd);
270
+ fput(in_file);
277271 noclose_input:
278
- ksys_close(out_fd);
272
+ fput(out_file);
279273 out:
280274 kfree(buf);
281
- ksys_unlink("/dev/ram");
275
+ init_unlink("/dev/ram");
282276 return res;
283277 }
284278
285279 int __init rd_load_disk(int n)
286280 {
287
- if (rd_prompt)
288
- change_floppy("root floppy disk to be loaded into RAM disk");
289281 create_dev("/dev/root", ROOT_DEV);
290282 create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n));
291283 return rd_load_image("/dev/root");
....@@ -293,11 +285,10 @@
293285
294286 static int exit_code;
295287 static int decompress_error;
296
-static int crd_infd, crd_outfd;
297288
298289 static long __init compr_fill(void *buf, unsigned long len)
299290 {
300
- long r = ksys_read(crd_infd, buf, len);
291
+ long r = kernel_read(in_file, buf, len, &in_pos);
301292 if (r < 0)
302293 printk(KERN_ERR "RAMDISK: error while reading compressed data");
303294 else if (r == 0)
....@@ -307,7 +298,7 @@
307298
308299 static long __init compr_flush(void *window, unsigned long outcnt)
309300 {
310
- long written = ksys_write(crd_outfd, window, outcnt);
301
+ long written = kernel_write(out_file, window, outcnt, &out_pos);
311302 if (written != outcnt) {
312303 if (decompress_error == 0)
313304 printk(KERN_ERR
....@@ -326,11 +317,9 @@
326317 decompress_error = 1;
327318 }
328319
329
-static int __init crd_load(int in_fd, int out_fd, decompress_fn deco)
320
+static int __init crd_load(decompress_fn deco)
330321 {
331322 int result;
332
- crd_infd = in_fd;
333
- crd_outfd = out_fd;
334323
335324 if (!deco) {
336325 pr_emerg("Invalid ramdisk decompression routine. "