xref: /openbmc/linux/fs/f2fs/inline.c (revision 4161b450)
1 /*
2  * fs/f2fs/inline.c
3  * Copyright (c) 2013, Intel Corporation
4  * Authors: Huajun Li <huajun.li@intel.com>
5  *          Haicheng Li <haicheng.li@intel.com>
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <linux/fs.h>
12 #include <linux/f2fs_fs.h>
13 
14 #include "f2fs.h"
15 
16 bool f2fs_may_inline(struct inode *inode)
17 {
18 	if (!test_opt(F2FS_I_SB(inode), INLINE_DATA))
19 		return false;
20 
21 	if (f2fs_is_atomic_file(inode))
22 		return false;
23 
24 	if (!S_ISREG(inode->i_mode))
25 		return false;
26 
27 	if (i_size_read(inode) > MAX_INLINE_DATA)
28 		return false;
29 
30 	return true;
31 }
32 
33 void read_inline_data(struct page *page, struct page *ipage)
34 {
35 	void *src_addr, *dst_addr;
36 
37 	if (PageUptodate(page))
38 		return;
39 
40 	f2fs_bug_on(F2FS_P_SB(page), page->index);
41 
42 	zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE);
43 
44 	/* Copy the whole inline data block */
45 	src_addr = inline_data_addr(ipage);
46 	dst_addr = kmap_atomic(page);
47 	memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
48 	flush_dcache_page(page);
49 	kunmap_atomic(dst_addr);
50 	SetPageUptodate(page);
51 }
52 
53 int f2fs_read_inline_data(struct inode *inode, struct page *page)
54 {
55 	struct page *ipage;
56 
57 	ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
58 	if (IS_ERR(ipage)) {
59 		unlock_page(page);
60 		return PTR_ERR(ipage);
61 	}
62 
63 	if (!f2fs_has_inline_data(inode)) {
64 		f2fs_put_page(ipage, 1);
65 		return -EAGAIN;
66 	}
67 
68 	if (page->index)
69 		zero_user_segment(page, 0, PAGE_CACHE_SIZE);
70 	else
71 		read_inline_data(page, ipage);
72 
73 	SetPageUptodate(page);
74 	f2fs_put_page(ipage, 1);
75 	unlock_page(page);
76 	return 0;
77 }
78 
79 int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
80 {
81 	void *src_addr, *dst_addr;
82 	block_t new_blk_addr;
83 	struct f2fs_io_info fio = {
84 		.type = DATA,
85 		.rw = WRITE_SYNC | REQ_PRIO,
86 	};
87 	int dirty, err;
88 
89 	f2fs_bug_on(F2FS_I_SB(dn->inode), page->index);
90 
91 	if (!f2fs_exist_data(dn->inode))
92 		goto clear_out;
93 
94 	err = f2fs_reserve_block(dn, 0);
95 	if (err)
96 		return err;
97 
98 	f2fs_wait_on_page_writeback(page, DATA);
99 
100 	if (PageUptodate(page))
101 		goto no_update;
102 
103 	zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE);
104 
105 	/* Copy the whole inline data block */
106 	src_addr = inline_data_addr(dn->inode_page);
107 	dst_addr = kmap_atomic(page);
108 	memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
109 	flush_dcache_page(page);
110 	kunmap_atomic(dst_addr);
111 	SetPageUptodate(page);
112 no_update:
113 	/* clear dirty state */
114 	dirty = clear_page_dirty_for_io(page);
115 
116 	/* write data page to try to make data consistent */
117 	set_page_writeback(page);
118 
119 	write_data_page(page, dn, &new_blk_addr, &fio);
120 	update_extent_cache(new_blk_addr, dn);
121 	f2fs_wait_on_page_writeback(page, DATA);
122 	if (dirty)
123 		inode_dec_dirty_pages(dn->inode);
124 
125 	/* this converted inline_data should be recovered. */
126 	set_inode_flag(F2FS_I(dn->inode), FI_APPEND_WRITE);
127 
128 	/* clear inline data and flag after data writeback */
129 	truncate_inline_data(dn->inode_page, 0);
130 clear_out:
131 	stat_dec_inline_inode(dn->inode);
132 	f2fs_clear_inline_inode(dn->inode);
133 	sync_inode_page(dn);
134 	f2fs_put_dnode(dn);
135 	return 0;
136 }
137 
138 int f2fs_convert_inline_inode(struct inode *inode)
139 {
140 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
141 	struct dnode_of_data dn;
142 	struct page *ipage, *page;
143 	int err = 0;
144 
145 	page = grab_cache_page(inode->i_mapping, 0);
146 	if (!page)
147 		return -ENOMEM;
148 
149 	f2fs_lock_op(sbi);
150 
151 	ipage = get_node_page(sbi, inode->i_ino);
152 	if (IS_ERR(ipage)) {
153 		err = PTR_ERR(ipage);
154 		goto out;
155 	}
156 
157 	set_new_dnode(&dn, inode, ipage, ipage, 0);
158 
159 	if (f2fs_has_inline_data(inode))
160 		err = f2fs_convert_inline_page(&dn, page);
161 
162 	f2fs_put_dnode(&dn);
163 out:
164 	f2fs_unlock_op(sbi);
165 
166 	f2fs_put_page(page, 1);
167 	return err;
168 }
169 
170 int f2fs_write_inline_data(struct inode *inode, struct page *page)
171 {
172 	void *src_addr, *dst_addr;
173 	struct dnode_of_data dn;
174 	int err;
175 
176 	set_new_dnode(&dn, inode, NULL, NULL, 0);
177 	err = get_dnode_of_data(&dn, 0, LOOKUP_NODE);
178 	if (err)
179 		return err;
180 
181 	if (!f2fs_has_inline_data(inode)) {
182 		f2fs_put_dnode(&dn);
183 		return -EAGAIN;
184 	}
185 
186 	f2fs_bug_on(F2FS_I_SB(inode), page->index);
187 
188 	f2fs_wait_on_page_writeback(dn.inode_page, NODE);
189 	src_addr = kmap_atomic(page);
190 	dst_addr = inline_data_addr(dn.inode_page);
191 	memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
192 	kunmap_atomic(src_addr);
193 
194 	set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
195 	set_inode_flag(F2FS_I(inode), FI_DATA_EXIST);
196 
197 	sync_inode_page(&dn);
198 	f2fs_put_dnode(&dn);
199 	return 0;
200 }
201 
202 void truncate_inline_data(struct page *ipage, u64 from)
203 {
204 	void *addr;
205 
206 	if (from >= MAX_INLINE_DATA)
207 		return;
208 
209 	f2fs_wait_on_page_writeback(ipage, NODE);
210 
211 	addr = inline_data_addr(ipage);
212 	memset(addr + from, 0, MAX_INLINE_DATA - from);
213 }
214 
215 bool recover_inline_data(struct inode *inode, struct page *npage)
216 {
217 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
218 	struct f2fs_inode *ri = NULL;
219 	void *src_addr, *dst_addr;
220 	struct page *ipage;
221 
222 	/*
223 	 * The inline_data recovery policy is as follows.
224 	 * [prev.] [next] of inline_data flag
225 	 *    o       o  -> recover inline_data
226 	 *    o       x  -> remove inline_data, and then recover data blocks
227 	 *    x       o  -> remove inline_data, and then recover inline_data
228 	 *    x       x  -> recover data blocks
229 	 */
230 	if (IS_INODE(npage))
231 		ri = F2FS_INODE(npage);
232 
233 	if (f2fs_has_inline_data(inode) &&
234 			ri && (ri->i_inline & F2FS_INLINE_DATA)) {
235 process_inline:
236 		ipage = get_node_page(sbi, inode->i_ino);
237 		f2fs_bug_on(sbi, IS_ERR(ipage));
238 
239 		f2fs_wait_on_page_writeback(ipage, NODE);
240 
241 		src_addr = inline_data_addr(npage);
242 		dst_addr = inline_data_addr(ipage);
243 		memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
244 
245 		set_inode_flag(F2FS_I(inode), FI_INLINE_DATA);
246 		set_inode_flag(F2FS_I(inode), FI_DATA_EXIST);
247 
248 		update_inode(inode, ipage);
249 		f2fs_put_page(ipage, 1);
250 		return true;
251 	}
252 
253 	if (f2fs_has_inline_data(inode)) {
254 		ipage = get_node_page(sbi, inode->i_ino);
255 		f2fs_bug_on(sbi, IS_ERR(ipage));
256 		truncate_inline_data(ipage, 0);
257 		f2fs_clear_inline_inode(inode);
258 		update_inode(inode, ipage);
259 		f2fs_put_page(ipage, 1);
260 	} else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
261 		truncate_blocks(inode, 0, false);
262 		goto process_inline;
263 	}
264 	return false;
265 }
266 
267 struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
268 				struct qstr *name, struct page **res_page)
269 {
270 	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
271 	struct f2fs_inline_dentry *inline_dentry;
272 	struct f2fs_dir_entry *de;
273 	struct f2fs_dentry_ptr d;
274 	struct page *ipage;
275 
276 	ipage = get_node_page(sbi, dir->i_ino);
277 	if (IS_ERR(ipage))
278 		return NULL;
279 
280 	inline_dentry = inline_data_addr(ipage);
281 
282 	make_dentry_ptr(&d, (void *)inline_dentry, 2);
283 	de = find_target_dentry(name, NULL, &d);
284 
285 	unlock_page(ipage);
286 	if (de)
287 		*res_page = ipage;
288 	else
289 		f2fs_put_page(ipage, 0);
290 
291 	/*
292 	 * For the most part, it should be a bug when name_len is zero.
293 	 * We stop here for figuring out where the bugs has occurred.
294 	 */
295 	f2fs_bug_on(sbi, d.max < 0);
296 	return de;
297 }
298 
299 struct f2fs_dir_entry *f2fs_parent_inline_dir(struct inode *dir,
300 							struct page **p)
301 {
302 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
303 	struct page *ipage;
304 	struct f2fs_dir_entry *de;
305 	struct f2fs_inline_dentry *dentry_blk;
306 
307 	ipage = get_node_page(sbi, dir->i_ino);
308 	if (IS_ERR(ipage))
309 		return NULL;
310 
311 	dentry_blk = inline_data_addr(ipage);
312 	de = &dentry_blk->dentry[1];
313 	*p = ipage;
314 	unlock_page(ipage);
315 	return de;
316 }
317 
318 int make_empty_inline_dir(struct inode *inode, struct inode *parent,
319 							struct page *ipage)
320 {
321 	struct f2fs_inline_dentry *dentry_blk;
322 	struct f2fs_dentry_ptr d;
323 
324 	dentry_blk = inline_data_addr(ipage);
325 
326 	make_dentry_ptr(&d, (void *)dentry_blk, 2);
327 	do_make_empty_dir(inode, parent, &d);
328 
329 	set_page_dirty(ipage);
330 
331 	/* update i_size to MAX_INLINE_DATA */
332 	if (i_size_read(inode) < MAX_INLINE_DATA) {
333 		i_size_write(inode, MAX_INLINE_DATA);
334 		set_inode_flag(F2FS_I(inode), FI_UPDATE_DIR);
335 	}
336 	return 0;
337 }
338 
339 static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
340 				struct f2fs_inline_dentry *inline_dentry)
341 {
342 	struct page *page;
343 	struct dnode_of_data dn;
344 	struct f2fs_dentry_block *dentry_blk;
345 	int err;
346 
347 	page = grab_cache_page(dir->i_mapping, 0);
348 	if (!page)
349 		return -ENOMEM;
350 
351 	set_new_dnode(&dn, dir, ipage, NULL, 0);
352 	err = f2fs_reserve_block(&dn, 0);
353 	if (err)
354 		goto out;
355 
356 	f2fs_wait_on_page_writeback(page, DATA);
357 	zero_user_segment(page, 0, PAGE_CACHE_SIZE);
358 
359 	dentry_blk = kmap_atomic(page);
360 
361 	/* copy data from inline dentry block to new dentry block */
362 	memcpy(dentry_blk->dentry_bitmap, inline_dentry->dentry_bitmap,
363 					INLINE_DENTRY_BITMAP_SIZE);
364 	memcpy(dentry_blk->dentry, inline_dentry->dentry,
365 			sizeof(struct f2fs_dir_entry) * NR_INLINE_DENTRY);
366 	memcpy(dentry_blk->filename, inline_dentry->filename,
367 					NR_INLINE_DENTRY * F2FS_SLOT_LEN);
368 
369 	kunmap_atomic(dentry_blk);
370 	SetPageUptodate(page);
371 	set_page_dirty(page);
372 
373 	/* clear inline dir and flag after data writeback */
374 	truncate_inline_data(ipage, 0);
375 
376 	stat_dec_inline_dir(dir);
377 	clear_inode_flag(F2FS_I(dir), FI_INLINE_DENTRY);
378 
379 	if (i_size_read(dir) < PAGE_CACHE_SIZE) {
380 		i_size_write(dir, PAGE_CACHE_SIZE);
381 		set_inode_flag(F2FS_I(dir), FI_UPDATE_DIR);
382 	}
383 
384 	sync_inode_page(&dn);
385 out:
386 	f2fs_put_page(page, 1);
387 	return err;
388 }
389 
390 int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
391 						struct inode *inode)
392 {
393 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
394 	struct page *ipage;
395 	unsigned int bit_pos;
396 	f2fs_hash_t name_hash;
397 	struct f2fs_dir_entry *de;
398 	size_t namelen = name->len;
399 	struct f2fs_inline_dentry *dentry_blk = NULL;
400 	int slots = GET_DENTRY_SLOTS(namelen);
401 	struct page *page;
402 	int err = 0;
403 	int i;
404 
405 	name_hash = f2fs_dentry_hash(name);
406 
407 	ipage = get_node_page(sbi, dir->i_ino);
408 	if (IS_ERR(ipage))
409 		return PTR_ERR(ipage);
410 
411 	dentry_blk = inline_data_addr(ipage);
412 	bit_pos = room_for_filename(&dentry_blk->dentry_bitmap,
413 						slots, NR_INLINE_DENTRY);
414 	if (bit_pos >= NR_INLINE_DENTRY) {
415 		err = f2fs_convert_inline_dir(dir, ipage, dentry_blk);
416 		if (!err)
417 			err = -EAGAIN;
418 		goto out;
419 	}
420 
421 	down_write(&F2FS_I(inode)->i_sem);
422 	page = init_inode_metadata(inode, dir, name, ipage);
423 	if (IS_ERR(page)) {
424 		err = PTR_ERR(page);
425 		goto fail;
426 	}
427 
428 	f2fs_wait_on_page_writeback(ipage, NODE);
429 	de = &dentry_blk->dentry[bit_pos];
430 	de->hash_code = name_hash;
431 	de->name_len = cpu_to_le16(namelen);
432 	memcpy(dentry_blk->filename[bit_pos], name->name, name->len);
433 	de->ino = cpu_to_le32(inode->i_ino);
434 	set_de_type(de, inode);
435 	for (i = 0; i < slots; i++)
436 		test_and_set_bit_le(bit_pos + i, &dentry_blk->dentry_bitmap);
437 	set_page_dirty(ipage);
438 
439 	/* we don't need to mark_inode_dirty now */
440 	F2FS_I(inode)->i_pino = dir->i_ino;
441 	update_inode(inode, page);
442 	f2fs_put_page(page, 1);
443 
444 	update_parent_metadata(dir, inode, 0);
445 fail:
446 	up_write(&F2FS_I(inode)->i_sem);
447 
448 	if (is_inode_flag_set(F2FS_I(dir), FI_UPDATE_DIR)) {
449 		update_inode(dir, ipage);
450 		clear_inode_flag(F2FS_I(dir), FI_UPDATE_DIR);
451 	}
452 out:
453 	f2fs_put_page(ipage, 1);
454 	return err;
455 }
456 
457 void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
458 					struct inode *dir, struct inode *inode)
459 {
460 	struct f2fs_inline_dentry *inline_dentry;
461 	int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
462 	unsigned int bit_pos;
463 	int i;
464 
465 	lock_page(page);
466 	f2fs_wait_on_page_writeback(page, NODE);
467 
468 	inline_dentry = inline_data_addr(page);
469 	bit_pos = dentry - inline_dentry->dentry;
470 	for (i = 0; i < slots; i++)
471 		test_and_clear_bit_le(bit_pos + i,
472 				&inline_dentry->dentry_bitmap);
473 
474 	set_page_dirty(page);
475 
476 	dir->i_ctime = dir->i_mtime = CURRENT_TIME;
477 
478 	if (inode)
479 		f2fs_drop_nlink(dir, inode, page);
480 
481 	f2fs_put_page(page, 1);
482 }
483 
484 bool f2fs_empty_inline_dir(struct inode *dir)
485 {
486 	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
487 	struct page *ipage;
488 	unsigned int bit_pos = 2;
489 	struct f2fs_inline_dentry *dentry_blk;
490 
491 	ipage = get_node_page(sbi, dir->i_ino);
492 	if (IS_ERR(ipage))
493 		return false;
494 
495 	dentry_blk = inline_data_addr(ipage);
496 	bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
497 					NR_INLINE_DENTRY,
498 					bit_pos);
499 
500 	f2fs_put_page(ipage, 1);
501 
502 	if (bit_pos < NR_INLINE_DENTRY)
503 		return false;
504 
505 	return true;
506 }
507 
508 int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx)
509 {
510 	struct inode *inode = file_inode(file);
511 	struct f2fs_inline_dentry *inline_dentry = NULL;
512 	struct page *ipage = NULL;
513 	struct f2fs_dentry_ptr d;
514 
515 	if (ctx->pos == NR_INLINE_DENTRY)
516 		return 0;
517 
518 	ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
519 	if (IS_ERR(ipage))
520 		return PTR_ERR(ipage);
521 
522 	inline_dentry = inline_data_addr(ipage);
523 
524 	make_dentry_ptr(&d, (void *)inline_dentry, 2);
525 
526 	if (!f2fs_fill_dentries(ctx, &d, 0))
527 		ctx->pos = NR_INLINE_DENTRY;
528 
529 	f2fs_put_page(ipage, 1);
530 	return 0;
531 }
532