diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-10 17:04:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-10 17:04:17 -0400 |
| commit | 7ec62d421bdf29cb31101ae2689f7f3a9906289a (patch) | |
| tree | e88e160e8339dc229b6c66cc6c34b8fcb8fb3dfb | |
| parent | e874a5fe3efabbdd87db635d34f3d086af288e55 (diff) | |
| parent | 0b93a92be4cb48f22b78c95dea84089a1e72f860 (diff) | |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull UDF fixes from Jan Kara:
"Fixes for UDF handling of NFS handles and one fix for proper handling
of corrupted media"
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
udf: saner calling conventions for udf_new_inode()
udf: fix the udf_iget() vs. udf_new_inode() races
udf: merge the pieces inserting a new non-directory object into directory
udf: Set i_generation field
udf: Properly detect stale inodes
udf: Make udf_read_inode() and udf_iget() return error
udf: Avoid infinite loop when processing indirect ICBs
udf: Fold udf_fill_inode() into __udf_read_inode()
udf: Avoid dir link count to go negative
| -rw-r--r-- | fs/udf/ialloc.c | 28 | ||||
| -rw-r--r-- | fs/udf/inode.c | 161 | ||||
| -rw-r--r-- | fs/udf/namei.c | 157 | ||||
| -rw-r--r-- | fs/udf/super.c | 69 | ||||
| -rw-r--r-- | fs/udf/udfdecl.h | 3 |
5 files changed, 187 insertions, 231 deletions
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 6eaf5edf1ea1..e77db621ec89 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
| @@ -45,7 +45,7 @@ void udf_free_inode(struct inode *inode) | |||
| 45 | udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); | 45 | udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) | 48 | struct inode *udf_new_inode(struct inode *dir, umode_t mode) |
| 49 | { | 49 | { |
| 50 | struct super_block *sb = dir->i_sb; | 50 | struct super_block *sb = dir->i_sb; |
| 51 | struct udf_sb_info *sbi = UDF_SB(sb); | 51 | struct udf_sb_info *sbi = UDF_SB(sb); |
| @@ -55,14 +55,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) | |||
| 55 | struct udf_inode_info *iinfo; | 55 | struct udf_inode_info *iinfo; |
| 56 | struct udf_inode_info *dinfo = UDF_I(dir); | 56 | struct udf_inode_info *dinfo = UDF_I(dir); |
| 57 | struct logicalVolIntegrityDescImpUse *lvidiu; | 57 | struct logicalVolIntegrityDescImpUse *lvidiu; |
| 58 | int err; | ||
| 58 | 59 | ||
| 59 | inode = new_inode(sb); | 60 | inode = new_inode(sb); |
| 60 | 61 | ||
| 61 | if (!inode) { | 62 | if (!inode) |
| 62 | *err = -ENOMEM; | 63 | return ERR_PTR(-ENOMEM); |
| 63 | return NULL; | ||
| 64 | } | ||
| 65 | *err = -ENOSPC; | ||
| 66 | 64 | ||
| 67 | iinfo = UDF_I(inode); | 65 | iinfo = UDF_I(inode); |
| 68 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { | 66 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { |
| @@ -80,21 +78,22 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) | |||
| 80 | } | 78 | } |
| 81 | if (!iinfo->i_ext.i_data) { | 79 | if (!iinfo->i_ext.i_data) { |
| 82 | iput(inode); | 80 | iput(inode); |
| 83 | *err = -ENOMEM; | 81 | return ERR_PTR(-ENOMEM); |
| 84 | return NULL; | ||
| 85 | } | 82 | } |
| 86 | 83 | ||
| 84 | err = -ENOSPC; | ||
| 87 | block = udf_new_block(dir->i_sb, NULL, | 85 | block = udf_new_block(dir->i_sb, NULL, |
| 88 | dinfo->i_location.partitionReferenceNum, | 86 | dinfo->i_location.partitionReferenceNum, |
| 89 | start, err); | 87 | start, &err); |
| 90 | if (*err) { | 88 | if (err) { |
| 91 | iput(inode); | 89 | iput(inode); |
| 92 | return NULL; | 90 | return ERR_PTR(err); |
| 93 | } | 91 | } |
| 94 | 92 | ||
| 95 | lvidiu = udf_sb_lvidiu(sb); | 93 | lvidiu = udf_sb_lvidiu(sb); |
| 96 | if (lvidiu) { | 94 | if (lvidiu) { |
| 97 | iinfo->i_unique = lvid_get_unique_id(sb); | 95 | iinfo->i_unique = lvid_get_unique_id(sb); |
| 96 | inode->i_generation = iinfo->i_unique; | ||
| 98 | mutex_lock(&sbi->s_alloc_mutex); | 97 | mutex_lock(&sbi->s_alloc_mutex); |
| 99 | if (S_ISDIR(mode)) | 98 | if (S_ISDIR(mode)) |
| 100 | le32_add_cpu(&lvidiu->numDirs, 1); | 99 | le32_add_cpu(&lvidiu->numDirs, 1); |
| @@ -123,9 +122,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) | |||
| 123 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | 122 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; |
| 124 | inode->i_mtime = inode->i_atime = inode->i_ctime = | 123 | inode->i_mtime = inode->i_atime = inode->i_ctime = |
| 125 | iinfo->i_crtime = current_fs_time(inode->i_sb); | 124 | iinfo->i_crtime = current_fs_time(inode->i_sb); |
| 126 | insert_inode_hash(inode); | 125 | if (unlikely(insert_inode_locked(inode) < 0)) { |
| 126 | make_bad_inode(inode); | ||
| 127 | iput(inode); | ||
| 128 | return ERR_PTR(-EIO); | ||
| 129 | } | ||
| 127 | mark_inode_dirty(inode); | 130 | mark_inode_dirty(inode); |
| 128 | 131 | ||
| 129 | *err = 0; | ||
| 130 | return inode; | 132 | return inode; |
| 131 | } | 133 | } |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 236cd48184c2..08598843288f 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -51,7 +51,6 @@ MODULE_LICENSE("GPL"); | |||
| 51 | 51 | ||
| 52 | static umode_t udf_convert_permissions(struct fileEntry *); | 52 | static umode_t udf_convert_permissions(struct fileEntry *); |
| 53 | static int udf_update_inode(struct inode *, int); | 53 | static int udf_update_inode(struct inode *, int); |
| 54 | static void udf_fill_inode(struct inode *, struct buffer_head *); | ||
| 55 | static int udf_sync_inode(struct inode *inode); | 54 | static int udf_sync_inode(struct inode *inode); |
| 56 | static int udf_alloc_i_data(struct inode *inode, size_t size); | 55 | static int udf_alloc_i_data(struct inode *inode, size_t size); |
| 57 | static sector_t inode_getblk(struct inode *, sector_t, int *, int *); | 56 | static sector_t inode_getblk(struct inode *, sector_t, int *, int *); |
| @@ -1271,12 +1270,33 @@ update_time: | |||
| 1271 | return 0; | 1270 | return 0; |
| 1272 | } | 1271 | } |
| 1273 | 1272 | ||
| 1274 | static void __udf_read_inode(struct inode *inode) | 1273 | /* |
| 1274 | * Maximum length of linked list formed by ICB hierarchy. The chosen number is | ||
| 1275 | * arbitrary - just that we hopefully don't limit any real use of rewritten | ||
| 1276 | * inode on write-once media but avoid looping for too long on corrupted media. | ||
| 1277 | */ | ||
| 1278 | #define UDF_MAX_ICB_NESTING 1024 | ||
| 1279 | |||
| 1280 | static int udf_read_inode(struct inode *inode) | ||
| 1275 | { | 1281 | { |
| 1276 | struct buffer_head *bh = NULL; | 1282 | struct buffer_head *bh = NULL; |
| 1277 | struct fileEntry *fe; | 1283 | struct fileEntry *fe; |
| 1284 | struct extendedFileEntry *efe; | ||
| 1278 | uint16_t ident; | 1285 | uint16_t ident; |
| 1279 | struct udf_inode_info *iinfo = UDF_I(inode); | 1286 | struct udf_inode_info *iinfo = UDF_I(inode); |
| 1287 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | ||
| 1288 | struct kernel_lb_addr *iloc = &iinfo->i_location; | ||
| 1289 | unsigned int link_count; | ||
| 1290 | unsigned int indirections = 0; | ||
| 1291 | int ret = -EIO; | ||
| 1292 | |||
| 1293 | reread: | ||
| 1294 | if (iloc->logicalBlockNum >= | ||
| 1295 | sbi->s_partmaps[iloc->partitionReferenceNum].s_partition_len) { | ||
| 1296 | udf_debug("block=%d, partition=%d out of range\n", | ||
| 1297 | iloc->logicalBlockNum, iloc->partitionReferenceNum); | ||
| 1298 | return -EIO; | ||
| 1299 | } | ||
| 1280 | 1300 | ||
| 1281 | /* | 1301 | /* |
| 1282 | * Set defaults, but the inode is still incomplete! | 1302 | * Set defaults, but the inode is still incomplete! |
| @@ -1290,78 +1310,54 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1290 | * i_nlink = 1 | 1310 | * i_nlink = 1 |
| 1291 | * i_op = NULL; | 1311 | * i_op = NULL; |
| 1292 | */ | 1312 | */ |
| 1293 | bh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 0, &ident); | 1313 | bh = udf_read_ptagged(inode->i_sb, iloc, 0, &ident); |
| 1294 | if (!bh) { | 1314 | if (!bh) { |
| 1295 | udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino); | 1315 | udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino); |
| 1296 | make_bad_inode(inode); | 1316 | return -EIO; |
| 1297 | return; | ||
| 1298 | } | 1317 | } |
| 1299 | 1318 | ||
| 1300 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && | 1319 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && |
| 1301 | ident != TAG_IDENT_USE) { | 1320 | ident != TAG_IDENT_USE) { |
| 1302 | udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n", | 1321 | udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n", |
| 1303 | inode->i_ino, ident); | 1322 | inode->i_ino, ident); |
| 1304 | brelse(bh); | 1323 | goto out; |
| 1305 | make_bad_inode(inode); | ||
| 1306 | return; | ||
| 1307 | } | 1324 | } |
| 1308 | 1325 | ||
| 1309 | fe = (struct fileEntry *)bh->b_data; | 1326 | fe = (struct fileEntry *)bh->b_data; |
| 1327 | efe = (struct extendedFileEntry *)bh->b_data; | ||
| 1310 | 1328 | ||
| 1311 | if (fe->icbTag.strategyType == cpu_to_le16(4096)) { | 1329 | if (fe->icbTag.strategyType == cpu_to_le16(4096)) { |
| 1312 | struct buffer_head *ibh; | 1330 | struct buffer_head *ibh; |
| 1313 | 1331 | ||
| 1314 | ibh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 1, | 1332 | ibh = udf_read_ptagged(inode->i_sb, iloc, 1, &ident); |
| 1315 | &ident); | ||
| 1316 | if (ident == TAG_IDENT_IE && ibh) { | 1333 | if (ident == TAG_IDENT_IE && ibh) { |
| 1317 | struct buffer_head *nbh = NULL; | ||
| 1318 | struct kernel_lb_addr loc; | 1334 | struct kernel_lb_addr loc; |
| 1319 | struct indirectEntry *ie; | 1335 | struct indirectEntry *ie; |
| 1320 | 1336 | ||
| 1321 | ie = (struct indirectEntry *)ibh->b_data; | 1337 | ie = (struct indirectEntry *)ibh->b_data; |
| 1322 | loc = lelb_to_cpu(ie->indirectICB.extLocation); | 1338 | loc = lelb_to_cpu(ie->indirectICB.extLocation); |
| 1323 | 1339 | ||
| 1324 | if (ie->indirectICB.extLength && | 1340 | if (ie->indirectICB.extLength) { |
| 1325 | (nbh = udf_read_ptagged(inode->i_sb, &loc, 0, | 1341 | brelse(ibh); |
| 1326 | &ident))) { | 1342 | memcpy(&iinfo->i_location, &loc, |
| 1327 | if (ident == TAG_IDENT_FE || | 1343 | sizeof(struct kernel_lb_addr)); |
| 1328 | ident == TAG_IDENT_EFE) { | 1344 | if (++indirections > UDF_MAX_ICB_NESTING) { |
| 1329 | memcpy(&iinfo->i_location, | 1345 | udf_err(inode->i_sb, |
| 1330 | &loc, | 1346 | "too many ICBs in ICB hierarchy" |
| 1331 | sizeof(struct kernel_lb_addr)); | 1347 | " (max %d supported)\n", |
| 1332 | brelse(bh); | 1348 | UDF_MAX_ICB_NESTING); |
| 1333 | brelse(ibh); | 1349 | goto out; |
| 1334 | brelse(nbh); | ||
| 1335 | __udf_read_inode(inode); | ||
| 1336 | return; | ||
| 1337 | } | 1350 | } |
| 1338 | brelse(nbh); | 1351 | brelse(bh); |
| 1352 | goto reread; | ||
| 1339 | } | 1353 | } |
| 1340 | } | 1354 | } |
| 1341 | brelse(ibh); | 1355 | brelse(ibh); |
| 1342 | } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { | 1356 | } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { |
| 1343 | udf_err(inode->i_sb, "unsupported strategy type: %d\n", | 1357 | udf_err(inode->i_sb, "unsupported strategy type: %d\n", |
| 1344 | le16_to_cpu(fe->icbTag.strategyType)); | 1358 | le16_to_cpu(fe->icbTag.strategyType)); |
| 1345 | brelse(bh); | 1359 | goto out; |
| 1346 | make_bad_inode(inode); | ||
| 1347 | return; | ||
| 1348 | } | 1360 | } |
| 1349 | udf_fill_inode(inode, bh); | ||
| 1350 | |||
| 1351 | brelse(bh); | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | ||
| 1355 | { | ||
| 1356 | struct fileEntry *fe; | ||
| 1357 | struct extendedFileEntry *efe; | ||
| 1358 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | ||
| 1359 | struct udf_inode_info *iinfo = UDF_I(inode); | ||
| 1360 | unsigned int link_count; | ||
| 1361 | |||
| 1362 | fe = (struct fileEntry *)bh->b_data; | ||
| 1363 | efe = (struct extendedFileEntry *)bh->b_data; | ||
| 1364 | |||
| 1365 | if (fe->icbTag.strategyType == cpu_to_le16(4)) | 1361 | if (fe->icbTag.strategyType == cpu_to_le16(4)) |
| 1366 | iinfo->i_strat4096 = 0; | 1362 | iinfo->i_strat4096 = 0; |
| 1367 | else /* if (fe->icbTag.strategyType == cpu_to_le16(4096)) */ | 1363 | else /* if (fe->icbTag.strategyType == cpu_to_le16(4096)) */ |
| @@ -1378,11 +1374,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1378 | if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) { | 1374 | if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) { |
| 1379 | iinfo->i_efe = 1; | 1375 | iinfo->i_efe = 1; |
| 1380 | iinfo->i_use = 0; | 1376 | iinfo->i_use = 0; |
| 1381 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1377 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - |
| 1382 | sizeof(struct extendedFileEntry))) { | 1378 | sizeof(struct extendedFileEntry)); |
| 1383 | make_bad_inode(inode); | 1379 | if (ret) |
| 1384 | return; | 1380 | goto out; |
| 1385 | } | ||
| 1386 | memcpy(iinfo->i_ext.i_data, | 1381 | memcpy(iinfo->i_ext.i_data, |
| 1387 | bh->b_data + sizeof(struct extendedFileEntry), | 1382 | bh->b_data + sizeof(struct extendedFileEntry), |
| 1388 | inode->i_sb->s_blocksize - | 1383 | inode->i_sb->s_blocksize - |
| @@ -1390,11 +1385,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1390 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) { | 1385 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) { |
| 1391 | iinfo->i_efe = 0; | 1386 | iinfo->i_efe = 0; |
| 1392 | iinfo->i_use = 0; | 1387 | iinfo->i_use = 0; |
| 1393 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1388 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - |
| 1394 | sizeof(struct fileEntry))) { | 1389 | sizeof(struct fileEntry)); |
| 1395 | make_bad_inode(inode); | 1390 | if (ret) |
| 1396 | return; | 1391 | goto out; |
| 1397 | } | ||
| 1398 | memcpy(iinfo->i_ext.i_data, | 1392 | memcpy(iinfo->i_ext.i_data, |
| 1399 | bh->b_data + sizeof(struct fileEntry), | 1393 | bh->b_data + sizeof(struct fileEntry), |
| 1400 | inode->i_sb->s_blocksize - sizeof(struct fileEntry)); | 1394 | inode->i_sb->s_blocksize - sizeof(struct fileEntry)); |
| @@ -1404,18 +1398,18 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1404 | iinfo->i_lenAlloc = le32_to_cpu( | 1398 | iinfo->i_lenAlloc = le32_to_cpu( |
| 1405 | ((struct unallocSpaceEntry *)bh->b_data)-> | 1399 | ((struct unallocSpaceEntry *)bh->b_data)-> |
| 1406 | lengthAllocDescs); | 1400 | lengthAllocDescs); |
| 1407 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1401 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - |
| 1408 | sizeof(struct unallocSpaceEntry))) { | 1402 | sizeof(struct unallocSpaceEntry)); |
| 1409 | make_bad_inode(inode); | 1403 | if (ret) |
| 1410 | return; | 1404 | goto out; |
| 1411 | } | ||
| 1412 | memcpy(iinfo->i_ext.i_data, | 1405 | memcpy(iinfo->i_ext.i_data, |
| 1413 | bh->b_data + sizeof(struct unallocSpaceEntry), | 1406 | bh->b_data + sizeof(struct unallocSpaceEntry), |
| 1414 | inode->i_sb->s_blocksize - | 1407 | inode->i_sb->s_blocksize - |
| 1415 | sizeof(struct unallocSpaceEntry)); | 1408 | sizeof(struct unallocSpaceEntry)); |
| 1416 | return; | 1409 | return 0; |
| 1417 | } | 1410 | } |
| 1418 | 1411 | ||
| 1412 | ret = -EIO; | ||
| 1419 | read_lock(&sbi->s_cred_lock); | 1413 | read_lock(&sbi->s_cred_lock); |
| 1420 | i_uid_write(inode, le32_to_cpu(fe->uid)); | 1414 | i_uid_write(inode, le32_to_cpu(fe->uid)); |
| 1421 | if (!uid_valid(inode->i_uid) || | 1415 | if (!uid_valid(inode->i_uid) || |
| @@ -1441,8 +1435,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1441 | read_unlock(&sbi->s_cred_lock); | 1435 | read_unlock(&sbi->s_cred_lock); |
| 1442 | 1436 | ||
| 1443 | link_count = le16_to_cpu(fe->fileLinkCount); | 1437 | link_count = le16_to_cpu(fe->fileLinkCount); |
| 1444 | if (!link_count) | 1438 | if (!link_count) { |
| 1445 | link_count = 1; | 1439 | ret = -ESTALE; |
| 1440 | goto out; | ||
| 1441 | } | ||
| 1446 | set_nlink(inode, link_count); | 1442 | set_nlink(inode, link_count); |
| 1447 | 1443 | ||
| 1448 | inode->i_size = le64_to_cpu(fe->informationLength); | 1444 | inode->i_size = le64_to_cpu(fe->informationLength); |
| @@ -1488,6 +1484,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1488 | iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs); | 1484 | iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs); |
| 1489 | iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint); | 1485 | iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint); |
| 1490 | } | 1486 | } |
| 1487 | inode->i_generation = iinfo->i_unique; | ||
| 1491 | 1488 | ||
| 1492 | switch (fe->icbTag.fileType) { | 1489 | switch (fe->icbTag.fileType) { |
| 1493 | case ICBTAG_FILE_TYPE_DIRECTORY: | 1490 | case ICBTAG_FILE_TYPE_DIRECTORY: |
| @@ -1537,8 +1534,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1537 | default: | 1534 | default: |
| 1538 | udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n", | 1535 | udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n", |
| 1539 | inode->i_ino, fe->icbTag.fileType); | 1536 | inode->i_ino, fe->icbTag.fileType); |
| 1540 | make_bad_inode(inode); | 1537 | goto out; |
| 1541 | return; | ||
| 1542 | } | 1538 | } |
| 1543 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 1539 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
| 1544 | struct deviceSpec *dsea = | 1540 | struct deviceSpec *dsea = |
| @@ -1549,8 +1545,12 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1549 | le32_to_cpu(dsea->minorDeviceIdent))); | 1545 | le32_to_cpu(dsea->minorDeviceIdent))); |
| 1550 | /* Developer ID ??? */ | 1546 | /* Developer ID ??? */ |
| 1551 | } else | 1547 | } else |
| 1552 | make_bad_inode(inode); | 1548 | goto out; |
| 1553 | } | 1549 | } |
| 1550 | ret = 0; | ||
| 1551 | out: | ||
| 1552 | brelse(bh); | ||
| 1553 | return ret; | ||
| 1554 | } | 1554 | } |
| 1555 | 1555 | ||
| 1556 | static int udf_alloc_i_data(struct inode *inode, size_t size) | 1556 | static int udf_alloc_i_data(struct inode *inode, size_t size) |
| @@ -1664,7 +1664,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1664 | FE_PERM_U_DELETE | FE_PERM_U_CHATTR)); | 1664 | FE_PERM_U_DELETE | FE_PERM_U_CHATTR)); |
| 1665 | fe->permissions = cpu_to_le32(udfperms); | 1665 | fe->permissions = cpu_to_le32(udfperms); |
| 1666 | 1666 | ||
| 1667 | if (S_ISDIR(inode->i_mode)) | 1667 | if (S_ISDIR(inode->i_mode) && inode->i_nlink > 0) |
| 1668 | fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1); | 1668 | fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1); |
| 1669 | else | 1669 | else |
| 1670 | fe->fileLinkCount = cpu_to_le16(inode->i_nlink); | 1670 | fe->fileLinkCount = cpu_to_le16(inode->i_nlink); |
| @@ -1830,32 +1830,23 @@ struct inode *udf_iget(struct super_block *sb, struct kernel_lb_addr *ino) | |||
| 1830 | { | 1830 | { |
| 1831 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); | 1831 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); |
| 1832 | struct inode *inode = iget_locked(sb, block); | 1832 | struct inode *inode = iget_locked(sb, block); |
| 1833 | int err; | ||
| 1833 | 1834 | ||
| 1834 | if (!inode) | 1835 | if (!inode) |
| 1835 | return NULL; | 1836 | return ERR_PTR(-ENOMEM); |
| 1836 | |||
| 1837 | if (inode->i_state & I_NEW) { | ||
| 1838 | memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); | ||
| 1839 | __udf_read_inode(inode); | ||
| 1840 | unlock_new_inode(inode); | ||
| 1841 | } | ||
| 1842 | 1837 | ||
| 1843 | if (is_bad_inode(inode)) | 1838 | if (!(inode->i_state & I_NEW)) |
| 1844 | goto out_iput; | 1839 | return inode; |
| 1845 | 1840 | ||
| 1846 | if (ino->logicalBlockNum >= UDF_SB(sb)-> | 1841 | memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); |
| 1847 | s_partmaps[ino->partitionReferenceNum].s_partition_len) { | 1842 | err = udf_read_inode(inode); |
| 1848 | udf_debug("block=%d, partition=%d out of range\n", | 1843 | if (err < 0) { |
| 1849 | ino->logicalBlockNum, ino->partitionReferenceNum); | 1844 | iget_failed(inode); |
| 1850 | make_bad_inode(inode); | 1845 | return ERR_PTR(err); |
| 1851 | goto out_iput; | ||
| 1852 | } | 1846 | } |
| 1847 | unlock_new_inode(inode); | ||
| 1853 | 1848 | ||
| 1854 | return inode; | 1849 | return inode; |
| 1855 | |||
| 1856 | out_iput: | ||
| 1857 | iput(inode); | ||
| 1858 | return NULL; | ||
| 1859 | } | 1850 | } |
| 1860 | 1851 | ||
| 1861 | int udf_add_aext(struct inode *inode, struct extent_position *epos, | 1852 | int udf_add_aext(struct inode *inode, struct extent_position *epos, |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 83a06001742b..c12e260fd6c4 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -270,9 +270,8 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
| 270 | NULL, 0), | 270 | NULL, 0), |
| 271 | }; | 271 | }; |
| 272 | inode = udf_iget(dir->i_sb, lb); | 272 | inode = udf_iget(dir->i_sb, lb); |
| 273 | if (!inode) { | 273 | if (IS_ERR(inode)) |
| 274 | return ERR_PTR(-EACCES); | 274 | return inode; |
| 275 | } | ||
| 276 | } else | 275 | } else |
| 277 | #endif /* UDF_RECOVERY */ | 276 | #endif /* UDF_RECOVERY */ |
| 278 | 277 | ||
| @@ -285,9 +284,8 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
| 285 | 284 | ||
| 286 | loc = lelb_to_cpu(cfi.icb.extLocation); | 285 | loc = lelb_to_cpu(cfi.icb.extLocation); |
| 287 | inode = udf_iget(dir->i_sb, &loc); | 286 | inode = udf_iget(dir->i_sb, &loc); |
| 288 | if (!inode) { | 287 | if (IS_ERR(inode)) |
| 289 | return ERR_PTR(-EACCES); | 288 | return ERR_CAST(inode); |
| 290 | } | ||
| 291 | } | 289 | } |
| 292 | 290 | ||
| 293 | return d_splice_alias(inode, dentry); | 291 | return d_splice_alias(inode, dentry); |
| @@ -550,32 +548,18 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, | |||
| 550 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); | 548 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); |
| 551 | } | 549 | } |
| 552 | 550 | ||
| 553 | static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, | 551 | static int udf_add_nondir(struct dentry *dentry, struct inode *inode) |
| 554 | bool excl) | ||
| 555 | { | 552 | { |
| 553 | struct udf_inode_info *iinfo = UDF_I(inode); | ||
| 554 | struct inode *dir = dentry->d_parent->d_inode; | ||
| 556 | struct udf_fileident_bh fibh; | 555 | struct udf_fileident_bh fibh; |
| 557 | struct inode *inode; | ||
| 558 | struct fileIdentDesc cfi, *fi; | 556 | struct fileIdentDesc cfi, *fi; |
| 559 | int err; | 557 | int err; |
| 560 | struct udf_inode_info *iinfo; | ||
| 561 | |||
| 562 | inode = udf_new_inode(dir, mode, &err); | ||
| 563 | if (!inode) { | ||
| 564 | return err; | ||
| 565 | } | ||
| 566 | |||
| 567 | iinfo = UDF_I(inode); | ||
| 568 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | ||
| 569 | inode->i_data.a_ops = &udf_adinicb_aops; | ||
| 570 | else | ||
| 571 | inode->i_data.a_ops = &udf_aops; | ||
| 572 | inode->i_op = &udf_file_inode_operations; | ||
| 573 | inode->i_fop = &udf_file_operations; | ||
| 574 | mark_inode_dirty(inode); | ||
| 575 | 558 | ||
| 576 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); | 559 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); |
| 577 | if (!fi) { | 560 | if (unlikely(!fi)) { |
| 578 | inode_dec_link_count(inode); | 561 | inode_dec_link_count(inode); |
| 562 | unlock_new_inode(inode); | ||
| 579 | iput(inode); | 563 | iput(inode); |
| 580 | return err; | 564 | return err; |
| 581 | } | 565 | } |
| @@ -589,23 +573,21 @@ static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, | |||
| 589 | if (fibh.sbh != fibh.ebh) | 573 | if (fibh.sbh != fibh.ebh) |
| 590 | brelse(fibh.ebh); | 574 | brelse(fibh.ebh); |
| 591 | brelse(fibh.sbh); | 575 | brelse(fibh.sbh); |
| 576 | unlock_new_inode(inode); | ||
| 592 | d_instantiate(dentry, inode); | 577 | d_instantiate(dentry, inode); |
| 593 | 578 | ||
| 594 | return 0; | 579 | return 0; |
| 595 | } | 580 | } |
| 596 | 581 | ||
| 597 | static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | 582 | static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
| 583 | bool excl) | ||
| 598 | { | 584 | { |
| 599 | struct inode *inode; | 585 | struct inode *inode = udf_new_inode(dir, mode); |
| 600 | struct udf_inode_info *iinfo; | ||
| 601 | int err; | ||
| 602 | 586 | ||
| 603 | inode = udf_new_inode(dir, mode, &err); | 587 | if (IS_ERR(inode)) |
| 604 | if (!inode) | 588 | return PTR_ERR(inode); |
| 605 | return err; | ||
| 606 | 589 | ||
| 607 | iinfo = UDF_I(inode); | 590 | if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) |
| 608 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | ||
| 609 | inode->i_data.a_ops = &udf_adinicb_aops; | 591 | inode->i_data.a_ops = &udf_adinicb_aops; |
| 610 | else | 592 | else |
| 611 | inode->i_data.a_ops = &udf_aops; | 593 | inode->i_data.a_ops = &udf_aops; |
| @@ -613,7 +595,25 @@ static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 613 | inode->i_fop = &udf_file_operations; | 595 | inode->i_fop = &udf_file_operations; |
| 614 | mark_inode_dirty(inode); | 596 | mark_inode_dirty(inode); |
| 615 | 597 | ||
| 598 | return udf_add_nondir(dentry, inode); | ||
| 599 | } | ||
| 600 | |||
| 601 | static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | ||
| 602 | { | ||
| 603 | struct inode *inode = udf_new_inode(dir, mode); | ||
| 604 | |||
| 605 | if (IS_ERR(inode)) | ||
| 606 | return PTR_ERR(inode); | ||
| 607 | |||
| 608 | if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | ||
| 609 | inode->i_data.a_ops = &udf_adinicb_aops; | ||
| 610 | else | ||
| 611 | inode->i_data.a_ops = &udf_aops; | ||
| 612 | inode->i_op = &udf_file_inode_operations; | ||
| 613 | inode->i_fop = &udf_file_operations; | ||
| 614 | mark_inode_dirty(inode); | ||
| 616 | d_tmpfile(dentry, inode); | 615 | d_tmpfile(dentry, inode); |
| 616 | unlock_new_inode(inode); | ||
| 617 | return 0; | 617 | return 0; |
| 618 | } | 618 | } |
| 619 | 619 | ||
| @@ -621,44 +621,16 @@ static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, | |||
| 621 | dev_t rdev) | 621 | dev_t rdev) |
| 622 | { | 622 | { |
| 623 | struct inode *inode; | 623 | struct inode *inode; |
| 624 | struct udf_fileident_bh fibh; | ||
| 625 | struct fileIdentDesc cfi, *fi; | ||
| 626 | int err; | ||
| 627 | struct udf_inode_info *iinfo; | ||
| 628 | 624 | ||
| 629 | if (!old_valid_dev(rdev)) | 625 | if (!old_valid_dev(rdev)) |
| 630 | return -EINVAL; | 626 | return -EINVAL; |
| 631 | 627 | ||
| 632 | err = -EIO; | 628 | inode = udf_new_inode(dir, mode); |
| 633 | inode = udf_new_inode(dir, mode, &err); | 629 | if (IS_ERR(inode)) |
| 634 | if (!inode) | 630 | return PTR_ERR(inode); |
| 635 | goto out; | ||
| 636 | 631 | ||
| 637 | iinfo = UDF_I(inode); | ||
| 638 | init_special_inode(inode, mode, rdev); | 632 | init_special_inode(inode, mode, rdev); |
| 639 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); | 633 | return udf_add_nondir(dentry, inode); |
| 640 | if (!fi) { | ||
| 641 | inode_dec_link_count(inode); | ||
| 642 | iput(inode); | ||
| 643 | return err; | ||
| 644 | } | ||
| 645 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | ||
| 646 | cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); | ||
| 647 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | ||
| 648 | cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); | ||
| 649 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | ||
| 650 | if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | ||
| 651 | mark_inode_dirty(dir); | ||
| 652 | mark_inode_dirty(inode); | ||
| 653 | |||
| 654 | if (fibh.sbh != fibh.ebh) | ||
| 655 | brelse(fibh.ebh); | ||
| 656 | brelse(fibh.sbh); | ||
| 657 | d_instantiate(dentry, inode); | ||
| 658 | err = 0; | ||
| 659 | |||
| 660 | out: | ||
| 661 | return err; | ||
| 662 | } | 634 | } |
| 663 | 635 | ||
| 664 | static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | 636 | static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
| @@ -670,10 +642,9 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 670 | struct udf_inode_info *dinfo = UDF_I(dir); | 642 | struct udf_inode_info *dinfo = UDF_I(dir); |
| 671 | struct udf_inode_info *iinfo; | 643 | struct udf_inode_info *iinfo; |
| 672 | 644 | ||
| 673 | err = -EIO; | 645 | inode = udf_new_inode(dir, S_IFDIR | mode); |
| 674 | inode = udf_new_inode(dir, S_IFDIR | mode, &err); | 646 | if (IS_ERR(inode)) |
| 675 | if (!inode) | 647 | return PTR_ERR(inode); |
| 676 | goto out; | ||
| 677 | 648 | ||
| 678 | iinfo = UDF_I(inode); | 649 | iinfo = UDF_I(inode); |
| 679 | inode->i_op = &udf_dir_inode_operations; | 650 | inode->i_op = &udf_dir_inode_operations; |
| @@ -681,6 +652,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 681 | fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err); | 652 | fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err); |
| 682 | if (!fi) { | 653 | if (!fi) { |
| 683 | inode_dec_link_count(inode); | 654 | inode_dec_link_count(inode); |
| 655 | unlock_new_inode(inode); | ||
| 684 | iput(inode); | 656 | iput(inode); |
| 685 | goto out; | 657 | goto out; |
| 686 | } | 658 | } |
| @@ -699,6 +671,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 699 | if (!fi) { | 671 | if (!fi) { |
| 700 | clear_nlink(inode); | 672 | clear_nlink(inode); |
| 701 | mark_inode_dirty(inode); | 673 | mark_inode_dirty(inode); |
| 674 | unlock_new_inode(inode); | ||
| 702 | iput(inode); | 675 | iput(inode); |
| 703 | goto out; | 676 | goto out; |
| 704 | } | 677 | } |
| @@ -710,6 +683,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 710 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 683 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 711 | inc_nlink(dir); | 684 | inc_nlink(dir); |
| 712 | mark_inode_dirty(dir); | 685 | mark_inode_dirty(dir); |
| 686 | unlock_new_inode(inode); | ||
| 713 | d_instantiate(dentry, inode); | 687 | d_instantiate(dentry, inode); |
| 714 | if (fibh.sbh != fibh.ebh) | 688 | if (fibh.sbh != fibh.ebh) |
| 715 | brelse(fibh.ebh); | 689 | brelse(fibh.ebh); |
| @@ -876,14 +850,11 @@ out: | |||
| 876 | static int udf_symlink(struct inode *dir, struct dentry *dentry, | 850 | static int udf_symlink(struct inode *dir, struct dentry *dentry, |
| 877 | const char *symname) | 851 | const char *symname) |
| 878 | { | 852 | { |
| 879 | struct inode *inode; | 853 | struct inode *inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO); |
| 880 | struct pathComponent *pc; | 854 | struct pathComponent *pc; |
| 881 | const char *compstart; | 855 | const char *compstart; |
| 882 | struct udf_fileident_bh fibh; | ||
| 883 | struct extent_position epos = {}; | 856 | struct extent_position epos = {}; |
| 884 | int eoffset, elen = 0; | 857 | int eoffset, elen = 0; |
| 885 | struct fileIdentDesc *fi; | ||
| 886 | struct fileIdentDesc cfi; | ||
| 887 | uint8_t *ea; | 858 | uint8_t *ea; |
| 888 | int err; | 859 | int err; |
| 889 | int block; | 860 | int block; |
| @@ -892,9 +863,8 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 892 | struct udf_inode_info *iinfo; | 863 | struct udf_inode_info *iinfo; |
| 893 | struct super_block *sb = dir->i_sb; | 864 | struct super_block *sb = dir->i_sb; |
| 894 | 865 | ||
| 895 | inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO, &err); | 866 | if (IS_ERR(inode)) |
| 896 | if (!inode) | 867 | return PTR_ERR(inode); |
| 897 | goto out; | ||
| 898 | 868 | ||
| 899 | iinfo = UDF_I(inode); | 869 | iinfo = UDF_I(inode); |
| 900 | down_write(&iinfo->i_data_sem); | 870 | down_write(&iinfo->i_data_sem); |
| @@ -1012,32 +982,15 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 1012 | mark_inode_dirty(inode); | 982 | mark_inode_dirty(inode); |
| 1013 | up_write(&iinfo->i_data_sem); | 983 | up_write(&iinfo->i_data_sem); |
| 1014 | 984 | ||
| 1015 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); | 985 | err = udf_add_nondir(dentry, inode); |
| 1016 | if (!fi) | ||
| 1017 | goto out_fail; | ||
| 1018 | cfi.icb.extLength = cpu_to_le32(sb->s_blocksize); | ||
| 1019 | cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); | ||
| 1020 | if (UDF_SB(inode->i_sb)->s_lvid_bh) { | ||
| 1021 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | ||
| 1022 | cpu_to_le32(lvid_get_unique_id(sb)); | ||
| 1023 | } | ||
| 1024 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | ||
| 1025 | if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | ||
| 1026 | mark_inode_dirty(dir); | ||
| 1027 | if (fibh.sbh != fibh.ebh) | ||
| 1028 | brelse(fibh.ebh); | ||
| 1029 | brelse(fibh.sbh); | ||
| 1030 | d_instantiate(dentry, inode); | ||
| 1031 | err = 0; | ||
| 1032 | |||
| 1033 | out: | 986 | out: |
| 1034 | kfree(name); | 987 | kfree(name); |
| 1035 | return err; | 988 | return err; |
| 1036 | 989 | ||
| 1037 | out_no_entry: | 990 | out_no_entry: |
| 1038 | up_write(&iinfo->i_data_sem); | 991 | up_write(&iinfo->i_data_sem); |
| 1039 | out_fail: | ||
| 1040 | inode_dec_link_count(inode); | 992 | inode_dec_link_count(inode); |
| 993 | unlock_new_inode(inode); | ||
| 1041 | iput(inode); | 994 | iput(inode); |
| 1042 | goto out; | 995 | goto out; |
| 1043 | } | 996 | } |
| @@ -1222,7 +1175,7 @@ static struct dentry *udf_get_parent(struct dentry *child) | |||
| 1222 | struct udf_fileident_bh fibh; | 1175 | struct udf_fileident_bh fibh; |
| 1223 | 1176 | ||
| 1224 | if (!udf_find_entry(child->d_inode, &dotdot, &fibh, &cfi)) | 1177 | if (!udf_find_entry(child->d_inode, &dotdot, &fibh, &cfi)) |
| 1225 | goto out_unlock; | 1178 | return ERR_PTR(-EACCES); |
| 1226 | 1179 | ||
| 1227 | if (fibh.sbh != fibh.ebh) | 1180 | if (fibh.sbh != fibh.ebh) |
| 1228 | brelse(fibh.ebh); | 1181 | brelse(fibh.ebh); |
| @@ -1230,12 +1183,10 @@ static struct dentry *udf_get_parent(struct dentry *child) | |||
| 1230 | 1183 | ||
| 1231 | tloc = lelb_to_cpu(cfi.icb.extLocation); | 1184 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
| 1232 | inode = udf_iget(child->d_inode->i_sb, &tloc); | 1185 | inode = udf_iget(child->d_inode->i_sb, &tloc); |
| 1233 | if (!inode) | 1186 | if (IS_ERR(inode)) |
| 1234 | goto out_unlock; | 1187 | return ERR_CAST(inode); |
| 1235 | 1188 | ||
| 1236 | return d_obtain_alias(inode); | 1189 | return d_obtain_alias(inode); |
| 1237 | out_unlock: | ||
| 1238 | return ERR_PTR(-EACCES); | ||
| 1239 | } | 1190 | } |
| 1240 | 1191 | ||
| 1241 | 1192 | ||
| @@ -1252,8 +1203,8 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, | |||
| 1252 | loc.partitionReferenceNum = partref; | 1203 | loc.partitionReferenceNum = partref; |
| 1253 | inode = udf_iget(sb, &loc); | 1204 | inode = udf_iget(sb, &loc); |
| 1254 | 1205 | ||
| 1255 | if (inode == NULL) | 1206 | if (IS_ERR(inode)) |
| 1256 | return ERR_PTR(-ENOMEM); | 1207 | return ERR_CAST(inode); |
| 1257 | 1208 | ||
| 1258 | if (generation && inode->i_generation != generation) { | 1209 | if (generation && inode->i_generation != generation) { |
| 1259 | iput(inode); | 1210 | iput(inode); |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 813da94d447b..5401fc33f5cc 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -961,12 +961,14 @@ struct inode *udf_find_metadata_inode_efe(struct super_block *sb, | |||
| 961 | 961 | ||
| 962 | metadata_fe = udf_iget(sb, &addr); | 962 | metadata_fe = udf_iget(sb, &addr); |
| 963 | 963 | ||
| 964 | if (metadata_fe == NULL) | 964 | if (IS_ERR(metadata_fe)) { |
| 965 | udf_warn(sb, "metadata inode efe not found\n"); | 965 | udf_warn(sb, "metadata inode efe not found\n"); |
| 966 | else if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) { | 966 | return metadata_fe; |
| 967 | } | ||
| 968 | if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) { | ||
| 967 | udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n"); | 969 | udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n"); |
| 968 | iput(metadata_fe); | 970 | iput(metadata_fe); |
| 969 | metadata_fe = NULL; | 971 | return ERR_PTR(-EIO); |
| 970 | } | 972 | } |
| 971 | 973 | ||
| 972 | return metadata_fe; | 974 | return metadata_fe; |
| @@ -978,6 +980,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
| 978 | struct udf_part_map *map; | 980 | struct udf_part_map *map; |
| 979 | struct udf_meta_data *mdata; | 981 | struct udf_meta_data *mdata; |
| 980 | struct kernel_lb_addr addr; | 982 | struct kernel_lb_addr addr; |
| 983 | struct inode *fe; | ||
| 981 | 984 | ||
| 982 | map = &sbi->s_partmaps[partition]; | 985 | map = &sbi->s_partmaps[partition]; |
| 983 | mdata = &map->s_type_specific.s_metadata; | 986 | mdata = &map->s_type_specific.s_metadata; |
| @@ -986,22 +989,24 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
| 986 | udf_debug("Metadata file location: block = %d part = %d\n", | 989 | udf_debug("Metadata file location: block = %d part = %d\n", |
| 987 | mdata->s_meta_file_loc, map->s_partition_num); | 990 | mdata->s_meta_file_loc, map->s_partition_num); |
| 988 | 991 | ||
| 989 | mdata->s_metadata_fe = udf_find_metadata_inode_efe(sb, | 992 | fe = udf_find_metadata_inode_efe(sb, mdata->s_meta_file_loc, |
| 990 | mdata->s_meta_file_loc, map->s_partition_num); | 993 | map->s_partition_num); |
| 991 | 994 | if (IS_ERR(fe)) { | |
| 992 | if (mdata->s_metadata_fe == NULL) { | ||
| 993 | /* mirror file entry */ | 995 | /* mirror file entry */ |
| 994 | udf_debug("Mirror metadata file location: block = %d part = %d\n", | 996 | udf_debug("Mirror metadata file location: block = %d part = %d\n", |
| 995 | mdata->s_mirror_file_loc, map->s_partition_num); | 997 | mdata->s_mirror_file_loc, map->s_partition_num); |
| 996 | 998 | ||
| 997 | mdata->s_mirror_fe = udf_find_metadata_inode_efe(sb, | 999 | fe = udf_find_metadata_inode_efe(sb, mdata->s_mirror_file_loc, |
| 998 | mdata->s_mirror_file_loc, map->s_partition_num); | 1000 | map->s_partition_num); |
| 999 | 1001 | ||
| 1000 | if (mdata->s_mirror_fe == NULL) { | 1002 | if (IS_ERR(fe)) { |
| 1001 | udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); | 1003 | udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); |
| 1002 | return -EIO; | 1004 | return PTR_ERR(fe); |
| 1003 | } | 1005 | } |
| 1004 | } | 1006 | mdata->s_mirror_fe = fe; |
| 1007 | } else | ||
| 1008 | mdata->s_metadata_fe = fe; | ||
| 1009 | |||
| 1005 | 1010 | ||
| 1006 | /* | 1011 | /* |
| 1007 | * bitmap file entry | 1012 | * bitmap file entry |
| @@ -1015,15 +1020,16 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
| 1015 | udf_debug("Bitmap file location: block = %d part = %d\n", | 1020 | udf_debug("Bitmap file location: block = %d part = %d\n", |
| 1016 | addr.logicalBlockNum, addr.partitionReferenceNum); | 1021 | addr.logicalBlockNum, addr.partitionReferenceNum); |
| 1017 | 1022 | ||
| 1018 | mdata->s_bitmap_fe = udf_iget(sb, &addr); | 1023 | fe = udf_iget(sb, &addr); |
| 1019 | if (mdata->s_bitmap_fe == NULL) { | 1024 | if (IS_ERR(fe)) { |
| 1020 | if (sb->s_flags & MS_RDONLY) | 1025 | if (sb->s_flags & MS_RDONLY) |
| 1021 | udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n"); | 1026 | udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n"); |
| 1022 | else { | 1027 | else { |
| 1023 | udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); | 1028 | udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); |
| 1024 | return -EIO; | 1029 | return PTR_ERR(fe); |
| 1025 | } | 1030 | } |
| 1026 | } | 1031 | } else |
| 1032 | mdata->s_bitmap_fe = fe; | ||
| 1027 | } | 1033 | } |
| 1028 | 1034 | ||
| 1029 | udf_debug("udf_load_metadata_files Ok\n"); | 1035 | udf_debug("udf_load_metadata_files Ok\n"); |
| @@ -1111,13 +1117,15 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
| 1111 | phd->unallocSpaceTable.extPosition), | 1117 | phd->unallocSpaceTable.extPosition), |
| 1112 | .partitionReferenceNum = p_index, | 1118 | .partitionReferenceNum = p_index, |
| 1113 | }; | 1119 | }; |
| 1120 | struct inode *inode; | ||
| 1114 | 1121 | ||
| 1115 | map->s_uspace.s_table = udf_iget(sb, &loc); | 1122 | inode = udf_iget(sb, &loc); |
| 1116 | if (!map->s_uspace.s_table) { | 1123 | if (IS_ERR(inode)) { |
| 1117 | udf_debug("cannot load unallocSpaceTable (part %d)\n", | 1124 | udf_debug("cannot load unallocSpaceTable (part %d)\n", |
| 1118 | p_index); | 1125 | p_index); |
| 1119 | return -EIO; | 1126 | return PTR_ERR(inode); |
| 1120 | } | 1127 | } |
| 1128 | map->s_uspace.s_table = inode; | ||
| 1121 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; | 1129 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; |
| 1122 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", | 1130 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", |
| 1123 | p_index, map->s_uspace.s_table->i_ino); | 1131 | p_index, map->s_uspace.s_table->i_ino); |
| @@ -1144,14 +1152,15 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
| 1144 | phd->freedSpaceTable.extPosition), | 1152 | phd->freedSpaceTable.extPosition), |
| 1145 | .partitionReferenceNum = p_index, | 1153 | .partitionReferenceNum = p_index, |
| 1146 | }; | 1154 | }; |
| 1155 | struct inode *inode; | ||
| 1147 | 1156 | ||
| 1148 | map->s_fspace.s_table = udf_iget(sb, &loc); | 1157 | inode = udf_iget(sb, &loc); |
| 1149 | if (!map->s_fspace.s_table) { | 1158 | if (IS_ERR(inode)) { |
| 1150 | udf_debug("cannot load freedSpaceTable (part %d)\n", | 1159 | udf_debug("cannot load freedSpaceTable (part %d)\n", |
| 1151 | p_index); | 1160 | p_index); |
| 1152 | return -EIO; | 1161 | return PTR_ERR(inode); |
| 1153 | } | 1162 | } |
| 1154 | 1163 | map->s_fspace.s_table = inode; | |
| 1155 | map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; | 1164 | map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; |
| 1156 | udf_debug("freedSpaceTable (part %d) @ %ld\n", | 1165 | udf_debug("freedSpaceTable (part %d) @ %ld\n", |
| 1157 | p_index, map->s_fspace.s_table->i_ino); | 1166 | p_index, map->s_fspace.s_table->i_ino); |
| @@ -1178,6 +1187,7 @@ static void udf_find_vat_block(struct super_block *sb, int p_index, | |||
| 1178 | struct udf_part_map *map = &sbi->s_partmaps[p_index]; | 1187 | struct udf_part_map *map = &sbi->s_partmaps[p_index]; |
| 1179 | sector_t vat_block; | 1188 | sector_t vat_block; |
| 1180 | struct kernel_lb_addr ino; | 1189 | struct kernel_lb_addr ino; |
| 1190 | struct inode *inode; | ||
| 1181 | 1191 | ||
| 1182 | /* | 1192 | /* |
| 1183 | * VAT file entry is in the last recorded block. Some broken disks have | 1193 | * VAT file entry is in the last recorded block. Some broken disks have |
| @@ -1186,10 +1196,13 @@ static void udf_find_vat_block(struct super_block *sb, int p_index, | |||
| 1186 | ino.partitionReferenceNum = type1_index; | 1196 | ino.partitionReferenceNum = type1_index; |
| 1187 | for (vat_block = start_block; | 1197 | for (vat_block = start_block; |
| 1188 | vat_block >= map->s_partition_root && | 1198 | vat_block >= map->s_partition_root && |
| 1189 | vat_block >= start_block - 3 && | 1199 | vat_block >= start_block - 3; vat_block--) { |
| 1190 | !sbi->s_vat_inode; vat_block--) { | ||
| 1191 | ino.logicalBlockNum = vat_block - map->s_partition_root; | 1200 | ino.logicalBlockNum = vat_block - map->s_partition_root; |
| 1192 | sbi->s_vat_inode = udf_iget(sb, &ino); | 1201 | inode = udf_iget(sb, &ino); |
| 1202 | if (!IS_ERR(inode)) { | ||
| 1203 | sbi->s_vat_inode = inode; | ||
| 1204 | break; | ||
| 1205 | } | ||
| 1193 | } | 1206 | } |
| 1194 | } | 1207 | } |
| 1195 | 1208 | ||
| @@ -2205,10 +2218,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 2205 | /* assign inodes by physical block number */ | 2218 | /* assign inodes by physical block number */ |
| 2206 | /* perhaps it's not extensible enough, but for now ... */ | 2219 | /* perhaps it's not extensible enough, but for now ... */ |
| 2207 | inode = udf_iget(sb, &rootdir); | 2220 | inode = udf_iget(sb, &rootdir); |
| 2208 | if (!inode) { | 2221 | if (IS_ERR(inode)) { |
| 2209 | udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n", | 2222 | udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n", |
| 2210 | rootdir.logicalBlockNum, rootdir.partitionReferenceNum); | 2223 | rootdir.logicalBlockNum, rootdir.partitionReferenceNum); |
| 2211 | ret = -EIO; | 2224 | ret = PTR_ERR(inode); |
| 2212 | goto error_out; | 2225 | goto error_out; |
| 2213 | } | 2226 | } |
| 2214 | 2227 | ||
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index be7dabbbcb49..742557be9936 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
| @@ -143,7 +143,6 @@ extern int udf_expand_file_adinicb(struct inode *); | |||
| 143 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); | 143 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); |
| 144 | extern struct buffer_head *udf_bread(struct inode *, int, int, int *); | 144 | extern struct buffer_head *udf_bread(struct inode *, int, int, int *); |
| 145 | extern int udf_setsize(struct inode *, loff_t); | 145 | extern int udf_setsize(struct inode *, loff_t); |
| 146 | extern void udf_read_inode(struct inode *); | ||
| 147 | extern void udf_evict_inode(struct inode *); | 146 | extern void udf_evict_inode(struct inode *); |
| 148 | extern int udf_write_inode(struct inode *, struct writeback_control *wbc); | 147 | extern int udf_write_inode(struct inode *, struct writeback_control *wbc); |
| 149 | extern long udf_block_map(struct inode *, sector_t); | 148 | extern long udf_block_map(struct inode *, sector_t); |
| @@ -209,7 +208,7 @@ extern int udf_CS0toUTF8(struct ustr *, const struct ustr *); | |||
| 209 | 208 | ||
| 210 | /* ialloc.c */ | 209 | /* ialloc.c */ |
| 211 | extern void udf_free_inode(struct inode *); | 210 | extern void udf_free_inode(struct inode *); |
| 212 | extern struct inode *udf_new_inode(struct inode *, umode_t, int *); | 211 | extern struct inode *udf_new_inode(struct inode *, umode_t); |
| 213 | 212 | ||
| 214 | /* truncate.c */ | 213 | /* truncate.c */ |
| 215 | extern void udf_truncate_tail_extent(struct inode *); | 214 | extern void udf_truncate_tail_extent(struct inode *); |
