linux/fs/f2fs/inline.c
<<
>>
Prefs
   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#include "node.h"
  16
  17bool f2fs_may_inline_data(struct inode *inode)
  18{
  19        if (f2fs_is_atomic_file(inode))
  20                return false;
  21
  22        if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))
  23                return false;
  24
  25        if (i_size_read(inode) > MAX_INLINE_DATA)
  26                return false;
  27
  28        if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
  29                return false;
  30
  31        return true;
  32}
  33
  34bool f2fs_may_inline_dentry(struct inode *inode)
  35{
  36        if (!test_opt(F2FS_I_SB(inode), INLINE_DENTRY))
  37                return false;
  38
  39        if (!S_ISDIR(inode->i_mode))
  40                return false;
  41
  42        return true;
  43}
  44
  45void read_inline_data(struct page *page, struct page *ipage)
  46{
  47        void *src_addr, *dst_addr;
  48
  49        if (PageUptodate(page))
  50                return;
  51
  52        f2fs_bug_on(F2FS_P_SB(page), page->index);
  53
  54        zero_user_segment(page, MAX_INLINE_DATA, PAGE_SIZE);
  55
  56        /* Copy the whole inline data block */
  57        src_addr = inline_data_addr(ipage);
  58        dst_addr = kmap_atomic(page);
  59        memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
  60        flush_dcache_page(page);
  61        kunmap_atomic(dst_addr);
  62        if (!PageUptodate(page))
  63                SetPageUptodate(page);
  64}
  65
  66bool truncate_inline_inode(struct page *ipage, u64 from)
  67{
  68        void *addr;
  69
  70        if (from >= MAX_INLINE_DATA)
  71                return false;
  72
  73        addr = inline_data_addr(ipage);
  74
  75        f2fs_wait_on_page_writeback(ipage, NODE, true);
  76        memset(addr + from, 0, MAX_INLINE_DATA - from);
  77        set_page_dirty(ipage);
  78        return true;
  79}
  80
  81int f2fs_read_inline_data(struct inode *inode, struct page *page)
  82{
  83        struct page *ipage;
  84
  85        ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
  86        if (IS_ERR(ipage)) {
  87                unlock_page(page);
  88                return PTR_ERR(ipage);
  89        }
  90
  91        if (!f2fs_has_inline_data(inode)) {
  92                f2fs_put_page(ipage, 1);
  93                return -EAGAIN;
  94        }
  95
  96        if (page->index)
  97                zero_user_segment(page, 0, PAGE_SIZE);
  98        else
  99                read_inline_data(page, ipage);
 100
 101        if (!PageUptodate(page))
 102                SetPageUptodate(page);
 103        f2fs_put_page(ipage, 1);
 104        unlock_page(page);
 105        return 0;
 106}
 107
 108int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
 109{
 110        struct f2fs_io_info fio = {
 111                .sbi = F2FS_I_SB(dn->inode),
 112                .type = DATA,
 113                .op = REQ_OP_WRITE,
 114                .op_flags = REQ_SYNC | REQ_PRIO,
 115                .page = page,
 116                .encrypted_page = NULL,
 117        };
 118        int dirty, err;
 119
 120        if (!f2fs_exist_data(dn->inode))
 121                goto clear_out;
 122
 123        err = f2fs_reserve_block(dn, 0);
 124        if (err)
 125                return err;
 126
 127        f2fs_bug_on(F2FS_P_SB(page), PageWriteback(page));
 128
 129        read_inline_data(page, dn->inode_page);
 130        set_page_dirty(page);
 131
 132        /* clear dirty state */
 133        dirty = clear_page_dirty_for_io(page);
 134
 135        /* write data page to try to make data consistent */
 136        set_page_writeback(page);
 137        fio.old_blkaddr = dn->data_blkaddr;
 138        write_data_page(dn, &fio);
 139        f2fs_wait_on_page_writeback(page, DATA, true);
 140        if (dirty) {
 141                inode_dec_dirty_pages(dn->inode);
 142                remove_dirty_inode(dn->inode);
 143        }
 144
 145        /* this converted inline_data should be recovered. */
 146        set_inode_flag(dn->inode, FI_APPEND_WRITE);
 147
 148        /* clear inline data and flag after data writeback */
 149        truncate_inline_inode(dn->inode_page, 0);
 150        clear_inline_node(dn->inode_page);
 151clear_out:
 152        stat_dec_inline_inode(dn->inode);
 153        f2fs_clear_inline_inode(dn->inode);
 154        f2fs_put_dnode(dn);
 155        return 0;
 156}
 157
 158int f2fs_convert_inline_inode(struct inode *inode)
 159{
 160        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 161        struct dnode_of_data dn;
 162        struct page *ipage, *page;
 163        int err = 0;
 164
 165        if (!f2fs_has_inline_data(inode))
 166                return 0;
 167
 168        page = f2fs_grab_cache_page(inode->i_mapping, 0, false);
 169        if (!page)
 170                return -ENOMEM;
 171
 172        f2fs_lock_op(sbi);
 173
 174        ipage = get_node_page(sbi, inode->i_ino);
 175        if (IS_ERR(ipage)) {
 176                err = PTR_ERR(ipage);
 177                goto out;
 178        }
 179
 180        set_new_dnode(&dn, inode, ipage, ipage, 0);
 181
 182        if (f2fs_has_inline_data(inode))
 183                err = f2fs_convert_inline_page(&dn, page);
 184
 185        f2fs_put_dnode(&dn);
 186out:
 187        f2fs_unlock_op(sbi);
 188
 189        f2fs_put_page(page, 1);
 190
 191        f2fs_balance_fs(sbi, dn.node_changed);
 192
 193        return err;
 194}
 195
 196int f2fs_write_inline_data(struct inode *inode, struct page *page)
 197{
 198        void *src_addr, *dst_addr;
 199        struct dnode_of_data dn;
 200        int err;
 201
 202        set_new_dnode(&dn, inode, NULL, NULL, 0);
 203        err = get_dnode_of_data(&dn, 0, LOOKUP_NODE);
 204        if (err)
 205                return err;
 206
 207        if (!f2fs_has_inline_data(inode)) {
 208                f2fs_put_dnode(&dn);
 209                return -EAGAIN;
 210        }
 211
 212        f2fs_bug_on(F2FS_I_SB(inode), page->index);
 213
 214        f2fs_wait_on_page_writeback(dn.inode_page, NODE, true);
 215        src_addr = kmap_atomic(page);
 216        dst_addr = inline_data_addr(dn.inode_page);
 217        memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
 218        kunmap_atomic(src_addr);
 219        set_page_dirty(dn.inode_page);
 220
 221        set_inode_flag(inode, FI_APPEND_WRITE);
 222        set_inode_flag(inode, FI_DATA_EXIST);
 223
 224        clear_inline_node(dn.inode_page);
 225        f2fs_put_dnode(&dn);
 226        return 0;
 227}
 228
 229bool recover_inline_data(struct inode *inode, struct page *npage)
 230{
 231        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 232        struct f2fs_inode *ri = NULL;
 233        void *src_addr, *dst_addr;
 234        struct page *ipage;
 235
 236        /*
 237         * The inline_data recovery policy is as follows.
 238         * [prev.] [next] of inline_data flag
 239         *    o       o  -> recover inline_data
 240         *    o       x  -> remove inline_data, and then recover data blocks
 241         *    x       o  -> remove inline_data, and then recover inline_data
 242         *    x       x  -> recover data blocks
 243         */
 244        if (IS_INODE(npage))
 245                ri = F2FS_INODE(npage);
 246
 247        if (f2fs_has_inline_data(inode) &&
 248                        ri && (ri->i_inline & F2FS_INLINE_DATA)) {
 249process_inline:
 250                ipage = get_node_page(sbi, inode->i_ino);
 251                f2fs_bug_on(sbi, IS_ERR(ipage));
 252
 253                f2fs_wait_on_page_writeback(ipage, NODE, true);
 254
 255                src_addr = inline_data_addr(npage);
 256                dst_addr = inline_data_addr(ipage);
 257                memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
 258
 259                set_inode_flag(inode, FI_INLINE_DATA);
 260                set_inode_flag(inode, FI_DATA_EXIST);
 261
 262                set_page_dirty(ipage);
 263                f2fs_put_page(ipage, 1);
 264                return true;
 265        }
 266
 267        if (f2fs_has_inline_data(inode)) {
 268                ipage = get_node_page(sbi, inode->i_ino);
 269                f2fs_bug_on(sbi, IS_ERR(ipage));
 270                if (!truncate_inline_inode(ipage, 0))
 271                        return false;
 272                f2fs_clear_inline_inode(inode);
 273                f2fs_put_page(ipage, 1);
 274        } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
 275                if (truncate_blocks(inode, 0, false))
 276                        return false;
 277                goto process_inline;
 278        }
 279        return false;
 280}
 281
 282struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
 283                        struct fscrypt_name *fname, struct page **res_page)
 284{
 285        struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
 286        struct f2fs_inline_dentry *inline_dentry;
 287        struct qstr name = FSTR_TO_QSTR(&fname->disk_name);
 288        struct f2fs_dir_entry *de;
 289        struct f2fs_dentry_ptr d;
 290        struct page *ipage;
 291        f2fs_hash_t namehash;
 292
 293        ipage = get_node_page(sbi, dir->i_ino);
 294        if (IS_ERR(ipage)) {
 295                *res_page = ipage;
 296                return NULL;
 297        }
 298
 299        namehash = f2fs_dentry_hash(&name);
 300
 301        inline_dentry = inline_data_addr(ipage);
 302
 303        make_dentry_ptr(NULL, &d, (void *)inline_dentry, 2);
 304        de = find_target_dentry(fname, namehash, NULL, &d);
 305        unlock_page(ipage);
 306        if (de)
 307                *res_page = ipage;
 308        else
 309                f2fs_put_page(ipage, 0);
 310
 311        return de;
 312}
 313
 314int make_empty_inline_dir(struct inode *inode, struct inode *parent,
 315                                                        struct page *ipage)
 316{
 317        struct f2fs_inline_dentry *dentry_blk;
 318        struct f2fs_dentry_ptr d;
 319
 320        dentry_blk = inline_data_addr(ipage);
 321
 322        make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2);
 323        do_make_empty_dir(inode, parent, &d);
 324
 325        set_page_dirty(ipage);
 326
 327        /* update i_size to MAX_INLINE_DATA */
 328        if (i_size_read(inode) < MAX_INLINE_DATA)
 329                f2fs_i_size_write(inode, MAX_INLINE_DATA);
 330        return 0;
 331}
 332
 333/*
 334 * NOTE: ipage is grabbed by caller, but if any error occurs, we should
 335 * release ipage in this function.
 336 */
 337static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
 338                                struct f2fs_inline_dentry *inline_dentry)
 339{
 340        struct page *page;
 341        struct dnode_of_data dn;
 342        struct f2fs_dentry_block *dentry_blk;
 343        int err;
 344
 345        page = f2fs_grab_cache_page(dir->i_mapping, 0, false);
 346        if (!page) {
 347                f2fs_put_page(ipage, 1);
 348                return -ENOMEM;
 349        }
 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, true);
 357        zero_user_segment(page, MAX_INLINE_DATA, PAGE_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        memset(dentry_blk->dentry_bitmap + INLINE_DENTRY_BITMAP_SIZE, 0,
 365                        SIZE_OF_DENTRY_BITMAP - INLINE_DENTRY_BITMAP_SIZE);
 366        /*
 367         * we do not need to zero out remainder part of dentry and filename
 368         * field, since we have used bitmap for marking the usage status of
 369         * them, besides, we can also ignore copying/zeroing reserved space
 370         * of dentry block, because them haven't been used so far.
 371         */
 372        memcpy(dentry_blk->dentry, inline_dentry->dentry,
 373                        sizeof(struct f2fs_dir_entry) * NR_INLINE_DENTRY);
 374        memcpy(dentry_blk->filename, inline_dentry->filename,
 375                                        NR_INLINE_DENTRY * F2FS_SLOT_LEN);
 376
 377        kunmap_atomic(dentry_blk);
 378        if (!PageUptodate(page))
 379                SetPageUptodate(page);
 380        set_page_dirty(page);
 381
 382        /* clear inline dir and flag after data writeback */
 383        truncate_inline_inode(ipage, 0);
 384
 385        stat_dec_inline_dir(dir);
 386        clear_inode_flag(dir, FI_INLINE_DENTRY);
 387
 388        f2fs_i_depth_write(dir, 1);
 389        if (i_size_read(dir) < PAGE_SIZE)
 390                f2fs_i_size_write(dir, PAGE_SIZE);
 391out:
 392        f2fs_put_page(page, 1);
 393        return err;
 394}
 395
 396static int f2fs_add_inline_entries(struct inode *dir,
 397                        struct f2fs_inline_dentry *inline_dentry)
 398{
 399        struct f2fs_dentry_ptr d;
 400        unsigned long bit_pos = 0;
 401        int err = 0;
 402
 403        make_dentry_ptr(NULL, &d, (void *)inline_dentry, 2);
 404
 405        while (bit_pos < d.max) {
 406                struct f2fs_dir_entry *de;
 407                struct qstr new_name;
 408                nid_t ino;
 409                umode_t fake_mode;
 410
 411                if (!test_bit_le(bit_pos, d.bitmap)) {
 412                        bit_pos++;
 413                        continue;
 414                }
 415
 416                de = &d.dentry[bit_pos];
 417
 418                if (unlikely(!de->name_len)) {
 419                        bit_pos++;
 420                        continue;
 421                }
 422
 423                new_name.name = d.filename[bit_pos];
 424                new_name.len = le16_to_cpu(de->name_len);
 425
 426                ino = le32_to_cpu(de->ino);
 427                fake_mode = get_de_type(de) << S_SHIFT;
 428
 429                err = f2fs_add_regular_entry(dir, &new_name, NULL, NULL,
 430                                                        ino, fake_mode);
 431                if (err)
 432                        goto punch_dentry_pages;
 433
 434                bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
 435        }
 436        return 0;
 437punch_dentry_pages:
 438        truncate_inode_pages(&dir->i_data, 0);
 439        truncate_blocks(dir, 0, false);
 440        remove_dirty_inode(dir);
 441        return err;
 442}
 443
 444static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
 445                                struct f2fs_inline_dentry *inline_dentry)
 446{
 447        struct f2fs_inline_dentry *backup_dentry;
 448        int err;
 449
 450        backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
 451                        sizeof(struct f2fs_inline_dentry), GFP_F2FS_ZERO);
 452        if (!backup_dentry) {
 453                f2fs_put_page(ipage, 1);
 454                return -ENOMEM;
 455        }
 456
 457        memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA);
 458        truncate_inline_inode(ipage, 0);
 459
 460        unlock_page(ipage);
 461
 462        err = f2fs_add_inline_entries(dir, backup_dentry);
 463        if (err)
 464                goto recover;
 465
 466        lock_page(ipage);
 467
 468        stat_dec_inline_dir(dir);
 469        clear_inode_flag(dir, FI_INLINE_DENTRY);
 470        kfree(backup_dentry);
 471        return 0;
 472recover:
 473        lock_page(ipage);
 474        memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
 475        f2fs_i_depth_write(dir, 0);
 476        f2fs_i_size_write(dir, MAX_INLINE_DATA);
 477        set_page_dirty(ipage);
 478        f2fs_put_page(ipage, 1);
 479
 480        kfree(backup_dentry);
 481        return err;
 482}
 483
 484static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
 485                                struct f2fs_inline_dentry *inline_dentry)
 486{
 487        if (!F2FS_I(dir)->i_dir_level)
 488                return f2fs_move_inline_dirents(dir, ipage, inline_dentry);
 489        else
 490                return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry);
 491}
 492
 493int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
 494                                const struct qstr *orig_name,
 495                                struct inode *inode, nid_t ino, umode_t mode)
 496{
 497        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
 498        struct page *ipage;
 499        unsigned int bit_pos;
 500        f2fs_hash_t name_hash;
 501        struct f2fs_inline_dentry *dentry_blk = NULL;
 502        struct f2fs_dentry_ptr d;
 503        int slots = GET_DENTRY_SLOTS(new_name->len);
 504        struct page *page = NULL;
 505        int err = 0;
 506
 507        ipage = get_node_page(sbi, dir->i_ino);
 508        if (IS_ERR(ipage))
 509                return PTR_ERR(ipage);
 510
 511        dentry_blk = inline_data_addr(ipage);
 512        bit_pos = room_for_filename(&dentry_blk->dentry_bitmap,
 513                                                slots, NR_INLINE_DENTRY);
 514        if (bit_pos >= NR_INLINE_DENTRY) {
 515                err = f2fs_convert_inline_dir(dir, ipage, dentry_blk);
 516                if (err)
 517                        return err;
 518                err = -EAGAIN;
 519                goto out;
 520        }
 521
 522        if (inode) {
 523                down_write(&F2FS_I(inode)->i_sem);
 524                page = init_inode_metadata(inode, dir, new_name,
 525                                                orig_name, ipage);
 526                if (IS_ERR(page)) {
 527                        err = PTR_ERR(page);
 528                        goto fail;
 529                }
 530                if (f2fs_encrypted_inode(dir))
 531                        file_set_enc_name(inode);
 532        }
 533
 534        f2fs_wait_on_page_writeback(ipage, NODE, true);
 535
 536        name_hash = f2fs_dentry_hash(new_name);
 537        make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2);
 538        f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
 539
 540        set_page_dirty(ipage);
 541
 542        /* we don't need to mark_inode_dirty now */
 543        if (inode) {
 544                f2fs_i_pino_write(inode, dir->i_ino);
 545                f2fs_put_page(page, 1);
 546        }
 547
 548        update_parent_metadata(dir, inode, 0);
 549fail:
 550        if (inode)
 551                up_write(&F2FS_I(inode)->i_sem);
 552out:
 553        f2fs_put_page(ipage, 1);
 554        return err;
 555}
 556
 557void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
 558                                        struct inode *dir, struct inode *inode)
 559{
 560        struct f2fs_inline_dentry *inline_dentry;
 561        int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
 562        unsigned int bit_pos;
 563        int i;
 564
 565        lock_page(page);
 566        f2fs_wait_on_page_writeback(page, NODE, true);
 567
 568        inline_dentry = inline_data_addr(page);
 569        bit_pos = dentry - inline_dentry->dentry;
 570        for (i = 0; i < slots; i++)
 571                __clear_bit_le(bit_pos + i,
 572                                &inline_dentry->dentry_bitmap);
 573
 574        set_page_dirty(page);
 575        f2fs_put_page(page, 1);
 576
 577        dir->i_ctime = dir->i_mtime = current_time(dir);
 578        f2fs_mark_inode_dirty_sync(dir, false);
 579
 580        if (inode)
 581                f2fs_drop_nlink(dir, inode);
 582}
 583
 584bool f2fs_empty_inline_dir(struct inode *dir)
 585{
 586        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
 587        struct page *ipage;
 588        unsigned int bit_pos = 2;
 589        struct f2fs_inline_dentry *dentry_blk;
 590
 591        ipage = get_node_page(sbi, dir->i_ino);
 592        if (IS_ERR(ipage))
 593                return false;
 594
 595        dentry_blk = inline_data_addr(ipage);
 596        bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
 597                                        NR_INLINE_DENTRY,
 598                                        bit_pos);
 599
 600        f2fs_put_page(ipage, 1);
 601
 602        if (bit_pos < NR_INLINE_DENTRY)
 603                return false;
 604
 605        return true;
 606}
 607
 608int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
 609                                struct fscrypt_str *fstr)
 610{
 611        struct inode *inode = file_inode(file);
 612        struct f2fs_inline_dentry *inline_dentry = NULL;
 613        struct page *ipage = NULL;
 614        struct f2fs_dentry_ptr d;
 615        int err;
 616
 617        if (ctx->pos == NR_INLINE_DENTRY)
 618                return 0;
 619
 620        ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
 621        if (IS_ERR(ipage))
 622                return PTR_ERR(ipage);
 623
 624        inline_dentry = inline_data_addr(ipage);
 625
 626        make_dentry_ptr(inode, &d, (void *)inline_dentry, 2);
 627
 628        err = f2fs_fill_dentries(ctx, &d, 0, fstr);
 629        if (!err)
 630                ctx->pos = NR_INLINE_DENTRY;
 631
 632        f2fs_put_page(ipage, 1);
 633        return err < 0 ? err : 0;
 634}
 635
 636int f2fs_inline_data_fiemap(struct inode *inode,
 637                struct fiemap_extent_info *fieinfo, __u64 start, __u64 len)
 638{
 639        __u64 byteaddr, ilen;
 640        __u32 flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED |
 641                FIEMAP_EXTENT_LAST;
 642        struct node_info ni;
 643        struct page *ipage;
 644        int err = 0;
 645
 646        ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
 647        if (IS_ERR(ipage))
 648                return PTR_ERR(ipage);
 649
 650        if (!f2fs_has_inline_data(inode)) {
 651                err = -EAGAIN;
 652                goto out;
 653        }
 654
 655        ilen = min_t(size_t, MAX_INLINE_DATA, i_size_read(inode));
 656        if (start >= ilen)
 657                goto out;
 658        if (start + len < ilen)
 659                ilen = start + len;
 660        ilen -= start;
 661
 662        get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni);
 663        byteaddr = (__u64)ni.blk_addr << inode->i_sb->s_blocksize_bits;
 664        byteaddr += (char *)inline_data_addr(ipage) - (char *)F2FS_INODE(ipage);
 665        err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
 666out:
 667        f2fs_put_page(ipage, 1);
 668        return err;
 669}
 670