115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall/** 215ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * libf2fs.c 315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * 415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * Copyright (c) 2013 Samsung Electronics Co., Ltd. 515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * http://www.samsung.com/ 615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * 70fbdf6cbd4dfc633454eba2f841c123789e297adJaegeuk Kim * Dual licensed under the GPL or LGPL version 2 licenses. 815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall */ 915ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#define _LARGEFILE64_SOURCE 1015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 1115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <stdio.h> 1215ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <stdlib.h> 1315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <string.h> 1415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <errno.h> 1515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <unistd.h> 1615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <fcntl.h> 1715ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <mntent.h> 1815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <time.h> 1915ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <sys/stat.h> 2015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <sys/mount.h> 2115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <sys/ioctl.h> 2215ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <linux/hdreg.h> 2315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 2415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall#include <f2fs_fs.h> 2515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 2615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrallstruct f2fs_configuration config; 2715ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 2815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall/* 2915ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall * IO interfaces 3015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall */ 31c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kimint dev_read_version(void *buf, __u64 offset, size_t len) 32c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim{ 33c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim if (lseek64(config.kd, (off64_t)offset, SEEK_SET) < 0) 34c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim return -1; 35c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim if (read(config.kd, buf, len) < 0) 36c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim return -1; 37c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim return 0; 38c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim} 39c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim 4015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrallint dev_read(void *buf, __u64 offset, size_t len) 4115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall{ 4215ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0) 4315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return -1; 4415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall if (read(config.fd, buf, len) < 0) 4515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return -1; 4615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return 0; 4715ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall} 4815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 498bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kimint dev_readahead(__u64 offset, size_t len) 508bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim{ 518bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim#ifdef POSIX_FADV_WILLNEED 528bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim return posix_fadvise(config.fd, offset, len, POSIX_FADV_WILLNEED); 538bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim#else 548bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim return 0; 558bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim#endif 568bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim} 578bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim 5815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrallint dev_write(void *buf, __u64 offset, size_t len) 5915ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall{ 6015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0) 6115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return -1; 6215ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall if (write(config.fd, buf, len) < 0) 6315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return -1; 6415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return 0; 6515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall} 6615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 67dc530859c5e422b10ab70bc3b9d4b7ff0d004d57Jaegeuk Kimint dev_write_block(void *buf, __u64 blk_addr) 68dc530859c5e422b10ab70bc3b9d4b7ff0d004d57Jaegeuk Kim{ 69dc530859c5e422b10ab70bc3b9d4b7ff0d004d57Jaegeuk Kim return dev_write(buf, blk_addr * F2FS_BLKSIZE, F2FS_BLKSIZE); 70dc530859c5e422b10ab70bc3b9d4b7ff0d004d57Jaegeuk Kim} 71dc530859c5e422b10ab70bc3b9d4b7ff0d004d57Jaegeuk Kim 72f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kimint dev_write_dump(void *buf, __u64 offset, size_t len) 73f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim{ 74f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim if (lseek64(config.dump_fd, (off64_t)offset, SEEK_SET) < 0) 75f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim return -1; 76f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim if (write(config.dump_fd, buf, len) < 0) 77f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim return -1; 78f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim return 0; 79f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim} 80f70644c5047f9f912836724a994ccab18b5b5dd1Jaegeuk Kim 81a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrallint dev_fill(void *buf, __u64 offset, size_t len) 82a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall{ 83a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall /* Only allow fill to zero */ 84a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall if (*((__u8*)buf)) 85a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall return -1; 86a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0) 87a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall return -1; 88a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall if (write(config.fd, buf, len) < 0) 89a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall return -1; 90a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall return 0; 91a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall} 92a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall 9315ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrallint dev_read_block(void *buf, __u64 blk_addr) 9415ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall{ 9515ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return dev_read(buf, blk_addr * F2FS_BLKSIZE, F2FS_BLKSIZE); 9615ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall} 9715ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall 9815ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrallint dev_read_blocks(void *buf, __u64 addr, __u32 nr_blks) 9915ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall{ 10015ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall return dev_read(buf, addr * F2FS_BLKSIZE, nr_blks * F2FS_BLKSIZE); 10115ea79b3ae7f0474ade43ba8b6eb328806e01e15JP Abgrall} 1025005fb18214a234e944dcb74a10b8719f672add2JP Abgrall 1038bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kimint dev_reada_block(__u64 blk_addr) 1048bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim{ 1058bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim return dev_readahead(blk_addr * F2FS_BLKSIZE, F2FS_BLKSIZE); 1068bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim} 1078bcdc5fdb206196241dc6fc535e6d285d4985201Jaegeuk Kim 1085005fb18214a234e944dcb74a10b8719f672add2JP Abgrallvoid f2fs_finalize_device(struct f2fs_configuration *c) 1095005fb18214a234e944dcb74a10b8719f672add2JP Abgrall{ 1105005fb18214a234e944dcb74a10b8719f672add2JP Abgrall /* 1115005fb18214a234e944dcb74a10b8719f672add2JP Abgrall * We should call fsync() to flush out all the dirty pages 1125005fb18214a234e944dcb74a10b8719f672add2JP Abgrall * in the block device page cache. 1135005fb18214a234e944dcb74a10b8719f672add2JP Abgrall */ 1145005fb18214a234e944dcb74a10b8719f672add2JP Abgrall if (fsync(c->fd) < 0) 1155005fb18214a234e944dcb74a10b8719f672add2JP Abgrall MSG(0, "\tError: Could not conduct fsync!!!\n"); 1165005fb18214a234e944dcb74a10b8719f672add2JP Abgrall 1175005fb18214a234e944dcb74a10b8719f672add2JP Abgrall if (close(c->fd) < 0) 1185005fb18214a234e944dcb74a10b8719f672add2JP Abgrall MSG(0, "\tError: Failed to close device file!!!\n"); 119c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim 120c07795e73cbc509286e35193759e80d65ee12a44Jaegeuk Kim close(c->kd); 1215005fb18214a234e944dcb74a10b8719f672add2JP Abgrall} 122