OSDN Git Service

release-request-99856c15-b008-4977-9971-f86523a23c0a-for-git_oc-m2-release-4367109...
[android-x86/system-extras.git] / f2fs_utils / f2fs_ioutils.c
index a050cf8..c9275ff 100644 (file)
 
 #define _LARGEFILE64_SOURCE
 
+#include <assert.h>
 #include <asm/types.h>
+#include <dlfcn.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <linux/fs.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <fcntl.h>
-#include <dlfcn.h>
-
-#include <assert.h>
+#include <unistd.h>
 
 #include <f2fs_fs.h>
 #include <f2fs_format_utils.h>
@@ -51,7 +51,7 @@ struct selabel_handle;
 
 #include "make_f2fs.h"
 
-#ifdef USE_MINGW
+#ifdef _WIN32
 
 #include <winsock2.h>
 
@@ -83,7 +83,7 @@ struct selabel_handle;
 
 #endif
 
-struct f2fs_configuration config;
+struct f2fs_configuration c;
 struct sparse_file *f2fs_sparse_file;
 
 struct buf_item {
@@ -94,11 +94,32 @@ struct buf_item {
 
 struct buf_item *buf_list;
 
+static int __get_device_fd(__u64 *offset)
+{
+       __u64 blk_addr = *offset >> F2FS_BLKSIZE_BITS;
+       int i;
+
+       for (i = 0; i < c.ndevs; i++) {
+               if (c.devices[i].start_blkaddr <= blk_addr &&
+                               c.devices[i].end_blkaddr >= blk_addr) {
+                       *offset -=
+                               c.devices[i].start_blkaddr << F2FS_BLKSIZE_BITS;
+                       return c.devices[i].fd;
+               }
+       }
+       return -1;
+}
+
 static int dev_write_fd(void *buf, __u64 offset, size_t len)
 {
-       if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0)
+       int fd = __get_device_fd(&offset);
+
+       if (lseek64(fd, (off64_t)offset, SEEK_SET) < 0)
                return -1;
-       if (write(config.fd, buf, len) != len)
+       ssize_t written = write(fd, buf, len);
+       if (written == -1)
+               return -1;
+       if ((size_t)written != len)
                return -1;
        return 0;
 }
@@ -135,11 +156,11 @@ static int dev_write_sparse(void *buf, __u64 byte_offset, size_t byte_len)
        return 0;
 }
 
-void f2fs_finalize_device(struct f2fs_configuration *c)
+void f2fs_finalize_device(void)
 {
 }
 
-int f2fs_trim_device()
+int f2fs_trim_devices(void)
 {
        return 0;
 }
@@ -157,20 +178,39 @@ int dev_read(void  *buf, __u64 offset, size_t len)
        return 0;
 }
 
+int dev_readahead(__u64 offset, size_t len)
+{
+       return 0;
+}
+
 int dev_write(void *buf, __u64 offset, size_t len)
 {
-       if (config.fd >= 0) {
+       int fd = __get_device_fd(&offset);
+
+       if (fd >= 0) {
                return dev_write_fd(buf, offset, len);
        } else {
                return dev_write_sparse(buf, offset, len);
        }
 }
 
+int dev_write_block(void *buf, __u64 blk_addr)
+{
+       assert(false); // Must not be invoked.
+       return 0;
+}
+
+int dev_write_dump(void *buf, __u64 offset, size_t len)
+{
+       assert(false); // Must not be invoked.
+       return 0;
+}
 
 int dev_fill(void *buf, __u64 offset, size_t len)
 {
+       int fd = __get_device_fd(&offset);
        int ret;
-       if (config.fd >= 0) {
+       if (fd >= 0) {
                return dev_write_fd(buf, offset, len);
        }
         // sparse file fills with zero by default.
@@ -178,6 +218,12 @@ int dev_fill(void *buf, __u64 offset, size_t len)
        return 0;
 }
 
+int dev_fill_block(void *buf, __u64 blk_addr)
+{
+       assert(false); // Must not be invoked.
+       return 0;
+}
+
 int dev_read_block(void *buf, __u64 blk_addr)
 {
        assert(false); // Must not be invoked.
@@ -190,3 +236,8 @@ int dev_read_blocks(void *buf, __u64 addr, __u32 nr_blks)
        return 0;
 }
 
+int dev_reada_block(__u64 blk_addr)
+{
+       assert(false); // Must not be invoked.
+       return 0;
+}