diff options
author | Sheng Yong <shengyong1@huawei.com> | 2018-07-04 17:50:45 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2018-08-27 23:49:26 -0700 |
commit | eb9d8037ed3b37a647d514470f1a1df91daedb64 (patch) | |
tree | c6420fe087abc032c4c141b9da056f826934e99e | |
parent | 356f8627c44609183592333901fefe4464247ce7 (diff) | |
download | f2fs-tools-eb9d8037ed3b37a647d514470f1a1df91daedb64.tar.gz |
f2fs-tools: avoid mounting f2fs if tools already open the device
If the block device is opened by tools, F2FS should not be mounted.
Especially when fsck is running, errors unexpected may happen. So if
tools open a block device, we give it the O_EXCL flag to make sure
the block device is opened exclusivly.
Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | lib/libf2fs.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/libf2fs.c b/lib/libf2fs.c index b25fbf2..5625cff 100644 --- a/lib/libf2fs.c +++ b/lib/libf2fs.c @@ -783,21 +783,35 @@ int get_device_info(int i) #endif struct device_info *dev = c.devices + i; + 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((char *)dev->path, O_RDWR | O_CREAT | O_BINARY, 0644); + fd = open(dev->path, O_RDWR | O_CREAT | O_BINARY, 0644); } else { - fd = open((char *)dev->path, O_RDWR); + if (S_ISBLK(stat_buf->st_mode)) + fd = open(dev->path, O_RDWR | O_EXCL); + else + fd = open(dev->path, O_RDWR); } if (fd < 0) { MSG(0, "\tError: Failed to open the device!\n"); + free(stat_buf); return -1; } dev->fd = fd; if (c.sparse_mode) { - if (f2fs_init_sparse_file()) + if (f2fs_init_sparse_file()) { + free(stat_buf); return -1; + } } if (c.kd == -1) { @@ -810,13 +824,6 @@ int get_device_info(int i) } } - stat_buf = malloc(sizeof(struct stat)); - if (fstat(fd, stat_buf) < 0 ) { - MSG(0, "\tError: Failed to get the device stat!\n"); - free(stat_buf); - return -1; - } - if (c.sparse_mode) { dev->total_sectors = c.device_size / dev->sector_size; } else if (S_ISREG(stat_buf->st_mode)) { |