Hi Sheng,

On 2018/7/10 9:53, Sheng Yong wrote:
> Hi, Chao,
> 
> On 2018/7/9 23:14, Chao Yu wrote:
>> On 2018/7/4 17:50, Sheng Yong wrote:
>>> 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.
>>
>> Should we treat block inode and regular inode as the same?
> 
> I'm afraid not, the behavior of O_EXCL is not defined for regular inode
> if it is used without O_CREAT. If f2fs is installed in a image file (not
> a block device), we may still find a another way to avoid fsck and f2fs
> run concurrently :(

Correct, I misunderstand semantics of this flag.

> 
> thanks
>>
>> Not sure about this, since for debuging, if we can't umount due to panic in
>> f2fs, still we can dump last data in device.
>>
>> Thanks,
>>
>>>
>>> Signed-off-by: Sheng Yong <shengyo...@huawei.com>

Reviewed-by: Chao Yu <yuch...@huawei.com>

Thanks,

>>> ---
>>>   lib/libf2fs.c | 27 +++++++++++++++++----------
>>>   1 file 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)) {
>>>
>>
>> .
>>
> 
> 
> .
> 


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to