add patch move-error-report-out-of-atomic-context
[ext4-patch-queue.git] / convert-ext4_getblk-to-use-the-ERR_PTR-convention
blob58a2af03ea03b93a5a70cc58efe3794647352ae6
1 ext4: convert ext4_getblk() to use the ERR_PTR convention
3 From: Theodore Ts'o <tytso@mit.edu>
5 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
6 ---
7  fs/ext4/ext4.h  |  3 +--
8  fs/ext4/inode.c | 51 +++++++++++++++++++++++++--------------------------
9  fs/ext4/namei.c |  9 ++++-----
10  3 files changed, 30 insertions(+), 33 deletions(-)
12 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
13 index b0c225c..8009077 100644
14 --- a/fs/ext4/ext4.h
15 +++ b/fs/ext4/ext4.h
16 @@ -2086,8 +2086,7 @@ extern int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
17  extern int ext4_trim_fs(struct super_block *, struct fstrim_range *);
19  /* inode.c */
20 -struct buffer_head *ext4_getblk(handle_t *, struct inode *,
21 -                                               ext4_lblk_t, int, int *);
22 +struct buffer_head *ext4_getblk(handle_t *, struct inode *, ext4_lblk_t, int);
23  struct buffer_head *ext4_bread(handle_t *, struct inode *,
24                                                 ext4_lblk_t, int, int *);
25  int ext4_get_block_write(struct inode *inode, sector_t iblock,
26 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
27 index 3aa26e9..0dfc1cd 100644
28 --- a/fs/ext4/inode.c
29 +++ b/fs/ext4/inode.c
30 @@ -734,11 +734,11 @@ int ext4_get_block(struct inode *inode, sector_t iblock,
31   * `handle' can be NULL if create is zero
32   */
33  struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
34 -                               ext4_lblk_t block, int create, int *errp)
35 +                               ext4_lblk_t block, int create)
36  {
37         struct ext4_map_blocks map;
38         struct buffer_head *bh;
39 -       int fatal = 0, err;
40 +       int err;
42         J_ASSERT(handle != NULL || create == 0);
44 @@ -747,21 +747,14 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
45         err = ext4_map_blocks(handle, inode, &map,
46                               create ? EXT4_GET_BLOCKS_CREATE : 0);
48 -       /* ensure we send some value back into *errp */
49 -       *errp = 0;
51 -       if (create && err == 0)
52 -               err = -ENOSPC;  /* should never happen */
53 +       if (err == 0)
54 +               return create ? ERR_PTR(-ENOSPC) : NULL;
55         if (err < 0)
56 -               *errp = err;
57 -       if (err <= 0)
58 -               return NULL;
59 +               return ERR_PTR(err);
61         bh = sb_getblk(inode->i_sb, map.m_pblk);
62 -       if (unlikely(!bh)) {
63 -               *errp = -ENOMEM;
64 -               return NULL;
65 -       }
66 +       if (unlikely(!bh))
67 +               return ERR_PTR(-ENOMEM);
68         if (map.m_flags & EXT4_MAP_NEW) {
69                 J_ASSERT(create != 0);
70                 J_ASSERT(handle != NULL);
71 @@ -775,25 +768,26 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
72                  */
73                 lock_buffer(bh);
74                 BUFFER_TRACE(bh, "call get_create_access");
75 -               fatal = ext4_journal_get_create_access(handle, bh);
76 -               if (!fatal && !buffer_uptodate(bh)) {
77 +               err = ext4_journal_get_create_access(handle, bh);
78 +               if (unlikely(err)) {
79 +                       unlock_buffer(bh);
80 +                       goto errout;
81 +               }
82 +               if (!buffer_uptodate(bh)) {
83                         memset(bh->b_data, 0, inode->i_sb->s_blocksize);
84                         set_buffer_uptodate(bh);
85                 }
86                 unlock_buffer(bh);
87                 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
88                 err = ext4_handle_dirty_metadata(handle, inode, bh);
89 -               if (!fatal)
90 -                       fatal = err;
91 -       } else {
92 +               if (unlikely(err))
93 +                       goto errout;
94 +       } else
95                 BUFFER_TRACE(bh, "not a new buffer");
96 -       }
97 -       if (fatal) {
98 -               *errp = fatal;
99 -               brelse(bh);
100 -               bh = NULL;
101 -       }
102         return bh;
103 +errout:
104 +       brelse(bh);
105 +       return ERR_PTR(err);
108  struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
109 @@ -801,7 +795,12 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
111         struct buffer_head *bh;
113 -       bh = ext4_getblk(handle, inode, block, create, err);
114 +       *err = 0;
115 +       bh = ext4_getblk(handle, inode, block, create);
116 +       if (IS_ERR(bh)) {
117 +               *err = PTR_ERR(bh);
118 +               return NULL;
119 +       }
120         if (!bh)
121                 return bh;
122         if (buffer_uptodate(bh))
123 diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
124 index 1421ec1..26f114b 100644
125 --- a/fs/ext4/namei.c
126 +++ b/fs/ext4/namei.c
127 @@ -1226,8 +1226,7 @@ static struct buffer_head * ext4_find_entry (struct inode *dir,
128                                    buffer */
129         int num = 0;
130         ext4_lblk_t  nblocks;
131 -       int i, err = 0;
132 -       int namelen;
133 +       int i, namelen;
135         *res_dir = NULL;
136         sb = dir->i_sb;
137 @@ -1293,10 +1292,10 @@ restart:
138                                         break;
139                                 }
140                                 num++;
141 -                               bh = ext4_getblk(NULL, dir, b++, 0, &err);
142 -                               if (unlikely(err)) {
143 +                               bh = ext4_getblk(NULL, dir, b++, 0);
144 +                               if (unlikely(IS_ERR(bh))) {
145                                         if (ra_max == 0)
146 -                                               return ERR_PTR(err);
147 +                                               return bh;
148                                         break;
149                                 }
150                                 bh_use[ra_max] = bh;
151 -- 
152 2.1.0