Merge branch 'i2c/for-3.20' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[firefly-linux-kernel-4.4.55.git] / fs / f2fs / node.c
index ea22c3210c8a1879b2b31ea2094fbe398fc03e20..97bd9d3db88285e36a24c9d05b73c3a5c5e269f1 100644 (file)
@@ -474,7 +474,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
        struct page *npage[4];
-       struct page *parent;
+       struct page *parent = NULL;
        int offset[4];
        unsigned int noffset[4];
        nid_t nids[4];
@@ -491,6 +491,14 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
                if (IS_ERR(npage[0]))
                        return PTR_ERR(npage[0]);
        }
+
+       /* if inline_data is set, should not report any block indices */
+       if (f2fs_has_inline_data(dn->inode) && index) {
+               err = -EINVAL;
+               f2fs_put_page(npage[0], 1);
+               goto release_out;
+       }
+
        parent = npage[0];
        if (level != 0)
                nids[1] = get_nid(parent, offset[0], true);
@@ -1036,11 +1044,11 @@ repeat:
        err = read_node_page(page, READ_SYNC);
        if (err < 0)
                return ERR_PTR(err);
-       else if (err == LOCKED_PAGE)
-               goto got_it;
+       else if (err != LOCKED_PAGE)
+               lock_page(page);
 
-       lock_page(page);
        if (unlikely(!PageUptodate(page) || nid != nid_of_node(page))) {
+               ClearPageUptodate(page);
                f2fs_put_page(page, 1);
                return ERR_PTR(-EIO);
        }
@@ -1048,7 +1056,6 @@ repeat:
                f2fs_put_page(page, 1);
                goto repeat;
        }
-got_it:
        return page;
 }