aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2011-11-02 08:17:27 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-11-11 12:36:19 -0500
commit5f0d9e03e7e0792fbd36ba9fb9859f0ef7956a20 (patch)
treecd9ef9985579e0a316808981ba2d00c834eff8d2
parent73e2fc5d34007574d25d00e7088bbd42e988bb3e (diff)
um: fix ubd cow size
commit 8535639810e578960233ad39def3ac2157b0c3ec upstream. ubd_file_size() cannot use ubd_dev->cow.file because at this time ubd_dev->cow.file is not initialized. Therefore, ubd_file_size() will always report a wrong disk size when COW files are used. Reading from /dev/ubd* would crash the kernel. We have to read the correct disk size from the COW file's backing file. Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--arch/um/drivers/ubd_kern.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 620f5b70957..0491e40d696 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -513,8 +513,37 @@ __uml_exitcall(kill_io_thread);
513static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) 513static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out)
514{ 514{
515 char *file; 515 char *file;
516 int fd;
517 int err;
518
519 __u32 version;
520 __u32 align;
521 char *backing_file;
522 time_t mtime;
523 unsigned long long size;
524 int sector_size;
525 int bitmap_offset;
526
527 if (ubd_dev->file && ubd_dev->cow.file) {
528 file = ubd_dev->cow.file;
529
530 goto out;
531 }
516 532
517 file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file; 533 fd = os_open_file(ubd_dev->file, global_openflags, 0);
534 if (fd < 0)
535 return fd;
536
537 err = read_cow_header(file_reader, &fd, &version, &backing_file, \
538 &mtime, &size, &sector_size, &align, &bitmap_offset);
539 os_close_file(fd);
540
541 if(err == -EINVAL)
542 file = ubd_dev->file;
543 else
544 file = backing_file;
545
546out:
518 return os_file_size(file, size_out); 547 return os_file_size(file, size_out);
519} 548}
520 549