diff options
author | Richard Weinberger <richard@nod.at> | 2011-11-02 08:17:27 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-11 12:36:19 -0500 |
commit | 5f0d9e03e7e0792fbd36ba9fb9859f0ef7956a20 (patch) | |
tree | cd9ef9985579e0a316808981ba2d00c834eff8d2 | |
parent | 73e2fc5d34007574d25d00e7088bbd42e988bb3e (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.c | 31 |
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); | |||
513 | static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) | 513 | static 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, §or_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 | |||
546 | out: | ||
518 | return os_file_size(file, size_out); | 547 | return os_file_size(file, size_out); |
519 | } | 548 | } |
520 | 549 | ||