aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChao Yu <yuchao0@huawei.com>2016-07-18 20:27:47 -0400
committerJaegeuk Kim <jaegeuk@kernel.org>2016-07-20 17:53:19 -0400
commit91246c21b85985c48b1e1f5603e0d81161eb76a4 (patch)
tree9303cfdb30c11c74f30c4888457dc426ceeca3bf /fs
parent363cad7f7e586b385c20e9925b4923683d46deb6 (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.c10
-rw-r--r--fs/f2fs/f2fs.h2
-rw-r--r--fs/f2fs/namei.c46
-rw-r--r--fs/f2fs/recovery.c7
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
275ino_t f2fs_inode_by_name(struct inode *dir, struct qstr *qstr) 275ino_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 *);
1898struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *, 1898struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *,
1899 struct page **); 1899 struct page **);
1900struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **); 1900struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **);
1901ino_t f2fs_inode_by_name(struct inode *, struct qstr *); 1901ino_t f2fs_inode_by_name(struct inode *, struct qstr *, struct page **);
1902void f2fs_set_link(struct inode *, struct f2fs_dir_entry *, 1902void f2fs_set_link(struct inode *, struct f2fs_dir_entry *,
1903 struct page *, struct inode *); 1903 struct page *, struct inode *);
1904int update_dent_inode(struct inode *, struct inode *, const struct qstr *); 1904int 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:
202struct dentry *f2fs_get_parent(struct dentry *child) 202struct 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
161out_unmap_put: 164out_unmap_put: