| From 8535639810e578960233ad39def3ac2157b0c3ec Mon Sep 17 00:00:00 2001 |
| From: Richard Weinberger <richard@nod.at> |
| Date: Wed, 2 Nov 2011 13:17:27 +0100 |
| Subject: um: fix ubd cow size |
| |
| From: Richard Weinberger <richard@nod.at> |
| |
| 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> |
| |
| --- |
| arch/um/drivers/ubd_kern.c | 31 ++++++++++++++++++++++++++++++- |
| 1 file changed, 30 insertions(+), 1 deletion(-) |
| |
| --- a/arch/um/drivers/ubd_kern.c |
| +++ b/arch/um/drivers/ubd_kern.c |
| @@ -513,8 +513,37 @@ __uml_exitcall(kill_io_thread); |
| static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) |
| { |
| char *file; |
| + int fd; |
| + int err; |
| |
| - file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file; |
| + __u32 version; |
| + __u32 align; |
| + char *backing_file; |
| + time_t mtime; |
| + unsigned long long size; |
| + int sector_size; |
| + int bitmap_offset; |
| + |
| + if (ubd_dev->file && ubd_dev->cow.file) { |
| + file = ubd_dev->cow.file; |
| + |
| + goto out; |
| + } |
| + |
| + fd = os_open_file(ubd_dev->file, global_openflags, 0); |
| + if (fd < 0) |
| + return fd; |
| + |
| + err = read_cow_header(file_reader, &fd, &version, &backing_file, \ |
| + &mtime, &size, §or_size, &align, &bitmap_offset); |
| + os_close_file(fd); |
| + |
| + if(err == -EINVAL) |
| + file = ubd_dev->file; |
| + else |
| + file = backing_file; |
| + |
| +out: |
| return os_file_size(file, size_out); |
| } |
| |