Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

udf: Don't return bh from udf_expand_dir_adinicb()

Nobody uses the bh returned from udf_expand_dir_adinicb(). Don't return
it.

Signed-off-by: Jan Kara <jack@suse.cz>

Jan Kara f386c802 1eeceaec

+13 -20
+13 -20
fs/udf/namei.c
··· 136 136 return d_splice_alias(inode, dentry); 137 137 } 138 138 139 - static struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, 140 - udf_pblk_t *block, int *err) 139 + static int udf_expand_dir_adinicb(struct inode *inode, udf_pblk_t *block) 141 140 { 142 141 udf_pblk_t newblock; 143 142 struct buffer_head *dbh = NULL; ··· 156 157 if (!inode->i_size) { 157 158 iinfo->i_alloc_type = alloctype; 158 159 mark_inode_dirty(inode); 159 - return NULL; 160 + return 0; 160 161 } 161 162 162 163 /* alloc block, and copy data to it */ 163 164 *block = udf_new_block(inode->i_sb, inode, 164 165 iinfo->i_location.partitionReferenceNum, 165 - iinfo->i_location.logicalBlockNum, err); 166 + iinfo->i_location.logicalBlockNum, &ret); 166 167 if (!(*block)) 167 - return NULL; 168 + return ret; 168 169 newblock = udf_get_pblock(inode->i_sb, *block, 169 170 iinfo->i_location.partitionReferenceNum, 170 171 0); 171 - if (!newblock) 172 - return NULL; 172 + if (newblock == 0xffffffff) 173 + return -EFSCORRUPTED; 173 174 dbh = sb_getblk(inode->i_sb, newblock); 174 175 if (!dbh) 175 - return NULL; 176 + return -ENOMEM; 176 177 lock_buffer(dbh); 177 178 memcpy(dbh->b_data, iinfo->i_data, inode->i_size); 178 179 memset(dbh->b_data + inode->i_size, 0, ··· 194 195 ret = udf_add_aext(inode, &epos, &eloc, inode->i_size, 0); 195 196 brelse(epos.bh); 196 197 if (ret < 0) { 197 - *err = ret; 198 + brelse(dbh); 198 199 udf_free_blocks(inode->i_sb, inode, &eloc, 0, 1); 199 - return NULL; 200 + return ret; 200 201 } 201 202 mark_inode_dirty(inode); 202 203 ··· 212 213 impuse = NULL; 213 214 udf_fiiter_write_fi(&iter, impuse); 214 215 } 216 + brelse(dbh); 215 217 /* 216 218 * We don't expect the iteration to fail as the directory has been 217 219 * already verified to be correct ··· 220 220 WARN_ON_ONCE(ret); 221 221 udf_fiiter_release(&iter); 222 222 223 - return dbh; 223 + return 0; 224 224 } 225 225 226 226 static int udf_fiiter_add_entry(struct inode *dir, struct dentry *dentry, ··· 266 266 } 267 267 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && 268 268 blksize - udf_ext0_offset(dir) - iter->pos < nfidlen) { 269 - struct buffer_head *retbh; 270 - 271 269 udf_fiiter_release(iter); 272 - /* 273 - * FIXME: udf_expand_dir_adinicb does not need to return bh 274 - * once other users are gone 275 - */ 276 - retbh = udf_expand_dir_adinicb(dir, &block, &ret); 277 - if (!retbh) 270 + ret = udf_expand_dir_adinicb(dir, &block); 271 + if (ret) 278 272 return ret; 279 - brelse(retbh); 280 273 ret = udf_fiiter_init(iter, dir, dir->i_size); 281 274 if (ret < 0) 282 275 return ret;