From 5e4da757f999f7c2ce3be8b3b62b76b1203020d3 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Thu, 15 Nov 2018 21:54:02 -0800 Subject: [PATCH] f2fs-tools: create sparse file first before stat We must create a sparse file first before calling stat(). Fixes: eb9d8037ed3b ("f2fs-tools: avoid mounting f2fs if tools already open the device") Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim --- lib/libf2fs.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/libf2fs.c b/lib/libf2fs.c index bf2830d..a1a5c02 100644 --- a/lib/libf2fs.c +++ b/lib/libf2fs.c @@ -793,17 +793,24 @@ int get_device_info(int i) #endif struct device_info *dev = c.devices + i; + if (c.sparse_mode) { + fd = open(dev->path, O_RDWR | O_CREAT | O_BINARY, 0644); + if (fd < 0) { + MSG(0, "\tError: Failed to open a sparse file!\n"); + return -1; + } + } + stat_buf = malloc(sizeof(struct stat)); ASSERT(stat_buf); - if (stat(dev->path, stat_buf) < 0 ) { - MSG(0, "\tError: Failed to get the device stat!\n"); - free(stat_buf); - return -1; - } - if (c.sparse_mode) { - fd = open(dev->path, O_RDWR | O_CREAT | O_BINARY, 0644); - } else { + if (!c.sparse_mode) { + if (stat(dev->path, stat_buf) < 0 ) { + MSG(0, "\tError: Failed to get the device stat!\n"); + free(stat_buf); + return -1; + } + if (S_ISBLK(stat_buf->st_mode)) fd = open(dev->path, O_RDWR | O_EXCL); else -- 2.7.4