diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-08-14 07:40:06 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-08-26 07:15:06 -0400 |
commit | 4f16fb0f9be3f5f9d1254ff6d7bf54b23fb65f4a (patch) | |
tree | 434b1c8f4f4c8e2cc3d7dc97bbd38a213d23d3b1 /fs/f2fs | |
parent | dd9cfe236f95bbda9ceb5a4ca419b9fb574c95f9 (diff) |
f2fs: add the truncate_xattr_node function
The truncate_xattr_node function will be used by inline xattr.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/f2fs.h | 1 | ||||
-rw-r--r-- | fs/f2fs/node.c | 39 |
2 files changed, 29 insertions, 11 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 0343759ceb4c..0fe9302e3e17 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1016,6 +1016,7 @@ int is_checkpointed_node(struct f2fs_sb_info *, nid_t); | |||
1016 | void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); | 1016 | void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); |
1017 | int get_dnode_of_data(struct dnode_of_data *, pgoff_t, int); | 1017 | int get_dnode_of_data(struct dnode_of_data *, pgoff_t, int); |
1018 | int truncate_inode_blocks(struct inode *, pgoff_t); | 1018 | int truncate_inode_blocks(struct inode *, pgoff_t); |
1019 | int truncate_xattr_node(struct inode *, struct page *); | ||
1019 | int remove_inode_page(struct inode *); | 1020 | int remove_inode_page(struct inode *); |
1020 | struct page *new_inode_page(struct inode *, const struct qstr *); | 1021 | struct page *new_inode_page(struct inode *, const struct qstr *); |
1021 | struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); | 1022 | struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index f0e733b21b2a..2a464a76602d 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -772,6 +772,29 @@ fail: | |||
772 | return err > 0 ? 0 : err; | 772 | return err > 0 ? 0 : err; |
773 | } | 773 | } |
774 | 774 | ||
775 | int truncate_xattr_node(struct inode *inode, struct page *page) | ||
776 | { | ||
777 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | ||
778 | nid_t nid = F2FS_I(inode)->i_xattr_nid; | ||
779 | struct dnode_of_data dn; | ||
780 | struct page *npage; | ||
781 | |||
782 | if (!nid) | ||
783 | return 0; | ||
784 | |||
785 | npage = get_node_page(sbi, nid); | ||
786 | if (IS_ERR(npage)) | ||
787 | return PTR_ERR(npage); | ||
788 | |||
789 | F2FS_I(inode)->i_xattr_nid = 0; | ||
790 | set_new_dnode(&dn, inode, page, npage, nid); | ||
791 | |||
792 | if (page) | ||
793 | dn.inode_page_locked = 1; | ||
794 | truncate_node(&dn); | ||
795 | return 0; | ||
796 | } | ||
797 | |||
775 | /* | 798 | /* |
776 | * Caller should grab and release a mutex by calling mutex_lock_op() and | 799 | * Caller should grab and release a mutex by calling mutex_lock_op() and |
777 | * mutex_unlock_op(). | 800 | * mutex_unlock_op(). |
@@ -782,22 +805,16 @@ int remove_inode_page(struct inode *inode) | |||
782 | struct page *page; | 805 | struct page *page; |
783 | nid_t ino = inode->i_ino; | 806 | nid_t ino = inode->i_ino; |
784 | struct dnode_of_data dn; | 807 | struct dnode_of_data dn; |
808 | int err; | ||
785 | 809 | ||
786 | page = get_node_page(sbi, ino); | 810 | page = get_node_page(sbi, ino); |
787 | if (IS_ERR(page)) | 811 | if (IS_ERR(page)) |
788 | return PTR_ERR(page); | 812 | return PTR_ERR(page); |
789 | 813 | ||
790 | if (F2FS_I(inode)->i_xattr_nid) { | 814 | err = truncate_xattr_node(inode, page); |
791 | nid_t nid = F2FS_I(inode)->i_xattr_nid; | 815 | if (err) { |
792 | struct page *npage = get_node_page(sbi, nid); | 816 | f2fs_put_page(page, 1); |
793 | 817 | return err; | |
794 | if (IS_ERR(npage)) | ||
795 | return PTR_ERR(npage); | ||
796 | |||
797 | F2FS_I(inode)->i_xattr_nid = 0; | ||
798 | set_new_dnode(&dn, inode, page, npage, nid); | ||
799 | dn.inode_page_locked = 1; | ||
800 | truncate_node(&dn); | ||
801 | } | 818 | } |
802 | 819 | ||
803 | /* 0 is possible, after f2fs_new_inode() is failed */ | 820 | /* 0 is possible, after f2fs_new_inode() is failed */ |