diff options
Diffstat (limited to 'fs/xfs/xfs_symlink.c')
| -rw-r--r-- | fs/xfs/xfs_symlink.c | 20 |
1 files changed, 6 insertions, 14 deletions
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 5f234389327c..195a403e1522 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c | |||
| @@ -56,16 +56,9 @@ xfs_symlink_blocks( | |||
| 56 | struct xfs_mount *mp, | 56 | struct xfs_mount *mp, |
| 57 | int pathlen) | 57 | int pathlen) |
| 58 | { | 58 | { |
| 59 | int fsblocks = 0; | 59 | int buflen = XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); |
| 60 | int len = pathlen; | ||
| 61 | 60 | ||
| 62 | do { | 61 | return (pathlen + buflen - 1) / buflen; |
| 63 | fsblocks++; | ||
| 64 | len -= XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); | ||
| 65 | } while (len > 0); | ||
| 66 | |||
| 67 | ASSERT(fsblocks <= XFS_SYMLINK_MAPS); | ||
| 68 | return fsblocks; | ||
| 69 | } | 62 | } |
| 70 | 63 | ||
| 71 | static int | 64 | static int |
| @@ -405,7 +398,7 @@ xfs_symlink( | |||
| 405 | if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) | 398 | if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) |
| 406 | fs_blocks = 0; | 399 | fs_blocks = 0; |
| 407 | else | 400 | else |
| 408 | fs_blocks = XFS_B_TO_FSB(mp, pathlen); | 401 | fs_blocks = xfs_symlink_blocks(mp, pathlen); |
| 409 | resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); | 402 | resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); |
| 410 | error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, | 403 | error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, |
| 411 | XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); | 404 | XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); |
| @@ -512,7 +505,7 @@ xfs_symlink( | |||
| 512 | cur_chunk = target_path; | 505 | cur_chunk = target_path; |
| 513 | offset = 0; | 506 | offset = 0; |
| 514 | for (n = 0; n < nmaps; n++) { | 507 | for (n = 0; n < nmaps; n++) { |
| 515 | char *buf; | 508 | char *buf; |
| 516 | 509 | ||
| 517 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); | 510 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); |
| 518 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); | 511 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); |
| @@ -525,9 +518,7 @@ xfs_symlink( | |||
| 525 | bp->b_ops = &xfs_symlink_buf_ops; | 518 | bp->b_ops = &xfs_symlink_buf_ops; |
| 526 | 519 | ||
| 527 | byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); | 520 | byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); |
| 528 | if (pathlen < byte_cnt) { | 521 | byte_cnt = min(byte_cnt, pathlen); |
| 529 | byte_cnt = pathlen; | ||
| 530 | } | ||
| 531 | 522 | ||
| 532 | buf = bp->b_addr; | 523 | buf = bp->b_addr; |
| 533 | buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, | 524 | buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, |
| @@ -542,6 +533,7 @@ xfs_symlink( | |||
| 542 | xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - | 533 | xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - |
| 543 | (char *)bp->b_addr); | 534 | (char *)bp->b_addr); |
| 544 | } | 535 | } |
| 536 | ASSERT(pathlen == 0); | ||
| 545 | } | 537 | } |
| 546 | 538 | ||
| 547 | /* | 539 | /* |
