|
@@ -511,8 +511,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;
|
|
|
+
|
|
|
+ __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;
|
|
|
+ }
|
|
|
|
|
|
- file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file;
|
|
|
+ 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);
|
|
|
}
|
|
|
|