22 #include <linux/module.h>
27 #include <linux/cdrom.h>
30 #include <linux/ctype.h>
31 #include <linux/slab.h>
35 #include <asm/tlbflush.h>
61 static inline int ubd_test_bit(
__u64 bit,
unsigned char *
data)
66 bits =
sizeof(data[0]) * 8;
69 return (data[n] & (1 << off)) != 0;
72 static inline void ubd_set_bit(
__u64 bit,
unsigned char *
data)
77 bits =
sizeof(data[0]) * 8;
80 data[
n] |= (1 << off);
84 #define DRIVER_NAME "uml-blkdev"
90 static int ubd_release(
struct gendisk *disk,
fmode_t mode);
92 unsigned int cmd,
unsigned long arg);
97 static const struct block_device_operations ubd_blops = {
100 .release = ubd_release,
102 .getgeo = ubd_getgeo,
107 static struct gendisk *ubd_gendisk[
MAX_DEV];
108 static struct gendisk *fake_gendisk[
MAX_DEV];
110 #ifdef CONFIG_BLK_DEV_UBD_SYNC
111 #define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0, \
114 #define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0, \
154 #define DEFAULT_COW { \
158 .bitmap_offset = 0, \
162 #define DEFAULT_UBD { \
167 .boot_openflags = OPEN_FLAGS, \
168 .openflags = OPEN_FLAGS, \
171 .cow = DEFAULT_COW, \
172 .lock = __SPIN_LOCK_UNLOCKED(ubd_devs.lock), \
183 static int fake_ide = 0;
187 static void make_proc_ide(
void)
193 static int fake_ide_media_proc_show(
struct seq_file *
m,
void *
v)
206 .open = fake_ide_media_proc_open,
212 static void make_ide_entries(
const char *dev_name)
217 if(proc_ide_root ==
NULL) make_proc_ide();
222 ent = proc_create(
"media",
S_IRUGO, dir, &fake_ide_media_proc_fops);
224 snprintf(name,
sizeof(name),
"ide0/%s", dev_name);
228 static int fake_ide_setup(
char *
str)
234 __setup(
"fake_ide", fake_ide_setup);
238 " Create ide0 entries that map onto ubd devices.\n\n"
241 static int parse_unit(
char **
ptr)
252 else if ((
'a' <= *str) && (*str <=
'z')) {
264 static int ubd_setup_common(
char *str,
int *index_out,
char **error_out)
271 if(index_out) *index_out = -1;
279 global_openflags = of_sync(global_openflags);
285 if((*end !=
'\0') || (end == str)){
286 *error_out =
"Didn't parse major number";
292 *error_out =
"Can't assign a fake major twice";
306 n = parse_unit(&str);
308 *error_out =
"Couldn't parse device number";
312 *error_out =
"Device number out of range";
319 ubd_dev = &ubd_devs[
n];
321 *error_out =
"Device is already configured";
329 for (
i = 0;
i <
sizeof(
"rscd=");
i++) {
347 *error_out =
"Expected '=' or flag letter "
355 *error_out =
"Too many flags specified";
357 *error_out =
"Missing '='";
361 backing_file =
strchr(str,
',');
363 if (backing_file ==
NULL)
364 backing_file =
strchr(str,
':');
366 if(backing_file !=
NULL){
368 *error_out =
"Can't specify both 'd' and a cow file";
372 *backing_file =
'\0';
385 static int ubd_setup(
char *str)
390 err = ubd_setup_common(str,
NULL, &error);
399 "ubd<n><flags>=<filename>[(:|,)<filename2>]\n"
400 " This is used to associate a device with a file in the underlying\n"
401 " filesystem. When specifying two filenames, the first one is the\n"
402 " COW name and the second is the backing file name. As separator you can\n"
403 " use either a ':' or a ',': the first one allows writing things like;\n"
404 " ubd0=~/Uml/root_cow:~/Uml/root_backing_file\n"
405 " while with a ',' the shell would not expand the 2nd '~'.\n"
406 " When using only one filename, UML will detect whether to treat it like\n"
407 " a COW file or a backing file. To override this detection, add the 'd'\n"
409 " ubd0d=BackingFile\n"
410 " Usually, there is a filesystem in the file, but \n"
411 " that's not required. Swap devices containing swap files can be\n"
412 " specified like this. Also, a file which doesn't contain a\n"
413 " filesystem can have its contents read in the virtual \n"
414 " machine by running 'dd' on the device. <n> must be in the range\n"
415 " 0 to 7. Appending an 'r' to the number will cause that device\n"
416 " to be mounted read-only. For example ubd1r=./ext_fs. Appending\n"
417 " an 's' will cause data to be written to disk on the host immediately.\n"
418 " 'c' will cause the device to be treated as being shared between multiple\n"
419 " UMLs and file locking will be turned off - this is appropriate for a\n"
420 " cluster filesystem and inappropriate at almost all other times.\n\n"
423 static int udb_setup(
char *str)
425 printk(
"udb%s specified on command line is almost certainly a ubd -> "
433 " This option is here solely to catch ubd -> udb typos, which can be\n"
434 " to impossible to catch visually unless you specifically look for\n"
435 " them. The only result of any option starting with 'udb' is an error\n"
436 " in the boot output.\n\n"
442 static int thread_fd = -1;
447 static void ubd_handler(
void)
458 if(n !=
sizeof(req)){
475 do_ubd_request(ubd->
queue);
476 spin_unlock_irqrestore(&ubd->
lock, flags);
487 static int io_pid = -1;
489 static void kill_io_thread(
void)
497 static inline int ubd_file_size(
struct ubd *ubd_dev,
__u64 *size_out)
507 unsigned long long size;
511 if (ubd_dev->
file && ubd_dev->
cow.file) {
512 file = ubd_dev->
cow.file;
522 &mtime, &size, §or_size, &align, &bitmap_offset);
526 file = ubd_dev->
file;
534 static int read_cow_bitmap(
int fd,
void *
buf,
int offset,
int len)
549 static int backing_file_mismatch(
char *file,
__u64 size,
time_t mtime)
551 unsigned long modtime;
552 unsigned long long actual;
558 "file \"%s\", err = %d\n", file, -err);
565 "err = %d\n", file, -err);
569 if (actual != size) {
573 "vs backing file\n", (
unsigned long long) size, actual);
576 if (modtime != mtime) {
578 "backing file\n", mtime, modtime);
584 static int path_requires_switch(
char *from_cmdline,
char *from_cow,
char *
cow)
589 if (from_cmdline ==
NULL)
591 if (!
strcmp(from_cmdline, from_cow))
606 if ((buf1.ust_dev == buf2.ust_dev) && (buf1.ust_ino == buf2.ust_ino))
610 "\"%s\" specified in COW header of \"%s\"\n",
611 from_cmdline, from_cow, cow);
616 char **backing_file_out,
int *bitmap_offset_out,
617 unsigned long *bitmap_len_out,
int *data_offset_out,
621 unsigned long long size;
628 if ((fd == -
ENOENT) && (create_cow_out !=
NULL))
651 if (backing_file_out ==
NULL)
655 &size, §orsize, &align, bitmap_offset_out);
656 if (err && (*backing_file_out !=
NULL)) {
658 "\"%s\", errno = %d\n", file, -err);
664 asked_switch = path_requires_switch(*backing_file_out, backing_file,
668 if (asked_switch && !backing_file_mismatch(*backing_file_out, size,
673 sectorsize, align, &size);
680 err = backing_file_mismatch(*backing_file_out, size, mtime);
685 cow_sizes(version, size, sectorsize, align, *bitmap_offset_out,
686 bitmap_len_out, data_offset_out);
694 static int create_cow_file(
char *cow_file,
char *backing_file,
695 struct openflags flags,
696 int sectorsize,
int alignment,
int *bitmap_offset_out,
697 unsigned long *bitmap_len_out,
int *data_offset_out)
710 err =
init_cow_file(fd, cow_file, backing_file, sectorsize, alignment,
711 bitmap_offset_out, bitmap_len_out,
720 static void ubd_close_dev(
struct ubd *ubd_dev)
731 static int ubd_open_dev(
struct ubd *ubd_dev)
733 struct openflags flags;
735 int err, create_cow, *create_ptr;
740 create_ptr = (ubd_dev->
cow.file !=
NULL) ? &create_cow :
NULL;
744 back_ptr, &ubd_dev->
cow.bitmap_offset,
745 &ubd_dev->
cow.bitmap_len, &ubd_dev->
cow.data_offset,
748 if((fd == -
ENOENT) && create_cow){
749 fd = create_cow_file(ubd_dev->
file, ubd_dev->
cow.file,
751 &ubd_dev->
cow.bitmap_offset,
752 &ubd_dev->
cow.bitmap_len,
753 &ubd_dev->
cow.data_offset);
756 "\"%s\"\n", ubd_dev->
file, ubd_dev->
cow.file);
761 printk(
"Failed to open '%s', errno = %d\n", ubd_dev->
file,
772 if(ubd_dev->
cow.bitmap ==
NULL){
778 err = read_cow_bitmap(ubd_dev->
fd, ubd_dev->
cow.bitmap,
779 ubd_dev->
cow.bitmap_offset,
780 ubd_dev->
cow.bitmap_len);
786 err = open_ubd_file(ubd_dev->
cow.file, &flags, ubd_dev->
shared,
NULL,
788 if(err < 0)
goto error;
797 static void ubd_device_release(
struct device *
dev)
805 static int ubd_disk_register(
int major,
u64 size,
int unit,
806 struct gendisk **disk_out)
808 struct gendisk *disk;
816 disk->fops = &ubd_blops;
817 set_capacity(disk, size / 512);
819 sprintf(disk->disk_name,
"ubd%c",
'a' + unit);
821 sprintf(disk->disk_name,
"ubd_fake%d", unit);
827 ubd_devs[
unit].
pdev.dev.release = ubd_device_release;
830 disk->driverfs_dev = &ubd_devs[
unit].
pdev.dev;
833 disk->private_data = &ubd_devs[
unit];
841 #define ROUND_BLOCK(n) ((n + ((1 << 9) - 1)) & (-1 << 9))
843 static int ubd_add(
int n,
char **error_out)
845 struct ubd *ubd_dev = &ubd_devs[
n];
851 err = ubd_file_size(ubd_dev, &ubd_dev->
size);
853 *error_out =
"Couldn't determine size of device's file";
859 INIT_LIST_HEAD(&ubd_dev->
restart);
865 *error_out =
"Failed to initialize device queue";
868 ubd_dev->
queue->queuedata = ubd_dev;
871 err = ubd_disk_register(
UBD_MAJOR, ubd_dev->
size, n, &ubd_gendisk[n]);
873 *error_out =
"Failed to register device";
878 ubd_disk_register(fake_major, ubd_dev->
size, n,
886 make_ide_entries(ubd_gendisk[n]->
disk_name);
897 static int ubd_config(
char *str,
char **error_out)
907 *error_out =
"Failed to allocate memory";
911 ret = ubd_setup_common(str, &n, error_out);
921 ret = ubd_add(n, error_out);
934 static int ubd_get_config(
char *name,
char *str,
int size,
char **error_out)
939 n = parse_unit(&name);
941 *error_out =
"ubd_get_config : device number out of range";
945 ubd_dev = &ubd_devs[
n];
966 static int ubd_id(
char **str,
int *start_out,
int *end_out)
976 static int ubd_remove(
int n,
char **error_out)
978 struct gendisk *disk = ubd_gendisk[
n];
984 ubd_dev = &ubd_devs[
n];
991 if(ubd_dev->
count > 0)
994 ubd_gendisk[
n] =
NULL;
1000 if(fake_gendisk[n] !=
NULL){
1003 fake_gendisk[
n] =
NULL;
1019 .config = ubd_config,
1020 .get_config = ubd_get_config,
1022 .remove = ubd_remove,
1025 static int __init ubd_mc_init(
void)
1033 static int __init ubd0_init(
void)
1035 struct ubd *ubd_dev = &ubd_devs[0];
1039 ubd_dev->
file =
"root_fs";
1054 static int __init ubd_init(
void)
1063 char name[
sizeof(
"ubd_nnn\0")];
1065 snprintf(name,
sizeof(name),
"ubd_%d", fake_major);
1071 for (i = 0; i <
MAX_DEV; i++){
1072 err = ubd_add(i, &error);
1083 static int __init ubd_driver_init(
void){
1084 unsigned long stack;
1088 if(global_openflags.
s){
1098 "ubd : Failed to start I/O thread (errno = %d) - "
1099 "falling back to synchronous I/O\n", -io_pid);
1104 0,
"ubd", ubd_devs);
1114 struct gendisk *disk = bdev->
bd_disk;
1115 struct ubd *ubd_dev = disk->private_data;
1119 if(ubd_dev->
count == 0){
1120 err = ubd_open_dev(ubd_dev);
1123 disk->disk_name, ubd_dev->
file, -err);
1141 static int ubd_release(
struct gendisk *disk,
fmode_t mode)
1143 struct ubd *ubd_dev = disk->private_data;
1146 if(--ubd_dev->
count == 0)
1147 ubd_close_dev(ubd_dev);
1152 static void cowify_bitmap(
__u64 io_offset,
int length,
unsigned long *cow_mask,
1154 __u64 bitmap_offset,
unsigned long *bitmap_words,
1158 int i, update_bitmap = 0;
1160 for(i = 0; i < length >> 9; i++){
1161 if(cow_mask !=
NULL)
1162 ubd_set_bit(i, (
unsigned char *) cow_mask);
1163 if(ubd_test_bit(sector + i, (
unsigned char *) bitmap))
1167 ubd_set_bit(sector + i, (
unsigned char *) bitmap);
1173 *cow_offset = sector / (
sizeof(
unsigned long) * 8);
1181 sizeof(
unsigned long)) - 1))
1184 bitmap_words[0] = bitmap[*cow_offset];
1185 bitmap_words[1] = bitmap[*cow_offset + 1];
1187 *cow_offset *=
sizeof(
unsigned long);
1188 *cow_offset += bitmap_offset;
1191 static void cowify_req(
struct io_thread_req *req,
unsigned long *bitmap,
1198 panic(
"Operation too long");
1201 for(i = 0; i < req->
length >> 9; i++){
1202 if(ubd_test_bit(sector + i, (
unsigned char *) bitmap))
1203 ubd_set_bit(i, (
unsigned char *)
1217 struct gendisk *disk = req->rq_disk;
1218 struct ubd *ubd_dev = disk->private_data;
1221 io_req->
fds[0] = (ubd_dev->
cow.file !=
NULL) ? ubd_dev->
cow.fd :
1223 io_req->
fds[1] = ubd_dev->
fd;
1232 io_req->
offsets[1] = ubd_dev->
cow.data_offset;
1237 cowify_req(io_req, ubd_dev->
cow.bitmap,
1238 ubd_dev->
cow.bitmap_offset, ubd_dev->
cow.bitmap_len);
1250 struct ubd *
dev = q->queuedata;
1257 dev->
rq_pos = blk_rq_pos(req);
1273 prepare_request(req, io_req,
1274 (
unsigned long long)dev->
rq_pos << 9,
1281 printk(
"write to io thread failed, "
1282 "errno = %d\n", -n);
1283 else if(list_empty(&dev->
restart))
1299 struct ubd *ubd_dev = bdev->
bd_disk->private_data;
1308 unsigned int cmd,
unsigned long arg)
1310 struct ubd *ubd_dev = bdev->
bd_disk->private_data;
1348 printk(
"do_io - bitmap lseek failed : err = %d\n", -n);
1355 printk(
"do_io - bitmap update failed, err = %d fd = %d\n", -n,
1374 bit = ubd_test_bit(start, (
unsigned char *) &req->
sector_mask);
1376 while((end < nsectors) &&
1377 (ubd_test_bit(end, (
unsigned char *)
1388 printk(
"do_io - lseek failed : err = %d\n", -err);
1399 printk(
"do_io - read failed, err = %d "
1400 "fd = %d\n", -n, req->
fds[bit]);
1404 }
while((n < len) && (n != 0));
1405 if (n < len)
memset(&buf[n], 0, len - n);
1409 printk(
"do_io - write failed err = %d "
1410 "fd = %d\n", -n, req->
fds[bit]);
1417 }
while(start < nsectors);
1419 req->
error = update_bitmap(req);
1428 static int io_count = 0;
1441 printk(
"io_thread - read failed, fd = %d, "
1442 "err = %d\n", kernel_fd, -n);
1444 printk(
"io_thread - short read, fd = %d, "
1445 "length = %d\n", kernel_fd, n);
1454 printk(
"io_thread - write failed, fd = %d, err = %d\n",