diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-12-26 22:28:59 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2014-01-06 02:42:19 -0500 |
commit | 9e09fc855dd6f6ed510b3db7f3c3c1dd73631ac7 (patch) | |
tree | 85c3dddd41255d4ba8d83583f0550b1693338209 /fs/f2fs/inline.c | |
parent | 26f466f4a948ddc765f9b474ad6e0bdb94fb1a66 (diff) |
f2fs: refactor f2fs_convert_inline_data
Change log from v1:
o handle NULL pointer of grab_cache_page_write_begin() pointed by Chao Yu.
This patch refactors f2fs_convert_inline_data to check a couple of conditions
internally for deciding whether it needs to convert inline_data or not.
So, the new f2fs_convert_inline_data initially checks:
1) f2fs_has_inline_data(), and
2) the data size to be changed.
If the inode has inline_data but the size to fill is less than MAX_INLINE_DATA,
then we don't need to convert the inline_data with data allocation.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r-- | fs/f2fs/inline.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 62c72aa84acc..e8891aa3ab8c 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -101,6 +101,7 @@ static int __f2fs_convert_inline_data(struct inode *inode, struct page *page) | |||
101 | dst_addr = kmap(page); | 101 | dst_addr = kmap(page); |
102 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); | 102 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); |
103 | kunmap(page); | 103 | kunmap(page); |
104 | SetPageUptodate(page); | ||
104 | 105 | ||
105 | /* write data page to try to make data consistent */ | 106 | /* write data page to try to make data consistent */ |
106 | set_page_writeback(page); | 107 | set_page_writeback(page); |
@@ -120,25 +121,22 @@ static int __f2fs_convert_inline_data(struct inode *inode, struct page *page) | |||
120 | return err; | 121 | return err; |
121 | } | 122 | } |
122 | 123 | ||
123 | int f2fs_convert_inline_data(struct inode *inode, | 124 | int f2fs_convert_inline_data(struct inode *inode, pgoff_t to_size) |
124 | struct page *p, unsigned flags) | ||
125 | { | 125 | { |
126 | int err; | ||
127 | struct page *page; | 126 | struct page *page; |
127 | int err; | ||
128 | 128 | ||
129 | if (!p || p->index) { | 129 | if (!f2fs_has_inline_data(inode)) |
130 | page = grab_cache_page_write_begin(inode->i_mapping, 0, flags); | 130 | return 0; |
131 | if (IS_ERR(page)) | 131 | else if (to_size <= MAX_INLINE_DATA) |
132 | return PTR_ERR(page); | 132 | return 0; |
133 | } else { | ||
134 | page = p; | ||
135 | } | ||
136 | |||
137 | err = __f2fs_convert_inline_data(inode, page); | ||
138 | 133 | ||
139 | if (!p || p->index) | 134 | page = grab_cache_page_write_begin(inode->i_mapping, 0, AOP_FLAG_NOFS); |
140 | f2fs_put_page(page, 1); | 135 | if (!page) |
136 | return -ENOMEM; | ||
141 | 137 | ||
138 | err = __f2fs_convert_inline_data(inode, page); | ||
139 | f2fs_put_page(page, 1); | ||
142 | return err; | 140 | return err; |
143 | } | 141 | } |
144 | 142 | ||