diff options
| -rw-r--r-- | fs/xfs/xfs_ioctl32.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_itable.c | 68 |
2 files changed, 32 insertions, 38 deletions
diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index e65ea67e3ae3..cf63418bf05f 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c | |||
| @@ -102,7 +102,7 @@ xfs_compat_growfs_rt_copyin( | |||
| 102 | STATIC int | 102 | STATIC int |
| 103 | xfs_inumbers_fmt_compat( | 103 | xfs_inumbers_fmt_compat( |
| 104 | void __user *ubuffer, | 104 | void __user *ubuffer, |
| 105 | const xfs_inogrp_t *buffer, | 105 | const struct xfs_inogrp *buffer, |
| 106 | long count, | 106 | long count, |
| 107 | long *written) | 107 | long *written) |
| 108 | { | 108 | { |
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index e15df1f70d79..df7605183aa2 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
| @@ -512,7 +512,7 @@ xfs_bulkstat( | |||
| 512 | int | 512 | int |
| 513 | xfs_inumbers_fmt( | 513 | xfs_inumbers_fmt( |
| 514 | void __user *ubuffer, /* buffer to write to */ | 514 | void __user *ubuffer, /* buffer to write to */ |
| 515 | const xfs_inogrp_t *buffer, /* buffer to read from */ | 515 | const struct xfs_inogrp *buffer, /* buffer to read from */ |
| 516 | long count, /* # of elements to read */ | 516 | long count, /* # of elements to read */ |
| 517 | long *written) /* # of bytes written */ | 517 | long *written) /* # of bytes written */ |
| 518 | { | 518 | { |
| @@ -527,37 +527,33 @@ xfs_inumbers_fmt( | |||
| 527 | */ | 527 | */ |
| 528 | int /* error status */ | 528 | int /* error status */ |
| 529 | xfs_inumbers( | 529 | xfs_inumbers( |
| 530 | xfs_mount_t *mp, /* mount point for filesystem */ | 530 | struct xfs_mount *mp,/* mount point for filesystem */ |
| 531 | xfs_ino_t *lastino, /* last inode returned */ | 531 | xfs_ino_t *lastino,/* last inode returned */ |
| 532 | int *count, /* size of buffer/count returned */ | 532 | int *count,/* size of buffer/count returned */ |
| 533 | void __user *ubuffer,/* buffer with inode descriptions */ | 533 | void __user *ubuffer,/* buffer with inode descriptions */ |
| 534 | inumbers_fmt_pf formatter) | 534 | inumbers_fmt_pf formatter) |
| 535 | { | 535 | { |
| 536 | xfs_buf_t *agbp; | 536 | xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, *lastino); |
| 537 | xfs_agino_t agino; | 537 | xfs_agino_t agino = XFS_INO_TO_AGINO(mp, *lastino); |
| 538 | xfs_agnumber_t agno; | 538 | struct xfs_btree_cur *cur = NULL; |
| 539 | int bcount; | 539 | xfs_buf_t *agbp = NULL; |
| 540 | xfs_inogrp_t *buffer; | 540 | struct xfs_inogrp *buffer; |
| 541 | int bufidx; | 541 | int bcount; |
| 542 | xfs_btree_cur_t *cur; | 542 | int left = *count; |
| 543 | int error; | 543 | int bufidx = 0; |
| 544 | xfs_inobt_rec_incore_t r; | 544 | int error = 0; |
| 545 | int i; | 545 | |
| 546 | xfs_ino_t ino; | ||
| 547 | int left; | ||
| 548 | int tmp; | ||
| 549 | |||
| 550 | ino = (xfs_ino_t)*lastino; | ||
| 551 | agno = XFS_INO_TO_AGNO(mp, ino); | ||
| 552 | agino = XFS_INO_TO_AGINO(mp, ino); | ||
| 553 | left = *count; | ||
| 554 | *count = 0; | 546 | *count = 0; |
| 547 | if (agno >= mp->m_sb.sb_agcount || | ||
| 548 | *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) | ||
| 549 | return error; | ||
| 550 | |||
| 555 | bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); | 551 | bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); |
| 556 | buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); | 552 | buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); |
| 557 | error = bufidx = 0; | ||
| 558 | cur = NULL; | ||
| 559 | agbp = NULL; | ||
| 560 | while (left > 0 && agno < mp->m_sb.sb_agcount) { | 553 | while (left > 0 && agno < mp->m_sb.sb_agcount) { |
| 554 | struct xfs_inobt_rec_incore r; | ||
| 555 | int stat; | ||
| 556 | |||
| 561 | if (agbp == NULL) { | 557 | if (agbp == NULL) { |
| 562 | error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); | 558 | error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); |
| 563 | if (error) { | 559 | if (error) { |
| @@ -574,7 +570,7 @@ xfs_inumbers( | |||
| 574 | cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, | 570 | cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, |
| 575 | XFS_BTNUM_INO); | 571 | XFS_BTNUM_INO); |
| 576 | error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, | 572 | error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, |
| 577 | &tmp); | 573 | &stat); |
| 578 | if (error) { | 574 | if (error) { |
| 579 | xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); | 575 | xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); |
| 580 | cur = NULL; | 576 | cur = NULL; |
| @@ -589,8 +585,8 @@ xfs_inumbers( | |||
| 589 | continue; | 585 | continue; |
| 590 | } | 586 | } |
| 591 | } | 587 | } |
| 592 | error = xfs_inobt_get_rec(cur, &r, &i); | 588 | error = xfs_inobt_get_rec(cur, &r, &stat); |
| 593 | if (error || i == 0) { | 589 | if (error || stat == 0) { |
| 594 | xfs_buf_relse(agbp); | 590 | xfs_buf_relse(agbp); |
| 595 | agbp = NULL; | 591 | agbp = NULL; |
| 596 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); | 592 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); |
| @@ -609,16 +605,15 @@ xfs_inumbers( | |||
| 609 | left--; | 605 | left--; |
| 610 | if (bufidx == bcount) { | 606 | if (bufidx == bcount) { |
| 611 | long written; | 607 | long written; |
| 612 | if (formatter(ubuffer, buffer, bufidx, &written)) { | 608 | error = formatter(ubuffer, buffer, bufidx, &written); |
| 613 | error = -EFAULT; | 609 | if (error) |
| 614 | break; | 610 | break; |
| 615 | } | ||
| 616 | ubuffer += written; | 611 | ubuffer += written; |
| 617 | *count += bufidx; | 612 | *count += bufidx; |
| 618 | bufidx = 0; | 613 | bufidx = 0; |
| 619 | } | 614 | } |
| 620 | if (left) { | 615 | if (left) { |
| 621 | error = xfs_btree_increment(cur, 0, &tmp); | 616 | error = xfs_btree_increment(cur, 0, &stat); |
| 622 | if (error) { | 617 | if (error) { |
| 623 | xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); | 618 | xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); |
| 624 | cur = NULL; | 619 | cur = NULL; |
| @@ -636,9 +631,8 @@ xfs_inumbers( | |||
| 636 | if (!error) { | 631 | if (!error) { |
| 637 | if (bufidx) { | 632 | if (bufidx) { |
| 638 | long written; | 633 | long written; |
| 639 | if (formatter(ubuffer, buffer, bufidx, &written)) | 634 | error = formatter(ubuffer, buffer, bufidx, &written); |
| 640 | error = -EFAULT; | 635 | if (!error) |
| 641 | else | ||
| 642 | *count += bufidx; | 636 | *count += bufidx; |
| 643 | } | 637 | } |
| 644 | *lastino = XFS_AGINO_TO_INO(mp, agno, agino); | 638 | *lastino = XFS_AGINO_TO_INO(mp, agno, agino); |
