aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/dir.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
index c32f7b3de662..65871a2b460e 100644
--- a/fs/gfs2/dir.c
+++ b/fs/gfs2/dir.c
@@ -417,6 +417,12 @@ static int dirent_next(struct gfs2_inode *dip, struct buffer_head *bh,
417 gfs2_consist_inode(dip); 417 gfs2_consist_inode(dip);
418 return -EIO; 418 return -EIO;
419 } 419 }
420
421 if (cur_rec_len == 0) {
422 gfs2_consist_inode(dip);
423 return -EIO;
424 }
425
420 /* Only the first dent could ever have de_inum.no_addr == 0 */ 426 /* Only the first dent could ever have de_inum.no_addr == 0 */
421 if (!tmp->de_inum.no_addr) { 427 if (!tmp->de_inum.no_addr) {
422 gfs2_consist_inode(dip); 428 gfs2_consist_inode(dip);
@@ -512,9 +518,8 @@ int gfs2_dirent_alloc(struct gfs2_inode *dip, struct buffer_head *bh,
512 518
513 gfs2_trans_add_bh(dip->i_gl, bh, 1); 519 gfs2_trans_add_bh(dip->i_gl, bh, 1);
514 520
515 dent->de_rec_len = bh->b_size - offset; 521 dent->de_rec_len = cpu_to_be16(bh->b_size - offset);
516 dent->de_rec_len = cpu_to_be16(dent->de_rec_len); 522 dent->de_name_len = cpu_to_be16(name_len);
517 dent->de_name_len = name_len;
518 523
519 *dent_out = dent; 524 *dent_out = dent;
520 return 0; 525 return 0;
@@ -522,10 +527,10 @@ int gfs2_dirent_alloc(struct gfs2_inode *dip, struct buffer_head *bh,
522 527
523 do { 528 do {
524 uint16_t cur_rec_len; 529 uint16_t cur_rec_len;
525 uint32_t cur_name_len; 530 uint16_t cur_name_len;
526 531
527 cur_rec_len = be16_to_cpu(dent->de_rec_len); 532 cur_rec_len = be16_to_cpu(dent->de_rec_len);
528 cur_name_len = dent->de_name_len; 533 cur_name_len = be16_to_cpu(dent->de_name_len);
529 534
530 if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) || 535 if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) ||
531 (cur_rec_len >= GFS2_DIRENT_SIZE(cur_name_len) + rec_len)) { 536 (cur_rec_len >= GFS2_DIRENT_SIZE(cur_name_len) + rec_len)) {
@@ -536,18 +541,16 @@ int gfs2_dirent_alloc(struct gfs2_inode *dip, struct buffer_head *bh,
536 GFS2_DIRENT_SIZE(cur_name_len)); 541 GFS2_DIRENT_SIZE(cur_name_len));
537 memset(new, 0, sizeof(struct gfs2_dirent)); 542 memset(new, 0, sizeof(struct gfs2_dirent));
538 543
539 new->de_rec_len = cur_rec_len - GFS2_DIRENT_SIZE(cur_name_len); 544 new->de_rec_len = cpu_to_be16(cur_rec_len - GFS2_DIRENT_SIZE(cur_name_len));
540 new->de_rec_len = cpu_to_be16(new->de_rec_len); 545 new->de_name_len = cpu_to_be16(name_len);
541 new->de_name_len = name_len;
542 546
543 dent->de_rec_len = cur_rec_len - be16_to_cpu(new->de_rec_len); 547 dent->de_rec_len = cpu_to_be16(cur_rec_len - be16_to_cpu(new->de_rec_len));
544 dent->de_rec_len = cpu_to_be16(dent->de_rec_len);
545 548
546 *dent_out = new; 549 *dent_out = new;
547 return 0; 550 return 0;
548 } 551 }
549 552
550 dent->de_name_len = name_len; 553 dent->de_name_len = cpu_to_be16(name_len);
551 554
552 *dent_out = dent; 555 *dent_out = dent;
553 return 0; 556 return 0;
@@ -594,7 +597,7 @@ static int dirent_fits(struct gfs2_inode *dip, struct buffer_head *bh,
594 uint32_t cur_name_len; 597 uint32_t cur_name_len;
595 598
596 cur_rec_len = be16_to_cpu(dent->de_rec_len); 599 cur_rec_len = be16_to_cpu(dent->de_rec_len);
597 cur_name_len = dent->de_name_len; 600 cur_name_len = be16_to_cpu(dent->de_name_len);
598 601
599 if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) || 602 if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) ||
600 (cur_rec_len >= GFS2_DIRENT_SIZE(cur_name_len) + rec_len)) 603 (cur_rec_len >= GFS2_DIRENT_SIZE(cur_name_len) + rec_len))
@@ -635,7 +638,7 @@ static int leaf_search(struct gfs2_inode *dip, struct buffer_head *bh,
635 638
636 if (be32_to_cpu(dent->de_hash) == hash && 639 if (be32_to_cpu(dent->de_hash) == hash &&
637 gfs2_filecmp(filename, (char *)(dent + 1), 640 gfs2_filecmp(filename, (char *)(dent + 1),
638 dent->de_name_len)) { 641 be16_to_cpu(dent->de_name_len))) {
639 *dent_out = dent; 642 *dent_out = dent;
640 if (dent_prev) 643 if (dent_prev)
641 *dent_prev = prev; 644 *dent_prev = prev;
@@ -834,10 +837,9 @@ static int dir_make_exhash(struct gfs2_inode *dip)
834 /* Adjust the last dirent's record length 837 /* Adjust the last dirent's record length
835 (Remember that dent still points to the last entry.) */ 838 (Remember that dent still points to the last entry.) */
836 839
837 dent->de_rec_len = be16_to_cpu(dent->de_rec_len) + 840 dent->de_rec_len = cpu_to_be16(be16_to_cpu(dent->de_rec_len) +
838 sizeof(struct gfs2_dinode) - 841 sizeof(struct gfs2_dinode) -
839 sizeof(struct gfs2_leaf); 842 sizeof(struct gfs2_leaf));
840 dent->de_rec_len = cpu_to_be16(dent->de_rec_len);
841 843
842 brelse(bh); 844 brelse(bh);
843 845
@@ -969,7 +971,7 @@ static int dir_split_leaf(struct gfs2_inode *dip, uint32_t index,
969 971
970 if (dent->de_inum.no_addr && 972 if (dent->de_inum.no_addr &&
971 be32_to_cpu(dent->de_hash) < divider) { 973 be32_to_cpu(dent->de_hash) < divider) {
972 name_len = dent->de_name_len; 974 name_len = be16_to_cpu(dent->de_name_len);
973 975
974 gfs2_dirent_alloc(dip, nbh, name_len, &new); 976 gfs2_dirent_alloc(dip, nbh, name_len, &new);
975 977
@@ -1139,8 +1141,8 @@ static int compare_dents(const void *a, const void *b)
1139 else if (hash_a < hash_b) 1141 else if (hash_a < hash_b)
1140 ret = -1; 1142 ret = -1;
1141 else { 1143 else {
1142 unsigned int len_a = dent_a->de_name_len; 1144 unsigned int len_a = be16_to_cpu(dent_a->de_name_len);
1143 unsigned int len_b = dent_b->de_name_len; 1145 unsigned int len_b = be16_to_cpu(dent_b->de_name_len);
1144 1146
1145 if (len_a > len_b) 1147 if (len_a > len_b)
1146 ret = 1; 1148 ret = 1;
@@ -1219,9 +1221,9 @@ static int do_filldir_main(struct gfs2_inode *dip, uint64_t *offset,
1219 gfs2_inum_in(&inum, (char *)&dent->de_inum); 1221 gfs2_inum_in(&inum, (char *)&dent->de_inum);
1220 1222
1221 error = filldir(opaque, (char *)(dent + 1), 1223 error = filldir(opaque, (char *)(dent + 1),
1222 dent->de_name_len, 1224 be16_to_cpu(dent->de_name_len),
1223 off, &inum, 1225 off, &inum,
1224 dent->de_type); 1226 be16_to_cpu(dent->de_type));
1225 if (error) 1227 if (error)
1226 return 1; 1228 return 1;
1227 1229
@@ -1454,7 +1456,7 @@ static int dir_e_search(struct gfs2_inode *dip, struct qstr *filename,
1454 if (inum) 1456 if (inum)
1455 gfs2_inum_in(inum, (char *)&dent->de_inum); 1457 gfs2_inum_in(inum, (char *)&dent->de_inum);
1456 if (type) 1458 if (type)
1457 *type = dent->de_type; 1459 *type = be16_to_cpu(dent->de_type);
1458 1460
1459 brelse(bh); 1461 brelse(bh);
1460 1462
@@ -1563,7 +1565,7 @@ static int dir_e_add(struct gfs2_inode *dip, struct qstr *filename,
1563 1565
1564 gfs2_inum_out(inum, (char *)&dent->de_inum); 1566 gfs2_inum_out(inum, (char *)&dent->de_inum);
1565 dent->de_hash = cpu_to_be32(hash); 1567 dent->de_hash = cpu_to_be32(hash);
1566 dent->de_type = type; 1568 dent->de_type = cpu_to_be16(type);
1567 memcpy((char *)(dent + 1), filename->name, filename->len); 1569 memcpy((char *)(dent + 1), filename->name, filename->len);
1568 1570
1569 leaf->lf_entries = be16_to_cpu(leaf->lf_entries) + 1; 1571 leaf->lf_entries = be16_to_cpu(leaf->lf_entries) + 1;
@@ -1732,7 +1734,7 @@ static int dir_e_mvino(struct gfs2_inode *dip, struct qstr *filename,
1732 gfs2_trans_add_bh(dip->i_gl, bh, 1); 1734 gfs2_trans_add_bh(dip->i_gl, bh, 1);
1733 1735
1734 gfs2_inum_out(inum, (char *)&dent->de_inum); 1736 gfs2_inum_out(inum, (char *)&dent->de_inum);
1735 dent->de_type = new_type; 1737 dent->de_type = cpu_to_be16(new_type);
1736 1738
1737 brelse(bh); 1739 brelse(bh);
1738 1740
@@ -1780,7 +1782,7 @@ static int dir_l_search(struct gfs2_inode *dip, struct qstr *filename,
1780 if (inum) 1782 if (inum)
1781 gfs2_inum_in(inum, (char *)&dent->de_inum); 1783 gfs2_inum_in(inum, (char *)&dent->de_inum);
1782 if (type) 1784 if (type)
1783 *type = dent->de_type; 1785 *type = be16_to_cpu(dent->de_type);
1784 } 1786 }
1785 1787
1786 brelse(dibh); 1788 brelse(dibh);
@@ -1819,7 +1821,7 @@ static int dir_l_add(struct gfs2_inode *dip, struct qstr *filename,
1819 gfs2_inum_out(inum, (char *)&dent->de_inum); 1821 gfs2_inum_out(inum, (char *)&dent->de_inum);
1820 dent->de_hash = gfs2_disk_hash(filename->name, filename->len); 1822 dent->de_hash = gfs2_disk_hash(filename->name, filename->len);
1821 dent->de_hash = cpu_to_be32(dent->de_hash); 1823 dent->de_hash = cpu_to_be32(dent->de_hash);
1822 dent->de_type = type; 1824 dent->de_type = cpu_to_be16(type);
1823 memcpy((char *)(dent + 1), filename->name, filename->len); 1825 memcpy((char *)(dent + 1), filename->name, filename->len);
1824 1826
1825 dip->i_di.di_entries++; 1827 dip->i_di.di_entries++;
@@ -1932,7 +1934,7 @@ static int dir_l_mvino(struct gfs2_inode *dip, struct qstr *filename,
1932 gfs2_trans_add_bh(dip->i_gl, dibh, 1); 1934 gfs2_trans_add_bh(dip->i_gl, dibh, 1);
1933 1935
1934 gfs2_inum_out(inum, (char *)&dent->de_inum); 1936 gfs2_inum_out(inum, (char *)&dent->de_inum);
1935 dent->de_type = new_type; 1937 dent->de_type = cpu_to_be16(new_type);
1936 1938
1937 dip->i_di.di_mtime = dip->i_di.di_ctime = get_seconds(); 1939 dip->i_di.di_mtime = dip->i_di.di_ctime = get_seconds();
1938 1940