diff options
author | Chao Yu <yuchao0@huawei.com> | 2016-07-18 20:27:47 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-07-20 17:53:19 -0400 |
commit | 91246c21b85985c48b1e1f5603e0d81161eb76a4 (patch) | |
tree | 9303cfdb30c11c74f30c4888457dc426ceeca3bf /fs | |
parent | 363cad7f7e586b385c20e9925b4923683d46deb6 (diff) |
f2fs: fix to report error number of f2fs_find_entry
This patch fixes to report the right error number of f2fs_find_entry to
its caller.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/f2fs/dir.c | 10 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 2 | ||||
-rw-r--r-- | fs/f2fs/namei.c | 46 | ||||
-rw-r--r-- | fs/f2fs/recovery.c | 7 |
4 files changed, 46 insertions, 19 deletions
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index db4022f9c5b1..a485f68a76b1 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c | |||
@@ -272,17 +272,17 @@ struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p) | |||
272 | return f2fs_find_entry(dir, &dotdot, p); | 272 | return f2fs_find_entry(dir, &dotdot, p); |
273 | } | 273 | } |
274 | 274 | ||
275 | ino_t f2fs_inode_by_name(struct inode *dir, struct qstr *qstr) | 275 | ino_t f2fs_inode_by_name(struct inode *dir, struct qstr *qstr, |
276 | struct page **page) | ||
276 | { | 277 | { |
277 | ino_t res = 0; | 278 | ino_t res = 0; |
278 | struct f2fs_dir_entry *de; | 279 | struct f2fs_dir_entry *de; |
279 | struct page *page; | ||
280 | 280 | ||
281 | de = f2fs_find_entry(dir, qstr, &page); | 281 | de = f2fs_find_entry(dir, qstr, page); |
282 | if (de) { | 282 | if (de) { |
283 | res = le32_to_cpu(de->ino); | 283 | res = le32_to_cpu(de->ino); |
284 | f2fs_dentry_kunmap(dir, page); | 284 | f2fs_dentry_kunmap(dir, *page); |
285 | f2fs_put_page(page, 0); | 285 | f2fs_put_page(*page, 0); |
286 | } | 286 | } |
287 | 287 | ||
288 | return res; | 288 | return res; |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 521cb92285fa..c7378540ba37 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1898,7 +1898,7 @@ void f2fs_drop_nlink(struct inode *, struct inode *); | |||
1898 | struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *, | 1898 | struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *, |
1899 | struct page **); | 1899 | struct page **); |
1900 | struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **); | 1900 | struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **); |
1901 | ino_t f2fs_inode_by_name(struct inode *, struct qstr *); | 1901 | ino_t f2fs_inode_by_name(struct inode *, struct qstr *, struct page **); |
1902 | void f2fs_set_link(struct inode *, struct f2fs_dir_entry *, | 1902 | void f2fs_set_link(struct inode *, struct f2fs_dir_entry *, |
1903 | struct page *, struct inode *); | 1903 | struct page *, struct inode *); |
1904 | int update_dent_inode(struct inode *, struct inode *, const struct qstr *); | 1904 | int update_dent_inode(struct inode *, struct inode *, const struct qstr *); |
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index c9ba6d7a6a06..73fa356f8fbb 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c | |||
@@ -202,9 +202,13 @@ out: | |||
202 | struct dentry *f2fs_get_parent(struct dentry *child) | 202 | struct dentry *f2fs_get_parent(struct dentry *child) |
203 | { | 203 | { |
204 | struct qstr dotdot = QSTR_INIT("..", 2); | 204 | struct qstr dotdot = QSTR_INIT("..", 2); |
205 | unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot); | 205 | struct page *page; |
206 | if (!ino) | 206 | unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot, &page); |
207 | if (!ino) { | ||
208 | if (IS_ERR(page)) | ||
209 | return ERR_CAST(page); | ||
207 | return ERR_PTR(-ENOENT); | 210 | return ERR_PTR(-ENOENT); |
211 | } | ||
208 | return d_obtain_alias(f2fs_iget(child->d_sb, ino)); | 212 | return d_obtain_alias(f2fs_iget(child->d_sb, ino)); |
209 | } | 213 | } |
210 | 214 | ||
@@ -338,8 +342,11 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) | |||
338 | trace_f2fs_unlink_enter(dir, dentry); | 342 | trace_f2fs_unlink_enter(dir, dentry); |
339 | 343 | ||
340 | de = f2fs_find_entry(dir, &dentry->d_name, &page); | 344 | de = f2fs_find_entry(dir, &dentry->d_name, &page); |
341 | if (!de) | 345 | if (!de) { |
346 | if (IS_ERR(page)) | ||
347 | err = PTR_ERR(page); | ||
342 | goto fail; | 348 | goto fail; |
349 | } | ||
343 | 350 | ||
344 | f2fs_balance_fs(sbi, true); | 351 | f2fs_balance_fs(sbi, true); |
345 | 352 | ||
@@ -658,13 +665,17 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
658 | } | 665 | } |
659 | 666 | ||
660 | old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); | 667 | old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); |
661 | if (!old_entry) | 668 | if (!old_entry) { |
669 | if (IS_ERR(old_page)) | ||
670 | err = PTR_ERR(old_page); | ||
662 | goto out; | 671 | goto out; |
672 | } | ||
663 | 673 | ||
664 | if (S_ISDIR(old_inode->i_mode)) { | 674 | if (S_ISDIR(old_inode->i_mode)) { |
665 | old_dir_entry = f2fs_parent_dir(old_inode, &old_dir_page); | 675 | old_dir_entry = f2fs_parent_dir(old_inode, &old_dir_page); |
666 | if (!old_dir_entry) { | 676 | if (!old_dir_entry) { |
667 | err = PTR_ERR(old_dir_page); | 677 | if (IS_ERR(old_dir_page)) |
678 | err = PTR_ERR(old_dir_page); | ||
668 | goto out_old; | 679 | goto out_old; |
669 | } | 680 | } |
670 | } | 681 | } |
@@ -684,8 +695,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
684 | err = -ENOENT; | 695 | err = -ENOENT; |
685 | new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, | 696 | new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, |
686 | &new_page); | 697 | &new_page); |
687 | if (!new_entry) | 698 | if (!new_entry) { |
699 | if (IS_ERR(new_page)) | ||
700 | err = PTR_ERR(new_page); | ||
688 | goto out_whiteout; | 701 | goto out_whiteout; |
702 | } | ||
689 | 703 | ||
690 | f2fs_balance_fs(sbi, true); | 704 | f2fs_balance_fs(sbi, true); |
691 | 705 | ||
@@ -743,7 +757,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
743 | old_entry = f2fs_find_entry(old_dir, | 757 | old_entry = f2fs_find_entry(old_dir, |
744 | &old_dentry->d_name, &old_page); | 758 | &old_dentry->d_name, &old_page); |
745 | if (!old_entry) { | 759 | if (!old_entry) { |
746 | err = -EIO; | 760 | err = -ENOENT; |
761 | if (IS_ERR(old_page)) | ||
762 | err = PTR_ERR(old_page); | ||
747 | f2fs_unlock_op(sbi); | 763 | f2fs_unlock_op(sbi); |
748 | goto out_whiteout; | 764 | goto out_whiteout; |
749 | } | 765 | } |
@@ -829,12 +845,18 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
829 | return -EPERM; | 845 | return -EPERM; |
830 | 846 | ||
831 | old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); | 847 | old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); |
832 | if (!old_entry) | 848 | if (!old_entry) { |
849 | if (IS_ERR(old_page)) | ||
850 | err = PTR_ERR(old_page); | ||
833 | goto out; | 851 | goto out; |
852 | } | ||
834 | 853 | ||
835 | new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 854 | new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
836 | if (!new_entry) | 855 | if (!new_entry) { |
856 | if (IS_ERR(new_page)) | ||
857 | err = PTR_ERR(new_page); | ||
837 | goto out_old; | 858 | goto out_old; |
859 | } | ||
838 | 860 | ||
839 | /* prepare for updating ".." directory entry info later */ | 861 | /* prepare for updating ".." directory entry info later */ |
840 | if (old_dir != new_dir) { | 862 | if (old_dir != new_dir) { |
@@ -842,7 +864,8 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
842 | old_dir_entry = f2fs_parent_dir(old_inode, | 864 | old_dir_entry = f2fs_parent_dir(old_inode, |
843 | &old_dir_page); | 865 | &old_dir_page); |
844 | if (!old_dir_entry) { | 866 | if (!old_dir_entry) { |
845 | err = PTR_ERR(old_dir_page); | 867 | if (IS_ERR(old_dir_page)) |
868 | err = PTR_ERR(old_dir_page); | ||
846 | goto out_new; | 869 | goto out_new; |
847 | } | 870 | } |
848 | } | 871 | } |
@@ -851,7 +874,8 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
851 | new_dir_entry = f2fs_parent_dir(new_inode, | 874 | new_dir_entry = f2fs_parent_dir(new_inode, |
852 | &new_dir_page); | 875 | &new_dir_page); |
853 | if (!new_dir_entry) { | 876 | if (!new_dir_entry) { |
854 | err = PTR_ERR(new_dir_page); | 877 | if (IS_ERR(new_dir_page)) |
878 | err = PTR_ERR(new_dir_page); | ||
855 | goto out_old_dir; | 879 | goto out_old_dir; |
856 | } | 880 | } |
857 | } | 881 | } |
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index a39d84ab66b2..5d4461f2c266 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c | |||
@@ -153,9 +153,12 @@ retry: | |||
153 | f2fs_delete_entry(de, page, dir, einode); | 153 | f2fs_delete_entry(de, page, dir, einode); |
154 | iput(einode); | 154 | iput(einode); |
155 | goto retry; | 155 | goto retry; |
156 | } else if (IS_ERR(page)) { | ||
157 | err = PTR_ERR(page); | ||
158 | } else { | ||
159 | err = __f2fs_add_link(dir, &name, inode, | ||
160 | inode->i_ino, inode->i_mode); | ||
156 | } | 161 | } |
157 | err = __f2fs_add_link(dir, &name, inode, inode->i_ino, inode->i_mode); | ||
158 | |||
159 | goto out; | 162 | goto out; |
160 | 163 | ||
161 | out_unmap_put: | 164 | out_unmap_put: |