diff options
Diffstat (limited to 'fs/ext4/namei.c')
-rw-r--r-- | fs/ext4/namei.c | 124 |
1 files changed, 68 insertions, 56 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 6d2c1b897fc7..0c070fabd108 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -383,8 +383,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
383 | if (root->info.hash_version != DX_HASH_TEA && | 383 | if (root->info.hash_version != DX_HASH_TEA && |
384 | root->info.hash_version != DX_HASH_HALF_MD4 && | 384 | root->info.hash_version != DX_HASH_HALF_MD4 && |
385 | root->info.hash_version != DX_HASH_LEGACY) { | 385 | root->info.hash_version != DX_HASH_LEGACY) { |
386 | ext4_warning(dir->i_sb, __func__, | 386 | ext4_warning(dir->i_sb, "Unrecognised inode hash code %d", |
387 | "Unrecognised inode hash code %d", | ||
388 | root->info.hash_version); | 387 | root->info.hash_version); |
389 | brelse(bh); | 388 | brelse(bh); |
390 | *err = ERR_BAD_DX_DIR; | 389 | *err = ERR_BAD_DX_DIR; |
@@ -399,8 +398,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
399 | hash = hinfo->hash; | 398 | hash = hinfo->hash; |
400 | 399 | ||
401 | if (root->info.unused_flags & 1) { | 400 | if (root->info.unused_flags & 1) { |
402 | ext4_warning(dir->i_sb, __func__, | 401 | ext4_warning(dir->i_sb, "Unimplemented inode hash flags: %#06x", |
403 | "Unimplemented inode hash flags: %#06x", | ||
404 | root->info.unused_flags); | 402 | root->info.unused_flags); |
405 | brelse(bh); | 403 | brelse(bh); |
406 | *err = ERR_BAD_DX_DIR; | 404 | *err = ERR_BAD_DX_DIR; |
@@ -408,8 +406,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
408 | } | 406 | } |
409 | 407 | ||
410 | if ((indirect = root->info.indirect_levels) > 1) { | 408 | if ((indirect = root->info.indirect_levels) > 1) { |
411 | ext4_warning(dir->i_sb, __func__, | 409 | ext4_warning(dir->i_sb, "Unimplemented inode hash depth: %#06x", |
412 | "Unimplemented inode hash depth: %#06x", | ||
413 | root->info.indirect_levels); | 410 | root->info.indirect_levels); |
414 | brelse(bh); | 411 | brelse(bh); |
415 | *err = ERR_BAD_DX_DIR; | 412 | *err = ERR_BAD_DX_DIR; |
@@ -421,8 +418,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
421 | 418 | ||
422 | if (dx_get_limit(entries) != dx_root_limit(dir, | 419 | if (dx_get_limit(entries) != dx_root_limit(dir, |
423 | root->info.info_length)) { | 420 | root->info.info_length)) { |
424 | ext4_warning(dir->i_sb, __func__, | 421 | ext4_warning(dir->i_sb, "dx entry: limit != root limit"); |
425 | "dx entry: limit != root limit"); | ||
426 | brelse(bh); | 422 | brelse(bh); |
427 | *err = ERR_BAD_DX_DIR; | 423 | *err = ERR_BAD_DX_DIR; |
428 | goto fail; | 424 | goto fail; |
@@ -433,7 +429,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
433 | { | 429 | { |
434 | count = dx_get_count(entries); | 430 | count = dx_get_count(entries); |
435 | if (!count || count > dx_get_limit(entries)) { | 431 | if (!count || count > dx_get_limit(entries)) { |
436 | ext4_warning(dir->i_sb, __func__, | 432 | ext4_warning(dir->i_sb, |
437 | "dx entry: no count or count > limit"); | 433 | "dx entry: no count or count > limit"); |
438 | brelse(bh); | 434 | brelse(bh); |
439 | *err = ERR_BAD_DX_DIR; | 435 | *err = ERR_BAD_DX_DIR; |
@@ -478,7 +474,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
478 | goto fail2; | 474 | goto fail2; |
479 | at = entries = ((struct dx_node *) bh->b_data)->entries; | 475 | at = entries = ((struct dx_node *) bh->b_data)->entries; |
480 | if (dx_get_limit(entries) != dx_node_limit (dir)) { | 476 | if (dx_get_limit(entries) != dx_node_limit (dir)) { |
481 | ext4_warning(dir->i_sb, __func__, | 477 | ext4_warning(dir->i_sb, |
482 | "dx entry: limit != node limit"); | 478 | "dx entry: limit != node limit"); |
483 | brelse(bh); | 479 | brelse(bh); |
484 | *err = ERR_BAD_DX_DIR; | 480 | *err = ERR_BAD_DX_DIR; |
@@ -494,7 +490,7 @@ fail2: | |||
494 | } | 490 | } |
495 | fail: | 491 | fail: |
496 | if (*err == ERR_BAD_DX_DIR) | 492 | if (*err == ERR_BAD_DX_DIR) |
497 | ext4_warning(dir->i_sb, __func__, | 493 | ext4_warning(dir->i_sb, |
498 | "Corrupt dir inode %ld, running e2fsck is " | 494 | "Corrupt dir inode %ld, running e2fsck is " |
499 | "recommended.", dir->i_ino); | 495 | "recommended.", dir->i_ino); |
500 | return NULL; | 496 | return NULL; |
@@ -947,9 +943,8 @@ restart: | |||
947 | wait_on_buffer(bh); | 943 | wait_on_buffer(bh); |
948 | if (!buffer_uptodate(bh)) { | 944 | if (!buffer_uptodate(bh)) { |
949 | /* read error, skip block & hope for the best */ | 945 | /* read error, skip block & hope for the best */ |
950 | ext4_error(sb, __func__, "reading directory #%lu " | 946 | ext4_error(sb, "reading directory #%lu offset %lu", |
951 | "offset %lu", dir->i_ino, | 947 | dir->i_ino, (unsigned long)block); |
952 | (unsigned long)block); | ||
953 | brelse(bh); | 948 | brelse(bh); |
954 | goto next; | 949 | goto next; |
955 | } | 950 | } |
@@ -1041,7 +1036,7 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir, const struct q | |||
1041 | retval = ext4_htree_next_block(dir, hash, frame, | 1036 | retval = ext4_htree_next_block(dir, hash, frame, |
1042 | frames, NULL); | 1037 | frames, NULL); |
1043 | if (retval < 0) { | 1038 | if (retval < 0) { |
1044 | ext4_warning(sb, __func__, | 1039 | ext4_warning(sb, |
1045 | "error reading index page in directory #%lu", | 1040 | "error reading index page in directory #%lu", |
1046 | dir->i_ino); | 1041 | dir->i_ino); |
1047 | *err = retval; | 1042 | *err = retval; |
@@ -1071,14 +1066,13 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru | |||
1071 | __u32 ino = le32_to_cpu(de->inode); | 1066 | __u32 ino = le32_to_cpu(de->inode); |
1072 | brelse(bh); | 1067 | brelse(bh); |
1073 | if (!ext4_valid_inum(dir->i_sb, ino)) { | 1068 | if (!ext4_valid_inum(dir->i_sb, ino)) { |
1074 | ext4_error(dir->i_sb, "ext4_lookup", | 1069 | ext4_error(dir->i_sb, "bad inode number: %u", ino); |
1075 | "bad inode number: %u", ino); | ||
1076 | return ERR_PTR(-EIO); | 1070 | return ERR_PTR(-EIO); |
1077 | } | 1071 | } |
1078 | inode = ext4_iget(dir->i_sb, ino); | 1072 | inode = ext4_iget(dir->i_sb, ino); |
1079 | if (unlikely(IS_ERR(inode))) { | 1073 | if (unlikely(IS_ERR(inode))) { |
1080 | if (PTR_ERR(inode) == -ESTALE) { | 1074 | if (PTR_ERR(inode) == -ESTALE) { |
1081 | ext4_error(dir->i_sb, __func__, | 1075 | ext4_error(dir->i_sb, |
1082 | "deleted inode referenced: %u", | 1076 | "deleted inode referenced: %u", |
1083 | ino); | 1077 | ino); |
1084 | return ERR_PTR(-EIO); | 1078 | return ERR_PTR(-EIO); |
@@ -1110,7 +1104,7 @@ struct dentry *ext4_get_parent(struct dentry *child) | |||
1110 | brelse(bh); | 1104 | brelse(bh); |
1111 | 1105 | ||
1112 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { | 1106 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { |
1113 | ext4_error(child->d_inode->i_sb, "ext4_get_parent", | 1107 | ext4_error(child->d_inode->i_sb, |
1114 | "bad inode number: %u", ino); | 1108 | "bad inode number: %u", ino); |
1115 | return ERR_PTR(-EIO); | 1109 | return ERR_PTR(-EIO); |
1116 | } | 1110 | } |
@@ -1292,9 +1286,6 @@ errout: | |||
1292 | * add_dirent_to_buf will attempt search the directory block for | 1286 | * add_dirent_to_buf will attempt search the directory block for |
1293 | * space. It will return -ENOSPC if no space is available, and -EIO | 1287 | * space. It will return -ENOSPC if no space is available, and -EIO |
1294 | * and -EEXIST if directory entry already exists. | 1288 | * and -EEXIST if directory entry already exists. |
1295 | * | ||
1296 | * NOTE! bh is NOT released in the case where ENOSPC is returned. In | ||
1297 | * all other cases bh is released. | ||
1298 | */ | 1289 | */ |
1299 | static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, | 1290 | static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, |
1300 | struct inode *inode, struct ext4_dir_entry_2 *de, | 1291 | struct inode *inode, struct ext4_dir_entry_2 *de, |
@@ -1315,14 +1306,10 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, | |||
1315 | top = bh->b_data + blocksize - reclen; | 1306 | top = bh->b_data + blocksize - reclen; |
1316 | while ((char *) de <= top) { | 1307 | while ((char *) de <= top) { |
1317 | if (!ext4_check_dir_entry("ext4_add_entry", dir, de, | 1308 | if (!ext4_check_dir_entry("ext4_add_entry", dir, de, |
1318 | bh, offset)) { | 1309 | bh, offset)) |
1319 | brelse(bh); | ||
1320 | return -EIO; | 1310 | return -EIO; |
1321 | } | 1311 | if (ext4_match(namelen, name, de)) |
1322 | if (ext4_match(namelen, name, de)) { | ||
1323 | brelse(bh); | ||
1324 | return -EEXIST; | 1312 | return -EEXIST; |
1325 | } | ||
1326 | nlen = EXT4_DIR_REC_LEN(de->name_len); | 1313 | nlen = EXT4_DIR_REC_LEN(de->name_len); |
1327 | rlen = ext4_rec_len_from_disk(de->rec_len, blocksize); | 1314 | rlen = ext4_rec_len_from_disk(de->rec_len, blocksize); |
1328 | if ((de->inode? rlen - nlen: rlen) >= reclen) | 1315 | if ((de->inode? rlen - nlen: rlen) >= reclen) |
@@ -1337,7 +1324,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, | |||
1337 | err = ext4_journal_get_write_access(handle, bh); | 1324 | err = ext4_journal_get_write_access(handle, bh); |
1338 | if (err) { | 1325 | if (err) { |
1339 | ext4_std_error(dir->i_sb, err); | 1326 | ext4_std_error(dir->i_sb, err); |
1340 | brelse(bh); | ||
1341 | return err; | 1327 | return err; |
1342 | } | 1328 | } |
1343 | 1329 | ||
@@ -1377,7 +1363,6 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, | |||
1377 | err = ext4_handle_dirty_metadata(handle, dir, bh); | 1363 | err = ext4_handle_dirty_metadata(handle, dir, bh); |
1378 | if (err) | 1364 | if (err) |
1379 | ext4_std_error(dir->i_sb, err); | 1365 | ext4_std_error(dir->i_sb, err); |
1380 | brelse(bh); | ||
1381 | return 0; | 1366 | return 0; |
1382 | } | 1367 | } |
1383 | 1368 | ||
@@ -1419,7 +1404,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
1419 | de = (struct ext4_dir_entry_2 *)((char *)fde + | 1404 | de = (struct ext4_dir_entry_2 *)((char *)fde + |
1420 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); | 1405 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); |
1421 | if ((char *) de >= (((char *) root) + blocksize)) { | 1406 | if ((char *) de >= (((char *) root) + blocksize)) { |
1422 | ext4_error(dir->i_sb, __func__, | 1407 | ext4_error(dir->i_sb, |
1423 | "invalid rec_len for '..' in inode %lu", | 1408 | "invalid rec_len for '..' in inode %lu", |
1424 | dir->i_ino); | 1409 | dir->i_ino); |
1425 | brelse(bh); | 1410 | brelse(bh); |
@@ -1471,7 +1456,9 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
1471 | if (!(de)) | 1456 | if (!(de)) |
1472 | return retval; | 1457 | return retval; |
1473 | 1458 | ||
1474 | return add_dirent_to_buf(handle, dentry, inode, de, bh); | 1459 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
1460 | brelse(bh); | ||
1461 | return retval; | ||
1475 | } | 1462 | } |
1476 | 1463 | ||
1477 | /* | 1464 | /* |
@@ -1514,8 +1501,10 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
1514 | if(!bh) | 1501 | if(!bh) |
1515 | return retval; | 1502 | return retval; |
1516 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); | 1503 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); |
1517 | if (retval != -ENOSPC) | 1504 | if (retval != -ENOSPC) { |
1505 | brelse(bh); | ||
1518 | return retval; | 1506 | return retval; |
1507 | } | ||
1519 | 1508 | ||
1520 | if (blocks == 1 && !dx_fallback && | 1509 | if (blocks == 1 && !dx_fallback && |
1521 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) | 1510 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) |
@@ -1528,7 +1517,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
1528 | de = (struct ext4_dir_entry_2 *) bh->b_data; | 1517 | de = (struct ext4_dir_entry_2 *) bh->b_data; |
1529 | de->inode = 0; | 1518 | de->inode = 0; |
1530 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); | 1519 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); |
1531 | return add_dirent_to_buf(handle, dentry, inode, de, bh); | 1520 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
1521 | brelse(bh); | ||
1522 | return retval; | ||
1532 | } | 1523 | } |
1533 | 1524 | ||
1534 | /* | 1525 | /* |
@@ -1561,10 +1552,8 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | |||
1561 | goto journal_error; | 1552 | goto journal_error; |
1562 | 1553 | ||
1563 | err = add_dirent_to_buf(handle, dentry, inode, NULL, bh); | 1554 | err = add_dirent_to_buf(handle, dentry, inode, NULL, bh); |
1564 | if (err != -ENOSPC) { | 1555 | if (err != -ENOSPC) |
1565 | bh = NULL; | ||
1566 | goto cleanup; | 1556 | goto cleanup; |
1567 | } | ||
1568 | 1557 | ||
1569 | /* Block full, should compress but for now just split */ | 1558 | /* Block full, should compress but for now just split */ |
1570 | dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n", | 1559 | dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n", |
@@ -1580,8 +1569,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | |||
1580 | 1569 | ||
1581 | if (levels && (dx_get_count(frames->entries) == | 1570 | if (levels && (dx_get_count(frames->entries) == |
1582 | dx_get_limit(frames->entries))) { | 1571 | dx_get_limit(frames->entries))) { |
1583 | ext4_warning(sb, __func__, | 1572 | ext4_warning(sb, "Directory index full!"); |
1584 | "Directory index full!"); | ||
1585 | err = -ENOSPC; | 1573 | err = -ENOSPC; |
1586 | goto cleanup; | 1574 | goto cleanup; |
1587 | } | 1575 | } |
@@ -1657,7 +1645,6 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | |||
1657 | if (!de) | 1645 | if (!de) |
1658 | goto cleanup; | 1646 | goto cleanup; |
1659 | err = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1647 | err = add_dirent_to_buf(handle, dentry, inode, de, bh); |
1660 | bh = NULL; | ||
1661 | goto cleanup; | 1648 | goto cleanup; |
1662 | 1649 | ||
1663 | journal_error: | 1650 | journal_error: |
@@ -1772,10 +1759,12 @@ static int ext4_create(struct inode *dir, struct dentry *dentry, int mode, | |||
1772 | struct inode *inode; | 1759 | struct inode *inode; |
1773 | int err, retries = 0; | 1760 | int err, retries = 0; |
1774 | 1761 | ||
1762 | dquot_initialize(dir); | ||
1763 | |||
1775 | retry: | 1764 | retry: |
1776 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + | 1765 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + |
1777 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1766 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1778 | 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); | 1767 | EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); |
1779 | if (IS_ERR(handle)) | 1768 | if (IS_ERR(handle)) |
1780 | return PTR_ERR(handle); | 1769 | return PTR_ERR(handle); |
1781 | 1770 | ||
@@ -1806,10 +1795,12 @@ static int ext4_mknod(struct inode *dir, struct dentry *dentry, | |||
1806 | if (!new_valid_dev(rdev)) | 1795 | if (!new_valid_dev(rdev)) |
1807 | return -EINVAL; | 1796 | return -EINVAL; |
1808 | 1797 | ||
1798 | dquot_initialize(dir); | ||
1799 | |||
1809 | retry: | 1800 | retry: |
1810 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + | 1801 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + |
1811 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1802 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1812 | 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); | 1803 | EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); |
1813 | if (IS_ERR(handle)) | 1804 | if (IS_ERR(handle)) |
1814 | return PTR_ERR(handle); | 1805 | return PTR_ERR(handle); |
1815 | 1806 | ||
@@ -1843,10 +1834,12 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
1843 | if (EXT4_DIR_LINK_MAX(dir)) | 1834 | if (EXT4_DIR_LINK_MAX(dir)) |
1844 | return -EMLINK; | 1835 | return -EMLINK; |
1845 | 1836 | ||
1837 | dquot_initialize(dir); | ||
1838 | |||
1846 | retry: | 1839 | retry: |
1847 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + | 1840 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + |
1848 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1841 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1849 | 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); | 1842 | EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); |
1850 | if (IS_ERR(handle)) | 1843 | if (IS_ERR(handle)) |
1851 | return PTR_ERR(handle); | 1844 | return PTR_ERR(handle); |
1852 | 1845 | ||
@@ -1922,11 +1915,11 @@ static int empty_dir(struct inode *inode) | |||
1922 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || | 1915 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || |
1923 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { | 1916 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { |
1924 | if (err) | 1917 | if (err) |
1925 | ext4_error(inode->i_sb, __func__, | 1918 | ext4_error(inode->i_sb, |
1926 | "error %d reading directory #%lu offset 0", | 1919 | "error %d reading directory #%lu offset 0", |
1927 | err, inode->i_ino); | 1920 | err, inode->i_ino); |
1928 | else | 1921 | else |
1929 | ext4_warning(inode->i_sb, __func__, | 1922 | ext4_warning(inode->i_sb, |
1930 | "bad directory (dir #%lu) - no data block", | 1923 | "bad directory (dir #%lu) - no data block", |
1931 | inode->i_ino); | 1924 | inode->i_ino); |
1932 | return 1; | 1925 | return 1; |
@@ -1937,7 +1930,7 @@ static int empty_dir(struct inode *inode) | |||
1937 | !le32_to_cpu(de1->inode) || | 1930 | !le32_to_cpu(de1->inode) || |
1938 | strcmp(".", de->name) || | 1931 | strcmp(".", de->name) || |
1939 | strcmp("..", de1->name)) { | 1932 | strcmp("..", de1->name)) { |
1940 | ext4_warning(inode->i_sb, "empty_dir", | 1933 | ext4_warning(inode->i_sb, |
1941 | "bad directory (dir #%lu) - no `.' or `..'", | 1934 | "bad directory (dir #%lu) - no `.' or `..'", |
1942 | inode->i_ino); | 1935 | inode->i_ino); |
1943 | brelse(bh); | 1936 | brelse(bh); |
@@ -1955,7 +1948,7 @@ static int empty_dir(struct inode *inode) | |||
1955 | offset >> EXT4_BLOCK_SIZE_BITS(sb), 0, &err); | 1948 | offset >> EXT4_BLOCK_SIZE_BITS(sb), 0, &err); |
1956 | if (!bh) { | 1949 | if (!bh) { |
1957 | if (err) | 1950 | if (err) |
1958 | ext4_error(sb, __func__, | 1951 | ext4_error(sb, |
1959 | "error %d reading directory" | 1952 | "error %d reading directory" |
1960 | " #%lu offset %u", | 1953 | " #%lu offset %u", |
1961 | err, inode->i_ino, offset); | 1954 | err, inode->i_ino, offset); |
@@ -2026,11 +2019,18 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) | |||
2026 | err = ext4_reserve_inode_write(handle, inode, &iloc); | 2019 | err = ext4_reserve_inode_write(handle, inode, &iloc); |
2027 | if (err) | 2020 | if (err) |
2028 | goto out_unlock; | 2021 | goto out_unlock; |
2022 | /* | ||
2023 | * Due to previous errors inode may be already a part of on-disk | ||
2024 | * orphan list. If so skip on-disk list modification. | ||
2025 | */ | ||
2026 | if (NEXT_ORPHAN(inode) && NEXT_ORPHAN(inode) <= | ||
2027 | (le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count))) | ||
2028 | goto mem_insert; | ||
2029 | 2029 | ||
2030 | /* Insert this inode at the head of the on-disk orphan list... */ | 2030 | /* Insert this inode at the head of the on-disk orphan list... */ |
2031 | NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan); | 2031 | NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan); |
2032 | EXT4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); | 2032 | EXT4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); |
2033 | err = ext4_handle_dirty_metadata(handle, inode, EXT4_SB(sb)->s_sbh); | 2033 | err = ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); |
2034 | rc = ext4_mark_iloc_dirty(handle, inode, &iloc); | 2034 | rc = ext4_mark_iloc_dirty(handle, inode, &iloc); |
2035 | if (!err) | 2035 | if (!err) |
2036 | err = rc; | 2036 | err = rc; |
@@ -2043,6 +2043,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) | |||
2043 | * | 2043 | * |
2044 | * This is safe: on error we're going to ignore the orphan list | 2044 | * This is safe: on error we're going to ignore the orphan list |
2045 | * anyway on the next recovery. */ | 2045 | * anyway on the next recovery. */ |
2046 | mem_insert: | ||
2046 | if (!err) | 2047 | if (!err) |
2047 | list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan); | 2048 | list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan); |
2048 | 2049 | ||
@@ -2102,7 +2103,7 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode) | |||
2102 | if (err) | 2103 | if (err) |
2103 | goto out_brelse; | 2104 | goto out_brelse; |
2104 | sbi->s_es->s_last_orphan = cpu_to_le32(ino_next); | 2105 | sbi->s_es->s_last_orphan = cpu_to_le32(ino_next); |
2105 | err = ext4_handle_dirty_metadata(handle, inode, sbi->s_sbh); | 2106 | err = ext4_handle_dirty_metadata(handle, NULL, sbi->s_sbh); |
2106 | } else { | 2107 | } else { |
2107 | struct ext4_iloc iloc2; | 2108 | struct ext4_iloc iloc2; |
2108 | struct inode *i_prev = | 2109 | struct inode *i_prev = |
@@ -2142,7 +2143,9 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry) | |||
2142 | 2143 | ||
2143 | /* Initialize quotas before so that eventual writes go in | 2144 | /* Initialize quotas before so that eventual writes go in |
2144 | * separate transaction */ | 2145 | * separate transaction */ |
2145 | vfs_dq_init(dentry->d_inode); | 2146 | dquot_initialize(dir); |
2147 | dquot_initialize(dentry->d_inode); | ||
2148 | |||
2146 | handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb)); | 2149 | handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2147 | if (IS_ERR(handle)) | 2150 | if (IS_ERR(handle)) |
2148 | return PTR_ERR(handle); | 2151 | return PTR_ERR(handle); |
@@ -2169,7 +2172,7 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry) | |||
2169 | if (retval) | 2172 | if (retval) |
2170 | goto end_rmdir; | 2173 | goto end_rmdir; |
2171 | if (!EXT4_DIR_LINK_EMPTY(inode)) | 2174 | if (!EXT4_DIR_LINK_EMPTY(inode)) |
2172 | ext4_warning(inode->i_sb, "ext4_rmdir", | 2175 | ext4_warning(inode->i_sb, |
2173 | "empty directory has too many links (%d)", | 2176 | "empty directory has too many links (%d)", |
2174 | inode->i_nlink); | 2177 | inode->i_nlink); |
2175 | inode->i_version++; | 2178 | inode->i_version++; |
@@ -2201,7 +2204,9 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) | |||
2201 | 2204 | ||
2202 | /* Initialize quotas before so that eventual writes go | 2205 | /* Initialize quotas before so that eventual writes go |
2203 | * in separate transaction */ | 2206 | * in separate transaction */ |
2204 | vfs_dq_init(dentry->d_inode); | 2207 | dquot_initialize(dir); |
2208 | dquot_initialize(dentry->d_inode); | ||
2209 | |||
2205 | handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb)); | 2210 | handle = ext4_journal_start(dir, EXT4_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2206 | if (IS_ERR(handle)) | 2211 | if (IS_ERR(handle)) |
2207 | return PTR_ERR(handle); | 2212 | return PTR_ERR(handle); |
@@ -2221,7 +2226,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) | |||
2221 | goto end_unlink; | 2226 | goto end_unlink; |
2222 | 2227 | ||
2223 | if (!inode->i_nlink) { | 2228 | if (!inode->i_nlink) { |
2224 | ext4_warning(inode->i_sb, "ext4_unlink", | 2229 | ext4_warning(inode->i_sb, |
2225 | "Deleting nonexistent file (%lu), %d", | 2230 | "Deleting nonexistent file (%lu), %d", |
2226 | inode->i_ino, inode->i_nlink); | 2231 | inode->i_ino, inode->i_nlink); |
2227 | inode->i_nlink = 1; | 2232 | inode->i_nlink = 1; |
@@ -2256,10 +2261,12 @@ static int ext4_symlink(struct inode *dir, | |||
2256 | if (l > dir->i_sb->s_blocksize) | 2261 | if (l > dir->i_sb->s_blocksize) |
2257 | return -ENAMETOOLONG; | 2262 | return -ENAMETOOLONG; |
2258 | 2263 | ||
2264 | dquot_initialize(dir); | ||
2265 | |||
2259 | retry: | 2266 | retry: |
2260 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + | 2267 | handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + |
2261 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 5 + | 2268 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 5 + |
2262 | 2*EXT4_QUOTA_INIT_BLOCKS(dir->i_sb)); | 2269 | EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb)); |
2263 | if (IS_ERR(handle)) | 2270 | if (IS_ERR(handle)) |
2264 | return PTR_ERR(handle); | 2271 | return PTR_ERR(handle); |
2265 | 2272 | ||
@@ -2314,6 +2321,8 @@ static int ext4_link(struct dentry *old_dentry, | |||
2314 | if (inode->i_nlink >= EXT4_LINK_MAX) | 2321 | if (inode->i_nlink >= EXT4_LINK_MAX) |
2315 | return -EMLINK; | 2322 | return -EMLINK; |
2316 | 2323 | ||
2324 | dquot_initialize(dir); | ||
2325 | |||
2317 | /* | 2326 | /* |
2318 | * Return -ENOENT if we've raced with unlink and i_nlink is 0. Doing | 2327 | * Return -ENOENT if we've raced with unlink and i_nlink is 0. Doing |
2319 | * otherwise has the potential to corrupt the orphan inode list. | 2328 | * otherwise has the potential to corrupt the orphan inode list. |
@@ -2364,12 +2373,15 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2364 | struct ext4_dir_entry_2 *old_de, *new_de; | 2373 | struct ext4_dir_entry_2 *old_de, *new_de; |
2365 | int retval, force_da_alloc = 0; | 2374 | int retval, force_da_alloc = 0; |
2366 | 2375 | ||
2376 | dquot_initialize(old_dir); | ||
2377 | dquot_initialize(new_dir); | ||
2378 | |||
2367 | old_bh = new_bh = dir_bh = NULL; | 2379 | old_bh = new_bh = dir_bh = NULL; |
2368 | 2380 | ||
2369 | /* Initialize quotas before so that eventual writes go | 2381 | /* Initialize quotas before so that eventual writes go |
2370 | * in separate transaction */ | 2382 | * in separate transaction */ |
2371 | if (new_dentry->d_inode) | 2383 | if (new_dentry->d_inode) |
2372 | vfs_dq_init(new_dentry->d_inode); | 2384 | dquot_initialize(new_dentry->d_inode); |
2373 | handle = ext4_journal_start(old_dir, 2 * | 2385 | handle = ext4_journal_start(old_dir, 2 * |
2374 | EXT4_DATA_TRANS_BLOCKS(old_dir->i_sb) + | 2386 | EXT4_DATA_TRANS_BLOCKS(old_dir->i_sb) + |
2375 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2); | 2387 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2); |
@@ -2468,7 +2480,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2468 | } | 2480 | } |
2469 | } | 2481 | } |
2470 | if (retval) { | 2482 | if (retval) { |
2471 | ext4_warning(old_dir->i_sb, "ext4_rename", | 2483 | ext4_warning(old_dir->i_sb, |
2472 | "Deleting old file (%lu), %d, error=%d", | 2484 | "Deleting old file (%lu), %d, error=%d", |
2473 | old_dir->i_ino, old_dir->i_nlink, retval); | 2485 | old_dir->i_ino, old_dir->i_nlink, retval); |
2474 | } | 2486 | } |