Skip to content

Commit 02a1335

Browse files
author
Jaegeuk Kim
committed
f2fs: support volatile operations for transient data
This patch adds support for volatile writes which keep data pages in memory until f2fs_evict_inode is called by iput. For instance, we can use this feature for the sqlite database as follows. While supporting atomic writes for main database file, we can keep its journal data temporarily in the page cache by the following sequence. 1. open -> ioctl(F2FS_IOC_START_VOLATILE_WRITE); 2. writes : keep all the data in the page cache. 3. flush to the database file with atomic writes a. ioctl(F2FS_IOC_START_ATOMIC_WRITE); b. writes c. ioctl(F2FS_IOC_COMMIT_ATOMIC_WRITE); 4. close -> drop the cached data Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 88b88a6 commit 02a1335

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

fs/f2fs/data.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ static int f2fs_write_end(struct file *file,
10521052

10531053
trace_f2fs_write_end(inode, pos, len, copied);
10541054

1055-
if (f2fs_is_atomic_file(inode))
1055+
if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
10561056
register_inmem_page(inode, page);
10571057
else
10581058
set_page_dirty(page);

fs/f2fs/f2fs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size,
198198
#define F2FS_IOCTL_MAGIC 0xf5
199199
#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1)
200200
#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2)
201+
#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3)
201202

202203
#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
203204
/*
@@ -1060,6 +1061,7 @@ enum {
10601061
FI_UPDATE_WRITE, /* inode has in-place-update data */
10611062
FI_NEED_IPU, /* used for ipu per file */
10621063
FI_ATOMIC_FILE, /* indicate atomic file */
1064+
FI_VOLATILE_FILE, /* indicate volatile file */
10631065
};
10641066

10651067
static inline void set_inode_flag(struct f2fs_inode_info *fi, int flag)
@@ -1151,6 +1153,11 @@ static inline bool f2fs_is_atomic_file(struct inode *inode)
11511153
return is_inode_flag_set(F2FS_I(inode), FI_ATOMIC_FILE);
11521154
}
11531155

1156+
static inline bool f2fs_is_volatile_file(struct inode *inode)
1157+
{
1158+
return is_inode_flag_set(F2FS_I(inode), FI_VOLATILE_FILE);
1159+
}
1160+
11541161
static inline void *inline_data_addr(struct page *page)
11551162
{
11561163
struct f2fs_inode *ri = F2FS_INODE(page);

fs/f2fs/file.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,9 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
885885
if (!inode_owner_or_capable(inode))
886886
return -EACCES;
887887

888+
if (f2fs_is_volatile_file(inode))
889+
return 0;
890+
888891
ret = mnt_want_write_file(filp);
889892
if (ret)
890893
return ret;
@@ -897,6 +900,17 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
897900
return ret;
898901
}
899902

903+
static int f2fs_ioc_start_volatile_write(struct file *filp)
904+
{
905+
struct inode *inode = file_inode(filp);
906+
907+
if (!inode_owner_or_capable(inode))
908+
return -EACCES;
909+
910+
set_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE);
911+
return 0;
912+
}
913+
900914
static int f2fs_ioc_fitrim(struct file *filp, unsigned long arg)
901915
{
902916
struct inode *inode = file_inode(filp);
@@ -938,6 +952,8 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
938952
return f2fs_ioc_start_atomic_write(filp);
939953
case F2FS_IOC_COMMIT_ATOMIC_WRITE:
940954
return f2fs_ioc_commit_atomic_write(filp);
955+
case F2FS_IOC_START_VOLATILE_WRITE:
956+
return f2fs_ioc_start_volatile_write(filp);
941957
case FITRIM:
942958
return f2fs_ioc_fitrim(filp, arg);
943959
default:

fs/f2fs/inode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ void f2fs_evict_inode(struct inode *inode)
270270
nid_t xnid = F2FS_I(inode)->i_xattr_nid;
271271

272272
/* some remained atomic pages should discarded */
273-
if (f2fs_is_atomic_file(inode))
273+
if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
274274
commit_inmem_pages(inode, true);
275275

276276
trace_f2fs_evict_inode(inode);

0 commit comments

Comments
 (0)