2015-12-24 10:11:10

by Chao Yu

[permalink] [raw]
Subject: [PATCH 4/5] f2fs: support data flush in ioctl

Sometimes user want to sync all data belong to superblock into storage
for persistence, 'syncfs' syscall is one option, still f2fs supports
similar one through ioctl, difference is that sb releted kworker is
online for writebacking concurrently.

Signed-off-by: Chao Yu <[email protected]>
---
fs/f2fs/file.c | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index a60d088..91997a5 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1621,6 +1621,7 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct cp_control cpc;
int err;
+ int flush_data;

if (!capable(CAP_SYS_ADMIN))
return -EPERM;
@@ -1628,6 +1629,15 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
if (f2fs_readonly(sbi->sb))
return -EROFS;

+ if (get_user(flush_data, (__u32 __user *)arg))
+ return -EFAULT;
+
+ if (flush_data) {
+ err = sync_dirty_inodes(sbi, FILE_INODE);
+ if (err)
+ return err;
+ }
+
cpc.reason = __get_cp_reason(sbi);

mutex_lock(&sbi->gc_mutex);
--
2.6.3


2015-12-24 21:06:44

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH 4/5] f2fs: support data flush in ioctl

Hi Chao,

On Thu, Dec 24, 2015 at 06:10:25PM +0800, Chao Yu wrote:
> Sometimes user want to sync all data belong to superblock into storage
> for persistence, 'syncfs' syscall is one option, still f2fs supports
> similar one through ioctl, difference is that sb releted kworker is
> online for writebacking concurrently.

There is compatibility issue, since you're trying to change pre-defined
ioctl; it needs to change F2FS_IOC_WRITE_CHECKPOINT too, right?
I'm in doubt that we really need to expose this too.

Thanks,

>
> Signed-off-by: Chao Yu <[email protected]>
> ---
> fs/f2fs/file.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index a60d088..91997a5 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -1621,6 +1621,7 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
> struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
> struct cp_control cpc;
> int err;
> + int flush_data;
>
> if (!capable(CAP_SYS_ADMIN))
> return -EPERM;
> @@ -1628,6 +1629,15 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
> if (f2fs_readonly(sbi->sb))
> return -EROFS;
>
> + if (get_user(flush_data, (__u32 __user *)arg))
> + return -EFAULT;
> +
> + if (flush_data) {
> + err = sync_dirty_inodes(sbi, FILE_INODE);
> + if (err)
> + return err;
> + }
> +
> cpc.reason = __get_cp_reason(sbi);
>
> mutex_lock(&sbi->gc_mutex);
> --
> 2.6.3
>

2015-12-26 09:26:14

by Chao Yu

[permalink] [raw]
Subject: Re: [f2fs-dev] [PATCH 4/5] f2fs: support data flush in ioctl

Hi Jaegeuk,

On 12/25/15 5:06 AM, Jaegeuk Kim wrote:
> Hi Chao,
>
> On Thu, Dec 24, 2015 at 06:10:25PM +0800, Chao Yu wrote:
>> Sometimes user want to sync all data belong to superblock into storage
>> for persistence, 'syncfs' syscall is one option, still f2fs supports
>> similar one through ioctl, difference is that sb releted kworker is
>> online for writebacking concurrently.
>
> There is compatibility issue, since you're trying to change pre-defined
> ioctl;

Agreed.

> it needs to change F2FS_IOC_WRITE_CHECKPOINT too, right?

Yes, maybe F2FS_IOC_WRITE_CHECKPOINT_V2 if we have to change this interface.

> I'm in doubt that we really need to expose this too.

There is no obviously demands, but for Marc Lehmann's scenario I expect this can
provide less latency by concurrently writebacking when syncing the whole f2fs
partition.

Thanks,

>
> Thanks,
>
>>
>> Signed-off-by: Chao Yu <[email protected]>
>> ---
>> fs/f2fs/file.c | 10 ++++++++++
>> 1 file changed, 10 insertions(+)
>>
>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
>> index a60d088..91997a5 100644
>> --- a/fs/f2fs/file.c
>> +++ b/fs/f2fs/file.c
>> @@ -1621,6 +1621,7 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
>> struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
>> struct cp_control cpc;
>> int err;
>> + int flush_data;
>>
>> if (!capable(CAP_SYS_ADMIN))
>> return -EPERM;
>> @@ -1628,6 +1629,15 @@ static int f2fs_ioc_write_checkpoint(struct file *filp, unsigned long arg)
>> if (f2fs_readonly(sbi->sb))
>> return -EROFS;
>>
>> + if (get_user(flush_data, (__u32 __user *)arg))
>> + return -EFAULT;
>> +
>> + if (flush_data) {
>> + err = sync_dirty_inodes(sbi, FILE_INODE);
>> + if (err)
>> + return err;
>> + }
>> +
>> cpc.reason = __get_cp_reason(sbi);
>>
>> mutex_lock(&sbi->gc_mutex);
>> --
>> 2.6.3
>>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Linux-f2fs-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>