~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/f2fs/inline.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * fs/f2fs/inline.c
  4  * Copyright (c) 2013, Intel Corporation
  5  * Authors: Huajun Li <huajun.li@intel.com>
  6  *          Haicheng Li <haicheng.li@intel.com>
  7  */
  8 
  9 #include <linux/fs.h>
 10 #include <linux/f2fs_fs.h>
 11 #include <linux/fiemap.h>
 12 
 13 #include "f2fs.h"
 14 #include "node.h"
 15 #include <trace/events/f2fs.h>
 16 
 17 static bool support_inline_data(struct inode *inode)
 18 {
 19         if (f2fs_used_in_atomic_write(inode))
 20                 return false;
 21         if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))
 22                 return false;
 23         if (i_size_read(inode) > MAX_INLINE_DATA(inode))
 24                 return false;
 25         return true;
 26 }
 27 
 28 bool f2fs_may_inline_data(struct inode *inode)
 29 {
 30         if (!support_inline_data(inode))
 31                 return false;
 32 
 33         return !f2fs_post_read_required(inode);
 34 }
 35 
 36 static bool inode_has_blocks(struct inode *inode, struct page *ipage)
 37 {
 38         struct f2fs_inode *ri = F2FS_INODE(ipage);
 39         int i;
 40 
 41         if (F2FS_HAS_BLOCKS(inode))
 42                 return true;
 43 
 44         for (i = 0; i < DEF_NIDS_PER_INODE; i++) {
 45                 if (ri->i_nid[i])
 46                         return true;
 47         }
 48         return false;
 49 }
 50 
 51 bool f2fs_sanity_check_inline_data(struct inode *inode, struct page *ipage)
 52 {
 53         if (!f2fs_has_inline_data(inode))
 54                 return false;
 55 
 56         if (inode_has_blocks(inode, ipage))
 57                 return false;
 58 
 59         if (!support_inline_data(inode))
 60                 return true;
 61 
 62         /*
 63          * used by sanity_check_inode(), when disk layout fields has not
 64          * been synchronized to inmem fields.
 65          */
 66         return (S_ISREG(inode->i_mode) &&
 67                 (file_is_encrypt(inode) || file_is_verity(inode) ||
 68                 (F2FS_I(inode)->i_flags & F2FS_COMPR_FL)));
 69 }
 70 
 71 bool f2fs_may_inline_dentry(struct inode *inode)
 72 {
 73         if (!test_opt(F2FS_I_SB(inode), INLINE_DENTRY))
 74                 return false;
 75 
 76         if (!S_ISDIR(inode->i_mode))
 77                 return false;
 78 
 79         return true;
 80 }
 81 
 82 void f2fs_do_read_inline_data(struct folio *folio, struct page *ipage)
 83 {
 84         struct inode *inode = folio_file_mapping(folio)->host;
 85 
 86         if (folio_test_uptodate(folio))
 87                 return;
 88 
 89         f2fs_bug_on(F2FS_I_SB(inode), folio_index(folio));
 90 
 91         folio_zero_segment(folio, MAX_INLINE_DATA(inode), folio_size(folio));
 92 
 93         /* Copy the whole inline data block */
 94         memcpy_to_folio(folio, 0, inline_data_addr(inode, ipage),
 95                        MAX_INLINE_DATA(inode));
 96         if (!folio_test_uptodate(folio))
 97                 folio_mark_uptodate(folio);
 98 }
 99 
