Loading fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1016,6 +1016,7 @@ int is_checkpointed_node(struct f2fs_sb_info *, nid_t); void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); int get_dnode_of_data(struct dnode_of_data *, pgoff_t, int); int truncate_inode_blocks(struct inode *, pgoff_t); int truncate_xattr_node(struct inode *, struct page *); int remove_inode_page(struct inode *); struct page *new_inode_page(struct inode *, const struct qstr *); struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); Loading fs/f2fs/node.c +28 −11 Original line number Diff line number Diff line Loading @@ -772,6 +772,29 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from) return err > 0 ? 0 : err; } int truncate_xattr_node(struct inode *inode, struct page *page) { struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); nid_t nid = F2FS_I(inode)->i_xattr_nid; struct dnode_of_data dn; struct page *npage; if (!nid) return 0; npage = get_node_page(sbi, nid); if (IS_ERR(npage)) return PTR_ERR(npage); F2FS_I(inode)->i_xattr_nid = 0; set_new_dnode(&dn, inode, page, npage, nid); if (page) dn.inode_page_locked = 1; truncate_node(&dn); return 0; } /* * Caller should grab and release a mutex by calling mutex_lock_op() and * mutex_unlock_op(). Loading @@ -782,22 +805,16 @@ int remove_inode_page(struct inode *inode) struct page *page; nid_t ino = inode->i_ino; struct dnode_of_data dn; int err; page = get_node_page(sbi, ino); if (IS_ERR(page)) return PTR_ERR(page); if (F2FS_I(inode)->i_xattr_nid) { nid_t nid = F2FS_I(inode)->i_xattr_nid; struct page *npage = get_node_page(sbi, nid); if (IS_ERR(npage)) return PTR_ERR(npage); F2FS_I(inode)->i_xattr_nid = 0; set_new_dnode(&dn, inode, page, npage, nid); dn.inode_page_locked = 1; truncate_node(&dn); err = truncate_xattr_node(inode, page); if (err) { f2fs_put_page(page, 1); return err; } /* 0 is possible, after f2fs_new_inode() is failed */ Loading Loading
fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1016,6 +1016,7 @@ int is_checkpointed_node(struct f2fs_sb_info *, nid_t); void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); int get_dnode_of_data(struct dnode_of_data *, pgoff_t, int); int truncate_inode_blocks(struct inode *, pgoff_t); int truncate_xattr_node(struct inode *, struct page *); int remove_inode_page(struct inode *); struct page *new_inode_page(struct inode *, const struct qstr *); struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); Loading
fs/f2fs/node.c +28 −11 Original line number Diff line number Diff line Loading @@ -772,6 +772,29 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from) return err > 0 ? 0 : err; } int truncate_xattr_node(struct inode *inode, struct page *page) { struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); nid_t nid = F2FS_I(inode)->i_xattr_nid; struct dnode_of_data dn; struct page *npage; if (!nid) return 0; npage = get_node_page(sbi, nid); if (IS_ERR(npage)) return PTR_ERR(npage); F2FS_I(inode)->i_xattr_nid = 0; set_new_dnode(&dn, inode, page, npage, nid); if (page) dn.inode_page_locked = 1; truncate_node(&dn); return 0; } /* * Caller should grab and release a mutex by calling mutex_lock_op() and * mutex_unlock_op(). Loading @@ -782,22 +805,16 @@ int remove_inode_page(struct inode *inode) struct page *page; nid_t ino = inode->i_ino; struct dnode_of_data dn; int err; page = get_node_page(sbi, ino); if (IS_ERR(page)) return PTR_ERR(page); if (F2FS_I(inode)->i_xattr_nid) { nid_t nid = F2FS_I(inode)->i_xattr_nid; struct page *npage = get_node_page(sbi, nid); if (IS_ERR(npage)) return PTR_ERR(npage); F2FS_I(inode)->i_xattr_nid = 0; set_new_dnode(&dn, inode, page, npage, nid); dn.inode_page_locked = 1; truncate_node(&dn); err = truncate_xattr_node(inode, page); if (err) { f2fs_put_page(page, 1); return err; } /* 0 is possible, after f2fs_new_inode() is failed */ Loading