Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.13 1548 lines 36 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2018 Cambridge Greys Ltd 4 * Copyright (C) 2015-2016 Anton Ivanov (aivanov@brocade.com) 5 * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) 6 */ 7 8/* 2001-09-28...2002-04-17 9 * Partition stuff by James_McMechan@hotmail.com 10 * old style ubd by setting UBD_SHIFT to 0 11 * 2002-09-27...2002-10-18 massive tinkering for 2.5 12 * partitions have changed in 2.5 13 * 2003-01-29 more tinkering for 2.5.59-1 14 * This should now address the sysfs problems and has 15 * the symlink for devfs to allow for booting with 16 * the common /dev/ubd/discX/... names rather than 17 * only /dev/ubdN/discN this version also has lots of 18 * clean ups preparing for ubd-many. 19 * James McMechan 20 */ 21 22#define UBD_SHIFT 4 23 24#include <linux/module.h> 25#include <linux/init.h> 26#include <linux/blkdev.h> 27#include <linux/blk-mq.h> 28#include <linux/ata.h> 29#include <linux/hdreg.h> 30#include <linux/major.h> 31#include <linux/cdrom.h> 32#include <linux/proc_fs.h> 33#include <linux/seq_file.h> 34#include <linux/ctype.h> 35#include <linux/slab.h> 36#include <linux/vmalloc.h> 37#include <linux/platform_device.h> 38#include <linux/scatterlist.h> 39#include <kern_util.h> 40#include "mconsole_kern.h" 41#include <init.h> 42#include <irq_kern.h> 43#include "ubd.h" 44#include <os.h> 45#include "cow.h" 46 47/* Max request size is determined by sector mask - 32K */ 48#define UBD_MAX_REQUEST (8 * sizeof(long)) 49 50struct io_desc { 51 char *buffer; 52 unsigned long length; 53 unsigned long sector_mask; 54 unsigned long long cow_offset; 55 unsigned long bitmap_words[2]; 56}; 57 58struct io_thread_req { 59 struct request *req; 60 int fds[2]; 61 unsigned long offsets[2]; 62 unsigned long long offset; 63 int sectorsize; 64 int error; 65 66 int desc_cnt; 67 /* io_desc has to be the last element of the struct */ 68 struct io_desc io_desc[]; 69}; 70 71 72static struct io_thread_req * (*irq_req_buffer)[]; 73static struct io_thread_req *irq_remainder; 74static int irq_remainder_size; 75 76static struct io_thread_req * (*io_req_buffer)[]; 77static struct io_thread_req *io_remainder; 78static int io_remainder_size; 79 80 81 82static inline int ubd_test_bit(__u64 bit, unsigned char *data) 83{ 84 __u64 n; 85 int bits, off; 86 87 bits = sizeof(data[0]) * 8; 88 n = bit / bits; 89 off = bit % bits; 90 return (data[n] & (1 << off)) != 0; 91} 92 93static inline void ubd_set_bit(__u64 bit, unsigned char *data) 94{ 95 __u64 n; 96 int bits, off; 97 98 bits = sizeof(data[0]) * 8; 99 n = bit / bits; 100 off = bit % bits; 101 data[n] |= (1 << off); 102} 103/*End stuff from ubd_user.h*/ 104 105#define DRIVER_NAME "uml-blkdev" 106 107static DEFINE_MUTEX(ubd_lock); 108 109static int ubd_ioctl(struct block_device *bdev, blk_mode_t mode, 110 unsigned int cmd, unsigned long arg); 111static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo); 112 113#define MAX_DEV (16) 114 115static const struct block_device_operations ubd_blops = { 116 .owner = THIS_MODULE, 117 .ioctl = ubd_ioctl, 118 .compat_ioctl = blkdev_compat_ptr_ioctl, 119 .getgeo = ubd_getgeo, 120}; 121 122#ifdef CONFIG_BLK_DEV_UBD_SYNC 123#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0, \ 124 .cl = 1 }) 125#else 126#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0, \ 127 .cl = 1 }) 128#endif 129static struct openflags global_openflags = OPEN_FLAGS; 130 131struct cow { 132 /* backing file name */ 133 char *file; 134 /* backing file fd */ 135 int fd; 136 unsigned long *bitmap; 137 unsigned long bitmap_len; 138 int bitmap_offset; 139 int data_offset; 140}; 141 142#define MAX_SG 64 143 144struct ubd { 145 /* name (and fd, below) of the file opened for writing, either the 146 * backing or the cow file. */ 147 char *file; 148 char *serial; 149 int fd; 150 __u64 size; 151 struct openflags boot_openflags; 152 struct openflags openflags; 153 unsigned shared:1; 154 unsigned no_cow:1; 155 unsigned no_trim:1; 156 struct cow cow; 157 struct platform_device pdev; 158 struct gendisk *disk; 159 struct blk_mq_tag_set tag_set; 160 spinlock_t lock; 161}; 162 163#define DEFAULT_COW { \ 164 .file = NULL, \ 165 .fd = -1, \ 166 .bitmap = NULL, \ 167 .bitmap_offset = 0, \ 168 .data_offset = 0, \ 169} 170 171#define DEFAULT_UBD { \ 172 .file = NULL, \ 173 .serial = NULL, \ 174 .fd = -1, \ 175 .size = -1, \ 176 .boot_openflags = OPEN_FLAGS, \ 177 .openflags = OPEN_FLAGS, \ 178 .no_cow = 0, \ 179 .no_trim = 0, \ 180 .shared = 0, \ 181 .cow = DEFAULT_COW, \ 182 .lock = __SPIN_LOCK_UNLOCKED(ubd_devs.lock), \ 183} 184 185/* Protected by ubd_lock */ 186static struct ubd ubd_devs[MAX_DEV] = { [0 ... MAX_DEV - 1] = DEFAULT_UBD }; 187 188static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx, 189 const struct blk_mq_queue_data *bd); 190 191static int fake_ide_setup(char *str) 192{ 193 pr_warn("The fake_ide option has been removed\n"); 194 return 1; 195} 196__setup("fake_ide", fake_ide_setup); 197 198__uml_help(fake_ide_setup, 199"fake_ide\n" 200" Obsolete stub.\n\n" 201); 202 203static int parse_unit(char **ptr) 204{ 205 char *str = *ptr, *end; 206 int n = -1; 207 208 if(isdigit(*str)) { 209 n = simple_strtoul(str, &end, 0); 210 if(end == str) 211 return -1; 212 *ptr = end; 213 } 214 else if (('a' <= *str) && (*str <= 'z')) { 215 n = *str - 'a'; 216 str++; 217 *ptr = str; 218 } 219 return n; 220} 221 222/* If *index_out == -1 at exit, the passed option was a general one; 223 * otherwise, the str pointer is used (and owned) inside ubd_devs array, so it 224 * should not be freed on exit. 225 */ 226static int ubd_setup_common(char *str, int *index_out, char **error_out) 227{ 228 struct ubd *ubd_dev; 229 struct openflags flags = global_openflags; 230 char *file, *backing_file, *serial; 231 int n, err = 0, i; 232 233 if(index_out) *index_out = -1; 234 n = *str; 235 if(n == '='){ 236 str++; 237 if(!strcmp(str, "sync")){ 238 global_openflags = of_sync(global_openflags); 239 return err; 240 } 241 242 pr_warn("fake major not supported any more\n"); 243 return 0; 244 } 245 246 n = parse_unit(&str); 247 if(n < 0){ 248 *error_out = "Couldn't parse device number"; 249 return -EINVAL; 250 } 251 if(n >= MAX_DEV){ 252 *error_out = "Device number out of range"; 253 return 1; 254 } 255 256 err = -EBUSY; 257 mutex_lock(&ubd_lock); 258 259 ubd_dev = &ubd_devs[n]; 260 if(ubd_dev->file != NULL){ 261 *error_out = "Device is already configured"; 262 goto out; 263 } 264 265 if (index_out) 266 *index_out = n; 267 268 err = -EINVAL; 269 for (i = 0; i < sizeof("rscdt="); i++) { 270 switch (*str) { 271 case 'r': 272 flags.w = 0; 273 break; 274 case 's': 275 flags.s = 1; 276 break; 277 case 'd': 278 ubd_dev->no_cow = 1; 279 break; 280 case 'c': 281 ubd_dev->shared = 1; 282 break; 283 case 't': 284 ubd_dev->no_trim = 1; 285 break; 286 case '=': 287 str++; 288 goto break_loop; 289 default: 290 *error_out = "Expected '=' or flag letter " 291 "(r, s, c, t or d)"; 292 goto out; 293 } 294 str++; 295 } 296 297 if (*str == '=') 298 *error_out = "Too many flags specified"; 299 else 300 *error_out = "Missing '='"; 301 goto out; 302 303break_loop: 304 file = strsep(&str, ",:"); 305 if (*file == '\0') 306 file = NULL; 307 308 backing_file = strsep(&str, ",:"); 309 if (backing_file && *backing_file == '\0') 310 backing_file = NULL; 311 312 serial = strsep(&str, ",:"); 313 if (serial && *serial == '\0') 314 serial = NULL; 315 316 if (backing_file && ubd_dev->no_cow) { 317 *error_out = "Can't specify both 'd' and a cow file"; 318 goto out; 319 } 320 321 err = 0; 322 ubd_dev->file = file; 323 ubd_dev->cow.file = backing_file; 324 ubd_dev->serial = serial; 325 ubd_dev->boot_openflags = flags; 326out: 327 mutex_unlock(&ubd_lock); 328 return err; 329} 330 331static int ubd_setup(char *str) 332{ 333 char *error; 334 int err; 335 336 err = ubd_setup_common(str, NULL, &error); 337 if(err) 338 printk(KERN_ERR "Failed to initialize device with \"%s\" : " 339 "%s\n", str, error); 340 return 1; 341} 342 343__setup("ubd", ubd_setup); 344__uml_help(ubd_setup, 345"ubd<n><flags>=<filename>[(:|,)<filename2>][(:|,)<serial>]\n" 346" This is used to associate a device with a file in the underlying\n" 347" filesystem. When specifying two filenames, the first one is the\n" 348" COW name and the second is the backing file name. As separator you can\n" 349" use either a ':' or a ',': the first one allows writing things like;\n" 350" ubd0=~/Uml/root_cow:~/Uml/root_backing_file\n" 351" while with a ',' the shell would not expand the 2nd '~'.\n" 352" When using only one filename, UML will detect whether to treat it like\n" 353" a COW file or a backing file. To override this detection, add the 'd'\n" 354" flag:\n" 355" ubd0d=BackingFile\n" 356" Usually, there is a filesystem in the file, but \n" 357" that's not required. Swap devices containing swap files can be\n" 358" specified like this. Also, a file which doesn't contain a\n" 359" filesystem can have its contents read in the virtual \n" 360" machine by running 'dd' on the device. <n> must be in the range\n" 361" 0 to 7. Appending an 'r' to the number will cause that device\n" 362" to be mounted read-only. For example ubd1r=./ext_fs. Appending\n" 363" an 's' will cause data to be written to disk on the host immediately.\n" 364" 'c' will cause the device to be treated as being shared between multiple\n" 365" UMLs and file locking will be turned off - this is appropriate for a\n" 366" cluster filesystem and inappropriate at almost all other times.\n\n" 367" 't' will disable trim/discard support on the device (enabled by default).\n\n" 368" An optional device serial number can be exposed using the serial parameter\n" 369" on the cmdline which is exposed as a sysfs entry. This is particularly\n" 370" useful when a unique number should be given to the device. Note when\n" 371" specifying a label, the filename2 must be also presented. It can be\n" 372" an empty string, in which case the backing file is not used:\n" 373" ubd0=File,,Serial\n" 374); 375 376static int udb_setup(char *str) 377{ 378 printk("udb%s specified on command line is almost certainly a ubd -> " 379 "udb TYPO\n", str); 380 return 1; 381} 382 383__setup("udb", udb_setup); 384__uml_help(udb_setup, 385"udb\n" 386" This option is here solely to catch ubd -> udb typos, which can be\n" 387" to impossible to catch visually unless you specifically look for\n" 388" them. The only result of any option starting with 'udb' is an error\n" 389" in the boot output.\n\n" 390); 391 392/* Only changed by ubd_init, which is an initcall. */ 393static int thread_fd = -1; 394 395/* Function to read several request pointers at a time 396* handling fractional reads if (and as) needed 397*/ 398 399static int bulk_req_safe_read( 400 int fd, 401 struct io_thread_req * (*request_buffer)[], 402 struct io_thread_req **remainder, 403 int *remainder_size, 404 int max_recs 405 ) 406{ 407 int n = 0; 408 int res = 0; 409 410 if (*remainder_size > 0) { 411 memmove( 412 (char *) request_buffer, 413 (char *) remainder, *remainder_size 414 ); 415 n = *remainder_size; 416 } 417 418 res = os_read_file( 419 fd, 420 ((char *) request_buffer) + *remainder_size, 421 sizeof(struct io_thread_req *)*max_recs 422 - *remainder_size 423 ); 424 if (res > 0) { 425 n += res; 426 if ((n % sizeof(struct io_thread_req *)) > 0) { 427 /* 428 * Read somehow returned not a multiple of dword 429 * theoretically possible, but never observed in the 430 * wild, so read routine must be able to handle it 431 */ 432 *remainder_size = n % sizeof(struct io_thread_req *); 433 WARN(*remainder_size > 0, "UBD IPC read returned a partial result"); 434 memmove( 435 remainder, 436 ((char *) request_buffer) + 437 (n/sizeof(struct io_thread_req *))*sizeof(struct io_thread_req *), 438 *remainder_size 439 ); 440 n = n - *remainder_size; 441 } 442 } else { 443 n = res; 444 } 445 return n; 446} 447 448static void ubd_end_request(struct io_thread_req *io_req) 449{ 450 if (io_req->error == BLK_STS_NOTSUPP) { 451 if (req_op(io_req->req) == REQ_OP_DISCARD) 452 blk_queue_disable_discard(io_req->req->q); 453 else if (req_op(io_req->req) == REQ_OP_WRITE_ZEROES) 454 blk_queue_disable_write_zeroes(io_req->req->q); 455 } 456 blk_mq_end_request(io_req->req, io_req->error); 457 kfree(io_req); 458} 459 460static irqreturn_t ubd_intr(int irq, void *dev) 461{ 462 int len, i; 463 464 while ((len = bulk_req_safe_read(thread_fd, irq_req_buffer, 465 &irq_remainder, &irq_remainder_size, 466 UBD_REQ_BUFFER_SIZE)) >= 0) { 467 for (i = 0; i < len / sizeof(struct io_thread_req *); i++) 468 ubd_end_request((*irq_req_buffer)[i]); 469 } 470 471 if (len < 0 && len != -EAGAIN) 472 pr_err("spurious interrupt in %s, err = %d\n", __func__, len); 473 return IRQ_HANDLED; 474} 475 476/* Only changed by ubd_init, which is an initcall. */ 477static int io_pid = -1; 478 479static void kill_io_thread(void) 480{ 481 if(io_pid != -1) 482 os_kill_process(io_pid, 1); 483} 484 485__uml_exitcall(kill_io_thread); 486 487static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) 488{ 489 char *file; 490 int fd; 491 int err; 492 493 __u32 version; 494 __u32 align; 495 char *backing_file; 496 time64_t mtime; 497 unsigned long long size; 498 int sector_size; 499 int bitmap_offset; 500 501 if (ubd_dev->file && ubd_dev->cow.file) { 502 file = ubd_dev->cow.file; 503 504 goto out; 505 } 506 507 fd = os_open_file(ubd_dev->file, of_read(OPENFLAGS()), 0); 508 if (fd < 0) 509 return fd; 510 511 err = read_cow_header(file_reader, &fd, &version, &backing_file, \ 512 &mtime, &size, &sector_size, &align, &bitmap_offset); 513 os_close_file(fd); 514 515 if(err == -EINVAL) 516 file = ubd_dev->file; 517 else 518 file = backing_file; 519 520out: 521 return os_file_size(file, size_out); 522} 523 524static int read_cow_bitmap(int fd, void *buf, int offset, int len) 525{ 526 int err; 527 528 err = os_pread_file(fd, buf, len, offset); 529 if (err < 0) 530 return err; 531 532 return 0; 533} 534 535static int backing_file_mismatch(char *file, __u64 size, time64_t mtime) 536{ 537 time64_t modtime; 538 unsigned long long actual; 539 int err; 540 541 err = os_file_modtime(file, &modtime); 542 if (err < 0) { 543 printk(KERN_ERR "Failed to get modification time of backing " 544 "file \"%s\", err = %d\n", file, -err); 545 return err; 546 } 547 548 err = os_file_size(file, &actual); 549 if (err < 0) { 550 printk(KERN_ERR "Failed to get size of backing file \"%s\", " 551 "err = %d\n", file, -err); 552 return err; 553 } 554 555 if (actual != size) { 556 /*__u64 can be a long on AMD64 and with %lu GCC complains; so 557 * the typecast.*/ 558 printk(KERN_ERR "Size mismatch (%llu vs %llu) of COW header " 559 "vs backing file\n", (unsigned long long) size, actual); 560 return -EINVAL; 561 } 562 if (modtime != mtime) { 563 printk(KERN_ERR "mtime mismatch (%lld vs %lld) of COW header vs " 564 "backing file\n", mtime, modtime); 565 return -EINVAL; 566 } 567 return 0; 568} 569 570static int path_requires_switch(char *from_cmdline, char *from_cow, char *cow) 571{ 572 struct uml_stat buf1, buf2; 573 int err; 574 575 if (from_cmdline == NULL) 576 return 0; 577 if (!strcmp(from_cmdline, from_cow)) 578 return 0; 579 580 err = os_stat_file(from_cmdline, &buf1); 581 if (err < 0) { 582 printk(KERN_ERR "Couldn't stat '%s', err = %d\n", from_cmdline, 583 -err); 584 return 0; 585 } 586 err = os_stat_file(from_cow, &buf2); 587 if (err < 0) { 588 printk(KERN_ERR "Couldn't stat '%s', err = %d\n", from_cow, 589 -err); 590 return 1; 591 } 592 if ((buf1.ust_dev == buf2.ust_dev) && (buf1.ust_ino == buf2.ust_ino)) 593 return 0; 594 595 printk(KERN_ERR "Backing file mismatch - \"%s\" requested, " 596 "\"%s\" specified in COW header of \"%s\"\n", 597 from_cmdline, from_cow, cow); 598 return 1; 599} 600 601static int open_ubd_file(char *file, struct openflags *openflags, int shared, 602 char **backing_file_out, int *bitmap_offset_out, 603 unsigned long *bitmap_len_out, int *data_offset_out, 604 int *create_cow_out) 605{ 606 time64_t mtime; 607 unsigned long long size; 608 __u32 version, align; 609 char *backing_file; 610 int fd, err, sectorsize, asked_switch, mode = 0644; 611 612 fd = os_open_file(file, *openflags, mode); 613 if (fd < 0) { 614 if ((fd == -ENOENT) && (create_cow_out != NULL)) 615 *create_cow_out = 1; 616 if (!openflags->w || 617 ((fd != -EROFS) && (fd != -EACCES))) 618 return fd; 619 openflags->w = 0; 620 fd = os_open_file(file, *openflags, mode); 621 if (fd < 0) 622 return fd; 623 } 624 625 if (shared) 626 printk(KERN_INFO "Not locking \"%s\" on the host\n", file); 627 else { 628 err = os_lock_file(fd, openflags->w); 629 if (err < 0) { 630 printk(KERN_ERR "Failed to lock '%s', err = %d\n", 631 file, -err); 632 goto out_close; 633 } 634 } 635 636 /* Successful return case! */ 637 if (backing_file_out == NULL) 638 return fd; 639 640 err = read_cow_header(file_reader, &fd, &version, &backing_file, &mtime, 641 &size, &sectorsize, &align, bitmap_offset_out); 642 if (err && (*backing_file_out != NULL)) { 643 printk(KERN_ERR "Failed to read COW header from COW file " 644 "\"%s\", errno = %d\n", file, -err); 645 goto out_close; 646 } 647 if (err) 648 return fd; 649 650 asked_switch = path_requires_switch(*backing_file_out, backing_file, 651 file); 652 653 /* Allow switching only if no mismatch. */ 654 if (asked_switch && !backing_file_mismatch(*backing_file_out, size, 655 mtime)) { 656 printk(KERN_ERR "Switching backing file to '%s'\n", 657 *backing_file_out); 658 err = write_cow_header(file, fd, *backing_file_out, 659 sectorsize, align, &size); 660 if (err) { 661 printk(KERN_ERR "Switch failed, errno = %d\n", -err); 662 goto out_close; 663 } 664 } else { 665 *backing_file_out = backing_file; 666 err = backing_file_mismatch(*backing_file_out, size, mtime); 667 if (err) 668 goto out_close; 669 } 670 671 cow_sizes(version, size, sectorsize, align, *bitmap_offset_out, 672 bitmap_len_out, data_offset_out); 673 674 return fd; 675 out_close: 676 os_close_file(fd); 677 return err; 678} 679 680static int create_cow_file(char *cow_file, char *backing_file, 681 struct openflags flags, 682 int sectorsize, int alignment, int *bitmap_offset_out, 683 unsigned long *bitmap_len_out, int *data_offset_out) 684{ 685 int err, fd; 686 687 flags.c = 1; 688 fd = open_ubd_file(cow_file, &flags, 0, NULL, NULL, NULL, NULL, NULL); 689 if (fd < 0) { 690 err = fd; 691 printk(KERN_ERR "Open of COW file '%s' failed, errno = %d\n", 692 cow_file, -err); 693 goto out; 694 } 695 696 err = init_cow_file(fd, cow_file, backing_file, sectorsize, alignment, 697 bitmap_offset_out, bitmap_len_out, 698 data_offset_out); 699 if (!err) 700 return fd; 701 os_close_file(fd); 702 out: 703 return err; 704} 705 706static void ubd_close_dev(struct ubd *ubd_dev) 707{ 708 os_close_file(ubd_dev->fd); 709 if(ubd_dev->cow.file == NULL) 710 return; 711 712 os_close_file(ubd_dev->cow.fd); 713 vfree(ubd_dev->cow.bitmap); 714 ubd_dev->cow.bitmap = NULL; 715} 716 717static int ubd_open_dev(struct ubd *ubd_dev) 718{ 719 struct openflags flags; 720 char **back_ptr; 721 int err, create_cow, *create_ptr; 722 int fd; 723 724 ubd_dev->openflags = ubd_dev->boot_openflags; 725 create_cow = 0; 726 create_ptr = (ubd_dev->cow.file != NULL) ? &create_cow : NULL; 727 back_ptr = ubd_dev->no_cow ? NULL : &ubd_dev->cow.file; 728 729 fd = open_ubd_file(ubd_dev->file, &ubd_dev->openflags, ubd_dev->shared, 730 back_ptr, &ubd_dev->cow.bitmap_offset, 731 &ubd_dev->cow.bitmap_len, &ubd_dev->cow.data_offset, 732 create_ptr); 733 734 if((fd == -ENOENT) && create_cow){ 735 fd = create_cow_file(ubd_dev->file, ubd_dev->cow.file, 736 ubd_dev->openflags, SECTOR_SIZE, PAGE_SIZE, 737 &ubd_dev->cow.bitmap_offset, 738 &ubd_dev->cow.bitmap_len, 739 &ubd_dev->cow.data_offset); 740 if(fd >= 0){ 741 printk(KERN_INFO "Creating \"%s\" as COW file for " 742 "\"%s\"\n", ubd_dev->file, ubd_dev->cow.file); 743 } 744 } 745 746 if(fd < 0){ 747 printk("Failed to open '%s', errno = %d\n", ubd_dev->file, 748 -fd); 749 return fd; 750 } 751 ubd_dev->fd = fd; 752 753 if(ubd_dev->cow.file != NULL){ 754 err = -ENOMEM; 755 ubd_dev->cow.bitmap = vmalloc(ubd_dev->cow.bitmap_len); 756 if(ubd_dev->cow.bitmap == NULL){ 757 printk(KERN_ERR "Failed to vmalloc COW bitmap\n"); 758 goto error; 759 } 760 761 err = read_cow_bitmap(ubd_dev->fd, ubd_dev->cow.bitmap, 762 ubd_dev->cow.bitmap_offset, 763 ubd_dev->cow.bitmap_len); 764 if(err < 0) 765 goto error; 766 767 flags = ubd_dev->openflags; 768 flags.w = 0; 769 err = open_ubd_file(ubd_dev->cow.file, &flags, ubd_dev->shared, NULL, 770 NULL, NULL, NULL, NULL); 771 if(err < 0) goto error; 772 ubd_dev->cow.fd = err; 773 } 774 return 0; 775 error: 776 os_close_file(ubd_dev->fd); 777 return err; 778} 779 780static void ubd_device_release(struct device *dev) 781{ 782 struct ubd *ubd_dev = container_of(dev, struct ubd, pdev.dev); 783 784 blk_mq_free_tag_set(&ubd_dev->tag_set); 785 *ubd_dev = ((struct ubd) DEFAULT_UBD); 786} 787 788static ssize_t serial_show(struct device *dev, 789 struct device_attribute *attr, char *buf) 790{ 791 struct gendisk *disk = dev_to_disk(dev); 792 struct ubd *ubd_dev = disk->private_data; 793 794 if (!ubd_dev) 795 return 0; 796 797 return sprintf(buf, "%s", ubd_dev->serial); 798} 799 800static DEVICE_ATTR_RO(serial); 801 802static struct attribute *ubd_attrs[] = { 803 &dev_attr_serial.attr, 804 NULL, 805}; 806 807static umode_t ubd_attrs_are_visible(struct kobject *kobj, 808 struct attribute *a, int n) 809{ 810 return a->mode; 811} 812 813static const struct attribute_group ubd_attr_group = { 814 .attrs = ubd_attrs, 815 .is_visible = ubd_attrs_are_visible, 816}; 817 818static const struct attribute_group *ubd_attr_groups[] = { 819 &ubd_attr_group, 820 NULL, 821}; 822 823#define ROUND_BLOCK(n) ((n + (SECTOR_SIZE - 1)) & (-SECTOR_SIZE)) 824 825static const struct blk_mq_ops ubd_mq_ops = { 826 .queue_rq = ubd_queue_rq, 827}; 828 829static int ubd_add(int n, char **error_out) 830{ 831 struct ubd *ubd_dev = &ubd_devs[n]; 832 struct queue_limits lim = { 833 .max_segments = MAX_SG, 834 .seg_boundary_mask = PAGE_SIZE - 1, 835 .features = BLK_FEAT_WRITE_CACHE, 836 }; 837 struct gendisk *disk; 838 int err = 0; 839 840 if(ubd_dev->file == NULL) 841 goto out; 842 843 if (ubd_dev->cow.file) 844 lim.max_hw_sectors = 8 * sizeof(long); 845 if (!ubd_dev->no_trim) { 846 lim.max_hw_discard_sectors = UBD_MAX_REQUEST; 847 lim.max_write_zeroes_sectors = UBD_MAX_REQUEST; 848 } 849 850 err = ubd_file_size(ubd_dev, &ubd_dev->size); 851 if(err < 0){ 852 *error_out = "Couldn't determine size of device's file"; 853 goto out; 854 } 855 856 err = ubd_open_dev(ubd_dev); 857 if (err) { 858 pr_err("ubd%c: Can't open \"%s\": errno = %d\n", 859 'a' + n, ubd_dev->file, -err); 860 goto out; 861 } 862 863 ubd_dev->size = ROUND_BLOCK(ubd_dev->size); 864 865 ubd_dev->tag_set.ops = &ubd_mq_ops; 866 ubd_dev->tag_set.queue_depth = 64; 867 ubd_dev->tag_set.numa_node = NUMA_NO_NODE; 868 ubd_dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; 869 ubd_dev->tag_set.driver_data = ubd_dev; 870 ubd_dev->tag_set.nr_hw_queues = 1; 871 872 err = blk_mq_alloc_tag_set(&ubd_dev->tag_set); 873 if (err) 874 goto out_close; 875 876 disk = blk_mq_alloc_disk(&ubd_dev->tag_set, &lim, ubd_dev); 877 if (IS_ERR(disk)) { 878 err = PTR_ERR(disk); 879 goto out_cleanup_tags; 880 } 881 882 disk->major = UBD_MAJOR; 883 disk->first_minor = n << UBD_SHIFT; 884 disk->minors = 1 << UBD_SHIFT; 885 disk->fops = &ubd_blops; 886 set_capacity(disk, ubd_dev->size / 512); 887 sprintf(disk->disk_name, "ubd%c", 'a' + n); 888 disk->private_data = ubd_dev; 889 set_disk_ro(disk, !ubd_dev->openflags.w); 890 891 ubd_dev->pdev.id = n; 892 ubd_dev->pdev.name = DRIVER_NAME; 893 ubd_dev->pdev.dev.release = ubd_device_release; 894 dev_set_drvdata(&ubd_dev->pdev.dev, ubd_dev); 895 platform_device_register(&ubd_dev->pdev); 896 897 err = device_add_disk(&ubd_dev->pdev.dev, disk, ubd_attr_groups); 898 if (err) 899 goto out_cleanup_disk; 900 901 ubd_dev->disk = disk; 902 903 return 0; 904 905out_cleanup_disk: 906 put_disk(disk); 907out_cleanup_tags: 908 blk_mq_free_tag_set(&ubd_dev->tag_set); 909out_close: 910 ubd_close_dev(ubd_dev); 911out: 912 return err; 913} 914 915static int ubd_config(char *str, char **error_out) 916{ 917 int n, ret; 918 919 /* This string is possibly broken up and stored, so it's only 920 * freed if ubd_setup_common fails, or if only general options 921 * were set. 922 */ 923 str = kstrdup(str, GFP_KERNEL); 924 if (str == NULL) { 925 *error_out = "Failed to allocate memory"; 926 return -ENOMEM; 927 } 928 929 ret = ubd_setup_common(str, &n, error_out); 930 if (ret) 931 goto err_free; 932 933 if (n == -1) { 934 ret = 0; 935 goto err_free; 936 } 937 938 mutex_lock(&ubd_lock); 939 ret = ubd_add(n, error_out); 940 if (ret) 941 ubd_devs[n].file = NULL; 942 mutex_unlock(&ubd_lock); 943 944out: 945 return ret; 946 947err_free: 948 kfree(str); 949 goto out; 950} 951 952static int ubd_get_config(char *name, char *str, int size, char **error_out) 953{ 954 struct ubd *ubd_dev; 955 int n, len = 0; 956 957 n = parse_unit(&name); 958 if((n >= MAX_DEV) || (n < 0)){ 959 *error_out = "ubd_get_config : device number out of range"; 960 return -1; 961 } 962 963 ubd_dev = &ubd_devs[n]; 964 mutex_lock(&ubd_lock); 965 966 if(ubd_dev->file == NULL){ 967 CONFIG_CHUNK(str, size, len, "", 1); 968 goto out; 969 } 970 971 CONFIG_CHUNK(str, size, len, ubd_dev->file, 0); 972 973 if(ubd_dev->cow.file != NULL){ 974 CONFIG_CHUNK(str, size, len, ",", 0); 975 CONFIG_CHUNK(str, size, len, ubd_dev->cow.file, 1); 976 } 977 else CONFIG_CHUNK(str, size, len, "", 1); 978 979 out: 980 mutex_unlock(&ubd_lock); 981 return len; 982} 983 984static int ubd_id(char **str, int *start_out, int *end_out) 985{ 986 int n; 987 988 n = parse_unit(str); 989 *start_out = 0; 990 *end_out = MAX_DEV - 1; 991 return n; 992} 993 994static int ubd_remove(int n, char **error_out) 995{ 996 struct ubd *ubd_dev; 997 int err = -ENODEV; 998 999 mutex_lock(&ubd_lock); 1000 1001 ubd_dev = &ubd_devs[n]; 1002 1003 if(ubd_dev->file == NULL) 1004 goto out; 1005 1006 if (ubd_dev->disk) { 1007 /* you cannot remove a open disk */ 1008 err = -EBUSY; 1009 if (disk_openers(ubd_dev->disk)) 1010 goto out; 1011 1012 del_gendisk(ubd_dev->disk); 1013 ubd_close_dev(ubd_dev); 1014 put_disk(ubd_dev->disk); 1015 } 1016 1017 err = 0; 1018 platform_device_unregister(&ubd_dev->pdev); 1019out: 1020 mutex_unlock(&ubd_lock); 1021 return err; 1022} 1023 1024/* All these are called by mconsole in process context and without 1025 * ubd-specific locks. The structure itself is const except for .list. 1026 */ 1027static struct mc_device ubd_mc = { 1028 .list = LIST_HEAD_INIT(ubd_mc.list), 1029 .name = "ubd", 1030 .config = ubd_config, 1031 .get_config = ubd_get_config, 1032 .id = ubd_id, 1033 .remove = ubd_remove, 1034}; 1035 1036static int __init ubd_mc_init(void) 1037{ 1038 mconsole_register_dev(&ubd_mc); 1039 return 0; 1040} 1041 1042__initcall(ubd_mc_init); 1043 1044static int __init ubd0_init(void) 1045{ 1046 struct ubd *ubd_dev = &ubd_devs[0]; 1047 1048 mutex_lock(&ubd_lock); 1049 if(ubd_dev->file == NULL) 1050 ubd_dev->file = "root_fs"; 1051 mutex_unlock(&ubd_lock); 1052 1053 return 0; 1054} 1055 1056__initcall(ubd0_init); 1057 1058/* Used in ubd_init, which is an initcall */ 1059static struct platform_driver ubd_driver = { 1060 .driver = { 1061 .name = DRIVER_NAME, 1062 }, 1063}; 1064 1065static int __init ubd_init(void) 1066{ 1067 char *error; 1068 int i, err; 1069 1070 if (register_blkdev(UBD_MAJOR, "ubd")) 1071 return -1; 1072 1073 irq_req_buffer = kmalloc_array(UBD_REQ_BUFFER_SIZE, 1074 sizeof(struct io_thread_req *), 1075 GFP_KERNEL 1076 ); 1077 irq_remainder = 0; 1078 1079 if (irq_req_buffer == NULL) { 1080 printk(KERN_ERR "Failed to initialize ubd buffering\n"); 1081 return -ENOMEM; 1082 } 1083 io_req_buffer = kmalloc_array(UBD_REQ_BUFFER_SIZE, 1084 sizeof(struct io_thread_req *), 1085 GFP_KERNEL 1086 ); 1087 1088 io_remainder = 0; 1089 1090 if (io_req_buffer == NULL) { 1091 printk(KERN_ERR "Failed to initialize ubd buffering\n"); 1092 return -ENOMEM; 1093 } 1094 platform_driver_register(&ubd_driver); 1095 mutex_lock(&ubd_lock); 1096 for (i = 0; i < MAX_DEV; i++){ 1097 err = ubd_add(i, &error); 1098 if(err) 1099 printk(KERN_ERR "Failed to initialize ubd device %d :" 1100 "%s\n", i, error); 1101 } 1102 mutex_unlock(&ubd_lock); 1103 return 0; 1104} 1105 1106late_initcall(ubd_init); 1107 1108static int __init ubd_driver_init(void){ 1109 unsigned long stack; 1110 int err; 1111 1112 /* Set by CONFIG_BLK_DEV_UBD_SYNC or ubd=sync.*/ 1113 if(global_openflags.s){ 1114 printk(KERN_INFO "ubd: Synchronous mode\n"); 1115 /* Letting ubd=sync be like using ubd#s= instead of ubd#= is 1116 * enough. So use anyway the io thread. */ 1117 } 1118 stack = alloc_stack(0, 0); 1119 io_pid = start_io_thread(stack + PAGE_SIZE, &thread_fd); 1120 if(io_pid < 0){ 1121 printk(KERN_ERR 1122 "ubd : Failed to start I/O thread (errno = %d) - " 1123 "falling back to synchronous I/O\n", -io_pid); 1124 io_pid = -1; 1125 return 0; 1126 } 1127 err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, 1128 0, "ubd", ubd_devs); 1129 if(err < 0) 1130 printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); 1131 return 0; 1132} 1133 1134device_initcall(ubd_driver_init); 1135 1136static void cowify_bitmap(__u64 io_offset, int length, unsigned long *cow_mask, 1137 __u64 *cow_offset, unsigned long *bitmap, 1138 __u64 bitmap_offset, unsigned long *bitmap_words, 1139 __u64 bitmap_len) 1140{ 1141 __u64 sector = io_offset >> SECTOR_SHIFT; 1142 int i, update_bitmap = 0; 1143 1144 for (i = 0; i < length >> SECTOR_SHIFT; i++) { 1145 if(cow_mask != NULL) 1146 ubd_set_bit(i, (unsigned char *) cow_mask); 1147 if(ubd_test_bit(sector + i, (unsigned char *) bitmap)) 1148 continue; 1149 1150 update_bitmap = 1; 1151 ubd_set_bit(sector + i, (unsigned char *) bitmap); 1152 } 1153 1154 if(!update_bitmap) 1155 return; 1156 1157 *cow_offset = sector / (sizeof(unsigned long) * 8); 1158 1159 /* This takes care of the case where we're exactly at the end of the 1160 * device, and *cow_offset + 1 is off the end. So, just back it up 1161 * by one word. Thanks to Lynn Kerby for the fix and James McMechan 1162 * for the original diagnosis. 1163 */ 1164 if (*cow_offset == (DIV_ROUND_UP(bitmap_len, 1165 sizeof(unsigned long)) - 1)) 1166 (*cow_offset)--; 1167 1168 bitmap_words[0] = bitmap[*cow_offset]; 1169 bitmap_words[1] = bitmap[*cow_offset + 1]; 1170 1171 *cow_offset *= sizeof(unsigned long); 1172 *cow_offset += bitmap_offset; 1173} 1174 1175static void cowify_req(struct io_thread_req *req, struct io_desc *segment, 1176 unsigned long offset, unsigned long *bitmap, 1177 __u64 bitmap_offset, __u64 bitmap_len) 1178{ 1179 __u64 sector = offset >> SECTOR_SHIFT; 1180 int i; 1181 1182 if (segment->length > (sizeof(segment->sector_mask) * 8) << SECTOR_SHIFT) 1183 panic("Operation too long"); 1184 1185 if (req_op(req->req) == REQ_OP_READ) { 1186 for (i = 0; i < segment->length >> SECTOR_SHIFT; i++) { 1187 if(ubd_test_bit(sector + i, (unsigned char *) bitmap)) 1188 ubd_set_bit(i, (unsigned char *) 1189 &segment->sector_mask); 1190 } 1191 } else { 1192 cowify_bitmap(offset, segment->length, &segment->sector_mask, 1193 &segment->cow_offset, bitmap, bitmap_offset, 1194 segment->bitmap_words, bitmap_len); 1195 } 1196} 1197 1198static void ubd_map_req(struct ubd *dev, struct io_thread_req *io_req, 1199 struct request *req) 1200{ 1201 struct bio_vec bvec; 1202 struct req_iterator iter; 1203 int i = 0; 1204 unsigned long byte_offset = io_req->offset; 1205 enum req_op op = req_op(req); 1206 1207 if (op == REQ_OP_WRITE_ZEROES || op == REQ_OP_DISCARD) { 1208 io_req->io_desc[0].buffer = NULL; 1209 io_req->io_desc[0].length = blk_rq_bytes(req); 1210 } else { 1211 rq_for_each_segment(bvec, req, iter) { 1212 BUG_ON(i >= io_req->desc_cnt); 1213 1214 io_req->io_desc[i].buffer = bvec_virt(&bvec); 1215 io_req->io_desc[i].length = bvec.bv_len; 1216 i++; 1217 } 1218 } 1219 1220 if (dev->cow.file) { 1221 for (i = 0; i < io_req->desc_cnt; i++) { 1222 cowify_req(io_req, &io_req->io_desc[i], byte_offset, 1223 dev->cow.bitmap, dev->cow.bitmap_offset, 1224 dev->cow.bitmap_len); 1225 byte_offset += io_req->io_desc[i].length; 1226 } 1227 1228 } 1229} 1230 1231static struct io_thread_req *ubd_alloc_req(struct ubd *dev, struct request *req, 1232 int desc_cnt) 1233{ 1234 struct io_thread_req *io_req; 1235 int i; 1236 1237 io_req = kmalloc(sizeof(*io_req) + 1238 (desc_cnt * sizeof(struct io_desc)), 1239 GFP_ATOMIC); 1240 if (!io_req) 1241 return NULL; 1242 1243 io_req->req = req; 1244 if (dev->cow.file) 1245 io_req->fds[0] = dev->cow.fd; 1246 else 1247 io_req->fds[0] = dev->fd; 1248 io_req->error = 0; 1249 io_req->sectorsize = SECTOR_SIZE; 1250 io_req->fds[1] = dev->fd; 1251 io_req->offset = (u64) blk_rq_pos(req) << SECTOR_SHIFT; 1252 io_req->offsets[0] = 0; 1253 io_req->offsets[1] = dev->cow.data_offset; 1254 1255 for (i = 0 ; i < desc_cnt; i++) { 1256 io_req->io_desc[i].sector_mask = 0; 1257 io_req->io_desc[i].cow_offset = -1; 1258 } 1259 1260 return io_req; 1261} 1262 1263static int ubd_submit_request(struct ubd *dev, struct request *req) 1264{ 1265 int segs = 0; 1266 struct io_thread_req *io_req; 1267 int ret; 1268 enum req_op op = req_op(req); 1269 1270 if (op == REQ_OP_FLUSH) 1271 segs = 0; 1272 else if (op == REQ_OP_WRITE_ZEROES || op == REQ_OP_DISCARD) 1273 segs = 1; 1274 else 1275 segs = blk_rq_nr_phys_segments(req); 1276 1277 io_req = ubd_alloc_req(dev, req, segs); 1278 if (!io_req) 1279 return -ENOMEM; 1280 1281 io_req->desc_cnt = segs; 1282 if (segs) 1283 ubd_map_req(dev, io_req, req); 1284 1285 ret = os_write_file(thread_fd, &io_req, sizeof(io_req)); 1286 if (ret != sizeof(io_req)) { 1287 if (ret != -EAGAIN) 1288 pr_err("write to io thread failed: %d\n", -ret); 1289 kfree(io_req); 1290 } 1291 return ret; 1292} 1293 1294static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx, 1295 const struct blk_mq_queue_data *bd) 1296{ 1297 struct ubd *ubd_dev = hctx->queue->queuedata; 1298 struct request *req = bd->rq; 1299 int ret = 0, res = BLK_STS_OK; 1300 1301 blk_mq_start_request(req); 1302 1303 spin_lock_irq(&ubd_dev->lock); 1304 1305 switch (req_op(req)) { 1306 case REQ_OP_FLUSH: 1307 case REQ_OP_READ: 1308 case REQ_OP_WRITE: 1309 case REQ_OP_DISCARD: 1310 case REQ_OP_WRITE_ZEROES: 1311 ret = ubd_submit_request(ubd_dev, req); 1312 break; 1313 default: 1314 WARN_ON_ONCE(1); 1315 res = BLK_STS_NOTSUPP; 1316 } 1317 1318 spin_unlock_irq(&ubd_dev->lock); 1319 1320 if (ret < 0) { 1321 if (ret == -ENOMEM) 1322 res = BLK_STS_RESOURCE; 1323 else 1324 res = BLK_STS_DEV_RESOURCE; 1325 } 1326 1327 return res; 1328} 1329 1330static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo) 1331{ 1332 struct ubd *ubd_dev = bdev->bd_disk->private_data; 1333 1334 geo->heads = 128; 1335 geo->sectors = 32; 1336 geo->cylinders = ubd_dev->size / (128 * 32 * 512); 1337 return 0; 1338} 1339 1340static int ubd_ioctl(struct block_device *bdev, blk_mode_t mode, 1341 unsigned int cmd, unsigned long arg) 1342{ 1343 struct ubd *ubd_dev = bdev->bd_disk->private_data; 1344 u16 ubd_id[ATA_ID_WORDS]; 1345 1346 switch (cmd) { 1347 struct cdrom_volctrl volume; 1348 case HDIO_GET_IDENTITY: 1349 memset(&ubd_id, 0, ATA_ID_WORDS * 2); 1350 ubd_id[ATA_ID_CYLS] = ubd_dev->size / (128 * 32 * 512); 1351 ubd_id[ATA_ID_HEADS] = 128; 1352 ubd_id[ATA_ID_SECTORS] = 32; 1353 if(copy_to_user((char __user *) arg, (char *) &ubd_id, 1354 sizeof(ubd_id))) 1355 return -EFAULT; 1356 return 0; 1357 1358 case CDROMVOLREAD: 1359 if(copy_from_user(&volume, (char __user *) arg, sizeof(volume))) 1360 return -EFAULT; 1361 volume.channel0 = 255; 1362 volume.channel1 = 255; 1363 volume.channel2 = 255; 1364 volume.channel3 = 255; 1365 if(copy_to_user((char __user *) arg, &volume, sizeof(volume))) 1366 return -EFAULT; 1367 return 0; 1368 } 1369 return -EINVAL; 1370} 1371 1372static int map_error(int error_code) 1373{ 1374 switch (error_code) { 1375 case 0: 1376 return BLK_STS_OK; 1377 case ENOSYS: 1378 case EOPNOTSUPP: 1379 return BLK_STS_NOTSUPP; 1380 case ENOSPC: 1381 return BLK_STS_NOSPC; 1382 } 1383 return BLK_STS_IOERR; 1384} 1385 1386/* 1387 * Everything from here onwards *IS NOT PART OF THE KERNEL* 1388 * 1389 * The following functions are part of UML hypervisor code. 1390 * All functions from here onwards are executed as a helper 1391 * thread and are not allowed to execute any kernel functions. 1392 * 1393 * Any communication must occur strictly via shared memory and IPC. 1394 * 1395 * Do not add printks, locks, kernel memory operations, etc - it 1396 * will result in unpredictable behaviour and/or crashes. 1397 */ 1398 1399static int update_bitmap(struct io_thread_req *req, struct io_desc *segment) 1400{ 1401 int n; 1402 1403 if (segment->cow_offset == -1) 1404 return map_error(0); 1405 1406 n = os_pwrite_file(req->fds[1], &segment->bitmap_words, 1407 sizeof(segment->bitmap_words), segment->cow_offset); 1408 if (n != sizeof(segment->bitmap_words)) 1409 return map_error(-n); 1410 1411 return map_error(0); 1412} 1413 1414static void do_io(struct io_thread_req *req, struct io_desc *desc) 1415{ 1416 char *buf = NULL; 1417 unsigned long len; 1418 int n, nsectors, start, end, bit; 1419 __u64 off; 1420 1421 /* FLUSH is really a special case, we cannot "case" it with others */ 1422 1423 if (req_op(req->req) == REQ_OP_FLUSH) { 1424 /* fds[0] is always either the rw image or our cow file */ 1425 req->error = map_error(-os_sync_file(req->fds[0])); 1426 return; 1427 } 1428 1429 nsectors = desc->length / req->sectorsize; 1430 start = 0; 1431 do { 1432 bit = ubd_test_bit(start, (unsigned char *) &desc->sector_mask); 1433 end = start; 1434 while((end < nsectors) && 1435 (ubd_test_bit(end, (unsigned char *) &desc->sector_mask) == bit)) 1436 end++; 1437 1438 off = req->offset + req->offsets[bit] + 1439 start * req->sectorsize; 1440 len = (end - start) * req->sectorsize; 1441 if (desc->buffer != NULL) 1442 buf = &desc->buffer[start * req->sectorsize]; 1443 1444 switch (req_op(req->req)) { 1445 case REQ_OP_READ: 1446 n = 0; 1447 do { 1448 buf = &buf[n]; 1449 len -= n; 1450 n = os_pread_file(req->fds[bit], buf, len, off); 1451 if (n < 0) { 1452 req->error = map_error(-n); 1453 return; 1454 } 1455 } while((n < len) && (n != 0)); 1456 if (n < len) memset(&buf[n], 0, len - n); 1457 break; 1458 case REQ_OP_WRITE: 1459 n = os_pwrite_file(req->fds[bit], buf, len, off); 1460 if(n != len){ 1461 req->error = map_error(-n); 1462 return; 1463 } 1464 break; 1465 case REQ_OP_DISCARD: 1466 n = os_falloc_punch(req->fds[bit], off, len); 1467 if (n) { 1468 req->error = map_error(-n); 1469 return; 1470 } 1471 break; 1472 case REQ_OP_WRITE_ZEROES: 1473 n = os_falloc_zeroes(req->fds[bit], off, len); 1474 if (n) { 1475 req->error = map_error(-n); 1476 return; 1477 } 1478 break; 1479 default: 1480 WARN_ON_ONCE(1); 1481 req->error = BLK_STS_NOTSUPP; 1482 return; 1483 } 1484 1485 start = end; 1486 } while(start < nsectors); 1487 1488 req->offset += len; 1489 req->error = update_bitmap(req, desc); 1490} 1491 1492/* Changed in start_io_thread, which is serialized by being called only 1493 * from ubd_init, which is an initcall. 1494 */ 1495int kernel_fd = -1; 1496 1497/* Only changed by the io thread. XXX: currently unused. */ 1498static int io_count; 1499 1500int io_thread(void *arg) 1501{ 1502 int n, count, written, res; 1503 1504 os_set_pdeathsig(); 1505 os_fix_helper_signals(); 1506 1507 while(1){ 1508 n = bulk_req_safe_read( 1509 kernel_fd, 1510 io_req_buffer, 1511 &io_remainder, 1512 &io_remainder_size, 1513 UBD_REQ_BUFFER_SIZE 1514 ); 1515 if (n <= 0) { 1516 if (n == -EAGAIN) 1517 ubd_read_poll(-1); 1518 1519 continue; 1520 } 1521 1522 for (count = 0; count < n/sizeof(struct io_thread_req *); count++) { 1523 struct io_thread_req *req = (*io_req_buffer)[count]; 1524 int i; 1525 1526 io_count++; 1527 for (i = 0; !req->error && i < req->desc_cnt; i++) 1528 do_io(req, &(req->io_desc[i])); 1529 1530 } 1531 1532 written = 0; 1533 1534 do { 1535 res = os_write_file(kernel_fd, 1536 ((char *) io_req_buffer) + written, 1537 n - written); 1538 if (res >= 0) { 1539 written += res; 1540 } 1541 if (written < n) { 1542 ubd_write_poll(-1); 1543 } 1544 } while (written < n); 1545 } 1546 1547 return 0; 1548}