100 void f2fs_truncate_inline_inode(struct inode *inode,
101                                         struct page *ipage, u64 from)
102 {
103         void *addr;
104 
105         if (from >= MAX_INLINE_DATA(inode))
106                 return;
107 
108         addr = inline_data_addr(inode, ipage);
109 
110         f2fs_wait_on_page_writeback(ipage, NODE, true, true);
111         memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
112         set_page_dirty(ipage);
113 
114         if (from == 0)
115                 clear_inode_flag(inode, FI_DATA_EXIST);
116 }
117 
118 int f2fs_read_inline_data(struct inode *inode, struct folio *folio)
119 {
120         struct page *ipage;
121 
122         ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
123         if (IS_ERR(ipage)) {
124                 folio_unlock(folio);
125                 return PTR_ERR(ipage);
126         }
127 
128         if (!f2fs_has_inline_data(inode)) {
129                 f2fs_put_page(ipage, 1);
130                 return -EAGAIN;
131         }
132 
133         if (folio_index(folio))
134                 folio_zero_segment(folio, 0, folio_size(folio));
135         else
136                 f2fs_do_read_inline_data(folio, ipage);
137 
138         if (!folio_test_uptodate(folio))
139                 folio_mark_uptodate(folio);
140         f2fs_put_page(ipage, 1);
141         folio_unlock(folio);
142         return 0;
143 }
144 
145 int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
146 {
147         struct f2fs_io_info fio = {
148                 .sbi = F2FS_I_SB(dn->inode),
149                 .ino = dn->inode->i_ino,
150                 .type = DATA,
151                 .op = REQ_OP_WRITE,
152                 .op_flags = REQ_SYNC | REQ_PRIO,
153                 .page = page,
154                 .encrypted_page = NULL,
155                 .io_type = FS_DATA_IO,
156         };
157         struct node_info ni;
158         int dirty, err;
159 
160         if (!f2fs_exist_data(dn->inode))
161                 goto clear_out;
162 
163         err = f2fs_reserve_block(dn, 0);
164         if (err)
165                 return err;
166 
167         err = f2fs_get_node_info(fio.sbi, dn->nid, &ni, false);
168         if (err) {
169                 f2fs_truncate_data_blocks_range(dn, 1);
170                 f2fs_put_dnode(dn);
171                 return err;
172         }
173 
174         fio.version = ni.version;
175 
176         if (unlikely(dn->data_blkaddr != NEW_ADDR)) {
177                 f2fs_put_dnode(dn);
178                 set_sbi_flag(fio.sbi, SBI_NEED_FSCK);
179                 f2fs_warn(fio.sbi, "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
180                           __func__, dn->inode->i_ino, dn->data_blkaddr);
181                 f2fs_handle_error(fio.sbi, ERROR_INVALID_BLKADDR);
182                 return -EFSCORRUPTED;
183         }
184 
185         f2fs_bug_on(F2FS_P_SB(page), folio_test_writeback(page_folio(page)));
186 
187         f2fs_do_read_inline_data(page_folio(page), dn->inode_page);
188         set_page_dirty(page);
189 
190         /* clear dirty state */
191         dirty = clear_page_dirty_for_io(page);
192 
193         /* write data page to try to make data consistent */
194         set_page_writeback(page);
195         fio.old_blkaddr = dn->data_blkaddr;
196         set_inode_flag(dn->inode, FI_HOT_DATA);
197         f2fs_outplace_write_data(dn, &fio);
198         f2fs_wait_on_page_writeback(page, DATA, true, true);
199         if (dirty) {
200                 inode_dec_dirty_pages(dn->inode);
201                 f2fs_remove_dirty_inode(dn->inode);
202         }
203 
204         /* this converted inline_data should be recovered. */
205         set_inode_flag(dn->inode, FI_APPEND_WRITE);
206 
207         /* clear inline data and flag after data writeback */
208         f2fs_truncate_inline_inode(dn->inode, dn->inode_page, 0);
209         clear_page_private_inline(dn->inode_page);
210 clear_out:
211         stat_dec_inline_inode(dn->inode);
212         clear_inode_flag(dn->inode, FI_INLINE_DATA);
213         f2fs_put_dnode(dn);
214         return 0;
215 }
216 
217 int f2fs_convert_inline_inode(struct inode *inode)
218 {
219         struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
220         struct dnode_of_data dn;
221         struct page *ipage, *page;
222         int err = 0;
223 
224         if (f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
225                 return -EROFS;
226 
227         if (!f2fs_has_inline_data(inode))
228                 return 0;
229 
230         err = f2fs_dquot_initialize(inode);
231         if (err)
232                 return err;
233 
234         page = f2fs_grab_cache_page(inode->i_mapping, 0, false);
235         if (!page)
236                 return -ENOMEM;
237 
238         f2fs_lock_op(sbi);
239 
240         ipage = f2fs_get_node_page(sbi, inode->i_ino);
241         if (IS_ERR(ipage)) {
242                 err = PTR_ERR(ipage);
243                 goto out;
244         }
245 
246         set_new_dnode(&dn, inode, ipage, ipage, 0);
247 
248         if (f2fs_has_inline_data(inode))
249                 err = f2fs_convert_inline_page(&dn, page);
250 
251         f2fs_put_dnode(&dn);
252 out:
253         f2fs_unlock_op(sbi);
254 
255         f2fs_put_page(page, 1);
256 
257         if (!err)
258                 f2fs_balance_fs(sbi, dn.node_changed);
259 
260         return err;
261 }
262 
263 int f2fs_write_inline_data(struct inode *inode, struct page *page)
264 {
265         struct dnode_of_data dn;
266         int err;
267 
268         set_new_dnode(&dn, inode, NULL, NULL, 0);
269         err = f2fs_get_dnode_of_data(&dn, 0, LOOKUP_NODE);
270         if (err)
271                 return err;
272 
273         if (!f2fs_has_inline_data(inode)) {
274                 f2fs_put_dnode(&dn);
275                 return -EAGAIN;
276         }
277 
278         f2fs_bug_on(F2FS_I_SB(inode), page->index);
279 
280         f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
281         memcpy_from_page(inline_data_addr(inode, dn.inode_page),
282                          page, 0, MAX_INLINE_DATA(inode));
283         set_page_dirty(dn.inode_page);
284 
285         f2fs_clear_page_cache_dirty_tag(page);
286 
287         set_inode_flag(inode, FI_APPEND_WRITE);
288         set_inode_flag(inode, FI_DATA_EXIST);
289 
290         clear_page_private_inline(dn.inode_page);
291         f2fs_put_dnode(&dn);
292         return 0;
293 }
294 
295 int f2fs_recover_inline_data(struct inode *inode, struct page *npage)
296 {
297         struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
298         struct f2fs_inode *ri = NULL;
299         void *src_addr, *dst_addr;
300         struct page *ipage;
301 
302         /*
303          * The inline_data recovery policy is as follows.
304          * [prev.] [next] of inline_data flag
305          *    o       o  -> recover inline_data
306          *    o       x  -> remove inline_data, and then recover data blocks
307          *    x       o  -> remove data blocks, and then recover inline_data
308          *    x       x  -> recover data blocks
309          */
310         if (IS_INODE(npage))
311                 ri = F2FS_INODE(npage);
312 
313         if (f2fs_has_inline_data(inode) &&
314                         ri && (ri->i_inline & F2FS_INLINE_DATA)) {
315 process_inline:
316                 ipage = f2fs_get_node_page(sbi, inode->i_ino);
317                 if (IS_ERR(ipage))
318                         return PTR_ERR(ipage);
319 
320                 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
321 
322                 src_addr = inline_data_addr(inode, npage);
323                 dst_addr = inline_data_addr(inode, ipage);
324                 memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
325 
326                 set_inode_flag(inode, FI_INLINE_DATA);
327                 set_inode_flag(inode, FI_DATA_EXIST);
328 
329                 set_page_dirty(ipage);
330                 f2fs_put_page(ipage, 1);
331                 return 1;
332         }
333 
334         if (f2fs_has_inline_data(inode)) {
335                 ipage = f2fs_get_node_page(sbi, inode->i_ino);
336                 if (IS_ERR(ipage))
337                         return PTR_ERR(ipage);
338                 f2fs_truncate_inline_inode(inode, ipage, 0);
339                 stat_dec_inline_inode(inode);
340                 clear_inode_flag(inode, FI_INLINE_DATA);
341                 f2fs_put_page(ipage, 1);
342         } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
343                 int ret;
344 
345                 ret = f2fs_truncate_blocks(inode, 0, false);
346                 if (ret)
347                         return ret;
348                 stat_inc_inline_inode(inode);
349                 goto process_inline;
350         }
351         return 0;
352 }
353 
354 struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
355                                         const struct f2fs_filename *fname,
356                                         struct page **res_page)
357 {
358         struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
359         struct f2fs_dir_entry *de;
360         struct f2fs_dentry_ptr d;
361         struct page *ipage;
362         void *inline_dentry;
363 
364         ipage = f2fs_get_node_page(sbi, dir->i_ino);
365         if (IS_ERR(ipage)) {
366                 *res_page = ipage;
367                 return NULL;
368         }
369 
370         inline_dentry = inline_data_addr(dir, ipage);
371 
372         make_dentry_ptr_inline(dir, &d, inline_dentry);
373         de = f2fs_find_target_dentry(&d, fname, NULL);
374         unlock_page(ipage);
375         if (IS_ERR(de)) {
376                 *res_page = ERR_CAST(de);
377                 de = NULL;
378         }
379         if (de)
380                 *res_page = ipage;
381         else
382                 f2fs_put_page(ipage, 0);
383 
384         return de;
385 }
386 
387 int f2fs_make_empty_inline_dir(struct inode *inode, struct inode *parent,
388                                                         struct page *ipage)
389 {
390         struct f2fs_dentry_ptr d;
391         void *inline_dentry;
392 
393         inline_dentry = inline_data_addr(inode, ipage);
394 
395         make_dentry_ptr_inline(inode, &d, inline_dentry);
396         f2fs_do_make_empty_dir(inode, parent, &d);
397 
398         set_page_dirty(ipage);
399 
400         /* update i_size to MAX_INLINE_DATA */
401         if (i_size_read(inode) < MAX_INLINE_DATA(inode))
402                 f2fs_i_size_write(inode, MAX_INLINE_DATA(inode));
403         return 0;
404 }
405 
406 /*
407  * NOTE: ipage is grabbed by caller, but if any error occurs, we should
408  * release ipage in this function.
409  */
410 static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
411                                                         void *inline_dentry)
412 {
413         struct page *page;
414         struct dnode_of_data dn;
415         struct f2fs_dentry_block *dentry_blk;
416         struct f2fs_dentry_ptr src, dst;
417         int err;
418 
419         page = f2fs_grab_cache_page(dir->i_mapping, 0, true);
420         if (!page) {
421                 f2fs_put_page(ipage, 1);
422                 return -ENOMEM;
423         }
424 
425         set_new_dnode(&dn, dir, ipage, NULL, 0);
426         err = f2fs_reserve_block(&dn, 0);
427         if (err)
428                 goto out;
429 
430         if (unlikely(dn.data_blkaddr != NEW_ADDR)) {
431                 f2fs_put_dnode(&dn);
432                 set_sbi_flag(F2FS_P_SB(page), SBI_NEED_FSCK);
433                 f2fs_warn(F2FS_P_SB(page), "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
434                           __func__, dir->i_ino, dn.data_blkaddr);
435                 f2fs_handle_error(F2FS_P_SB(page), ERROR_INVALID_BLKADDR);
436                 err = -EFSCORRUPTED;
437                 goto out;
438         }
439 
440         f2fs_wait_on_page_writeback(page, DATA, true, true);
441 
442         dentry_blk = page_address(page);
443 
444         /*
445          * Start by zeroing the full block, to ensure that all unused space is
446          * zeroed and no uninitialized memory is leaked to disk.
447          */
448         memset(dentry_blk, 0, F2FS_BLKSIZE);
449 
450         make_dentry_ptr_inline(dir, &src, inline_dentry);
451         make_dentry_ptr_block(dir, &dst, dentry_blk);
452 
453         /* copy data from inline dentry block to new dentry block */
454         memcpy(dst.bitmap, src.bitmap, src.nr_bitmap);
455         memcpy(dst.dentry, src.dentry, SIZE_OF_DIR_ENTRY * src.max);
456         memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
457 
458         if (!PageUptodate(page))
459                 SetPageUptodate(page);
460         set_page_dirty(page);
461 
462         /* clear inline dir and flag after data writeback */
463         f2fs_truncate_inline_inode(dir, ipage, 0);
464 
465         stat_dec_inline_dir(dir);
466         clear_inode_flag(dir, FI_INLINE_DENTRY);
467 
468         /*
469          * should retrieve reserved space which was used to keep
470          * inline_dentry's structure for backward compatibility.
471          */
472         if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
473                         !f2fs_has_inline_xattr(dir))
474                 F2FS_I(dir)->i_inline_xattr_size = 0;
475 
476         f2fs_i_depth_write(dir, 1);
477         if (i_size_read(dir) < PAGE_SIZE)
478                 f2fs_i_size_write(dir, PAGE_SIZE);
479 out:
480         f2fs_put_page(page, 1);
481         return err;
482 }
483 
484 static int f2fs_add_inline_entries(struct inode *dir, void *inline_dentry)
485 {
486         struct f2fs_dentry_ptr d;
487         unsigned long bit_pos = 0;
488         int err = 0;
489 
490         make_dentry_ptr_inline(dir, &d, inline_dentry);
491 
492         while (bit_pos < d.max) {
493                 struct f2fs_dir_entry *de;
494                 struct f2fs_filename fname;
495                 nid_t ino;
496                 umode_t fake_mode;
497 
498                 if (!test_bit_le(bit_pos, d.bitmap)) {
499                         bit_pos++;
500                         continue;
501                 }
502 
503                 de = &d.dentry[bit_pos];
504 
505                 if (unlikely(!de->name_len)) {
506                         bit_pos++;
507                         continue;
508                 }
509 
510                 /*
511                  * We only need the disk_name and hash to move the dentry.
512                  * We don't need the original or casefolded filenames.
513                  */
514                 memset(&fname, 0, sizeof(fname));
515                 fname.disk_name.name = d.filename[bit_pos];
516                 fname.disk_name.len = le16_to_cpu(de->name_len);
517                 fname.hash = de->hash_code;
518 
519                 ino = le32_to_cpu(de->ino);
520                 fake_mode = fs_ftype_to_dtype(de->file_type) << S_DT_SHIFT;
521 
522                 err = f2fs_add_regular_entry(dir, &fname, NULL, ino, fake_mode);
523                 if (err)
524                         goto punch_dentry_pages;
525 
526                 bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
527         }
528         return 0;
529 punch_dentry_pages:
530         truncate_inode_pages(&dir->i_data, 0);
531         f2fs_truncate_blocks(dir, 0, false);
532         f2fs_remove_dirty_inode(dir);
533         return err;
534 }
535 
536 static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
537                                                         void *inline_dentry)
538 {
539         void *backup_dentry;
540         int err;
541 
542         backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
543                                 MAX_INLINE_DATA(dir), GFP_F2FS_ZERO);
544         if (!backup_dentry) {
545                 f2fs_put_page(ipage, 1);
546                 return -ENOMEM;
547         }
548 
549         memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA(dir));
550         f2fs_truncate_inline_inode(dir, ipage, 0);
551 
552         unlock_page(ipage);
553 
554         err = f2fs_add_inline_entries(dir, backup_dentry);
555         if (err)
556                 goto recover;
557 
558         lock_page(ipage);
559 
560         stat_dec_inline_dir(dir);
561         clear_inode_flag(dir, FI_INLINE_DENTRY);
562 
563         /*
564          * should retrieve reserved space which was used to keep
565          * inline_dentry's structure for backward compatibility.
566          */
567         if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
568                         !f2fs_has_inline_xattr(dir))
569                 F2FS_I(dir)->i_inline_xattr_size = 0;
570 
571         kfree(backup_dentry);
572         return 0;
573 recover:
574         lock_page(ipage);
575         f2fs_wait_on_page_writeback(ipage, NODE, true, true);
576         memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
577         f2fs_i_depth_write(dir, 0);
578         f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
579         set_page_dirty(ipage);
580         f2fs_put_page(ipage, 1);
581 
582         kfree(backup_dentry);
583         return err;
584 }
585 
586 static int do_convert_inline_dir(struct inode *dir, struct page *ipage,
587                                                         void *inline_dentry)
588 {
589         if (!F2FS_I(dir)->i_dir_level)
590                 return f2fs_move_inline_dirents(dir, ipage, inline_dentry);
591         else
592                 return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry);
593 }
594 
595 int f2fs_try_convert_inline_dir(struct inode *dir, struct dentry *dentry)
596 {
597         struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
598         struct page *ipage;
599         struct f2fs_filename fname;
600         void *inline_dentry = NULL;
601         int err = 0;
602 
603         if (!f2fs_has_inline_dentry(dir))
604                 return 0;
605 
606         f2fs_lock_op(sbi);
607 
608         err = f2fs_setup_filename(dir, &dentry->d_name, 0, &fname);
609         if (err)
610                 goto out;
611 
612         ipage = f2fs_get_node_page(sbi, dir->i_ino);
613         if (IS_ERR(ipage)) {
614                 err = PTR_ERR(ipage);
615                 goto out_fname;
616         }
617 
618         if (f2fs_has_enough_room(dir, ipage, &fname)) {
619                 f2fs_put_page(ipage, 1);
620                 goto out_fname;
621         }
622 
623         inline_dentry = inline_data_addr(dir, ipage);
624 
625         err = do_convert_inline_dir(dir, ipage, inline_dentry);
626         if (!err)
627                 f2fs_put_page(ipage, 1);
628 out_fname:
629         f2fs_free_filename(&fname);
630 out:
631         f2fs_unlock_op(sbi);
632         return err;
633 }
634 
635 int f2fs_add_inline_entry(struct inode *dir, const struct f2fs_filename *fname,
636                           struct inode *inode, nid_t ino, umode_t mode)
637 {
638         struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
639         struct page *ipage;
640         unsigned int bit_pos;
641         void *inline_dentry = NULL;
642         struct f2fs_dentry_ptr d;
643         int slots = GET_DENTRY_SLOTS(fname->disk_name.len);
644         struct page *page = NULL;
645         int err = 0;
646 
647         ipage = f2fs_get_node_page(sbi, dir->i_ino);
648         if (IS_ERR(ipage))
649                 return PTR_ERR(ipage);
650 
651         inline_dentry = inline_data_addr(dir, ipage);
652         make_dentry_ptr_inline(dir, &d, inline_dentry);
653 
654         bit_pos = f2fs_room_for_filename(d.bitmap, slots, d.max);
655         if (bit_pos >= d.max) {
656                 err = do_convert_inline_dir(dir, ipage, inline_dentry);
657                 if (err)
658                         return err;
659                 err = -EAGAIN;
660                 goto out;
661         }
662 
663         if (inode) {
664                 f2fs_down_write_nested(&F2FS_I(inode)->i_sem,
665                                                 SINGLE_DEPTH_NESTING);
666                 page = f2fs_init_inode_metadata(inode, dir, fname, ipage);
667                 if (IS_ERR(page)) {
668                         err = PTR_ERR(page);
669                         goto fail;
670                 }
671         }
672 
673         f2fs_wait_on_page_writeback(ipage, NODE, true, true);
674 
675         f2fs_update_dentry(ino, mode, &d, &fname->disk_name, fname->hash,
676                            bit_pos);
677 
678         set_page_dirty(ipage);
679 
680         /* we don't need to mark_inode_dirty now */
681         if (inode) {
682                 f2fs_i_pino_write(inode, dir->i_ino);
683 
684                 /* synchronize inode page's data from inode cache */
685                 if (is_inode_flag_set(inode, FI_NEW_INODE))
686                         f2fs_update_inode(inode, page);
687 
688                 f2fs_put_page(page, 1);
689         }
690 
691         f2fs_update_parent_metadata(dir, inode, 0);
692 fail:
693         if (inode)
694                 f2fs_up_write(&F2FS_I(inode)->i_sem);
695 out:
696         f2fs_put_page(ipage, 1);
697         return err;
698 }
699 
700 void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
701                                         struct inode *dir, struct inode *inode)
702 {
703         struct f2fs_dentry_ptr d;
704         void *inline_dentry;
705         int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
706         unsigned int bit_pos;
707         int i;
708 
709         lock_page(page);
710         f2fs_wait_on_page_writeback(page, NODE, true, true);
711 
712         inline_dentry = inline_data_addr(dir, page);
713         make_dentry_ptr_inline(dir, &d, inline_dentry);
714 
715         bit_pos = dentry - d.dentry;
716         for (i = 0; i < slots; i++)
717                 __clear_bit_le(bit_pos + i, d.bitmap);
718 
719         set_page_dirty(page);
720         f2fs_put_page(page, 1);
721 
722         inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
723         f2fs_mark_inode_dirty_sync(dir, false);
724 
725         if (inode)
726                 f2fs_drop_nlink(dir, inode);
727 }
728 
729 bool f2fs_empty_inline_dir(struct inode *dir)
730 {
731         struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
732         struct page *ipage;
733         unsigned int bit_pos = 2;
734         void *inline_dentry;
735         struct f2fs_dentry_ptr d;
736 
737         ipage = f2fs_get_node_page(sbi, dir->i_ino);
738         if (IS_ERR(ipage))
739                 return false;
740 
741         inline_dentry = inline_data_addr(dir, ipage);
742         make_dentry_ptr_inline(dir, &d, inline_dentry);
743 
744         bit_pos = find_next_bit_le(d.bitmap, d.max, bit_pos);
745 
746         f2fs_put_page(ipage, 1);
747 
748         if (bit_pos < d.max)
749                 return false;
750 
751         return true;
752 }
753 
754 int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
755                                 struct fscrypt_str *fstr)
756 {
757         struct inode *inode = file_inode(file);
758         struct page *ipage = NULL;
759         struct f2fs_dentry_ptr d;
760         void *inline_dentry = NULL;
761         int err;
762 
763         make_dentry_ptr_inline(inode, &d, inline_dentry);
764 
765         if (ctx->pos == d.max)
766                 return 0;
767 
768         ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
769         if (IS_ERR(ipage))
770                 return PTR_ERR(ipage);
771 
772         /*
773          * f2fs_readdir was protected by inode.i_rwsem, it is safe to access
774          * ipage without page's lock held.
775          */
776         unlock_page(ipage);
777 
778         inline_dentry = inline_data_addr(inode, ipage);
779 
780         make_dentry_ptr_inline(inode, &d, inline_dentry);
781 
782         err = f2fs_fill_dentries(ctx, &d, 0, fstr);
783         if (!err)
784                 ctx->pos = d.max;
785 
786         f2fs_put_page(ipage, 0);
787         return err < 0 ? err : 0;
788 }
789 
790 int f2fs_inline_data_fiemap(struct inode *inode,
791                 struct fiemap_extent_info *fieinfo, __u64 start, __u64 len)
792 {
793         __u64 byteaddr, ilen;
794         __u32 flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED |
795                 FIEMAP_EXTENT_LAST;
796         struct node_info ni;
797         struct page *ipage;
798         int err = 0;
799 
800         ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
801         if (IS_ERR(ipage))
802                 return PTR_ERR(ipage);
803 
804         if ((S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
805                                 !f2fs_has_inline_data(inode)) {
806                 err = -EAGAIN;
807                 goto out;
808         }
809 
810         if (S_ISDIR(inode->i_mode) && !f2fs_has_inline_dentry(inode)) {
811                 err = -EAGAIN;
812                 goto out;
813         }
814 
815         ilen = min_t(size_t, MAX_INLINE_DATA(inode), i_size_read(inode));
816         if (start >= ilen)
817                 goto out;
818         if (start + len < ilen)
819                 ilen = start + len;
820         ilen -= start;
821 
822         err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni, false);
823         if (err)
824                 goto out;
825 
826         byteaddr = (__u64)ni.blk_addr << inode->i_sb->s_blocksize_bits;
827         byteaddr += (char *)inline_data_addr(inode, ipage) -
828                                         (char *)F2FS_INODE(ipage);
829         err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
830         trace_f2fs_fiemap(inode, start, byteaddr, ilen, flags, err);
831 out:
832         f2fs_put_page(ipage, 1);
833         return err;
834 }
835 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php