aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Chinner <dgc@sgi.com>2007-06-18 02:50:37 -0400
committerTim Shimmin <tes@chook.melbourne.sgi.com>2007-07-14 01:35:36 -0400
commit957d0ebed04239b734552c7da3fae9094b6f090c (patch)
tree6f5034b22028a03e31771d1a3fa5ad8d59557c09
parent84e1e99f112dead8f9ba036c02d24a9f5ce7f544 (diff)
[XFS] Cleanup inode extent size hint extraction
SGI-PV: 966004 SGI-Modid: xfs-linux-melb:xfs-kern:28866a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Tim Shimmin <tes@sgi.com>
-rw-r--r--fs/xfs/xfs_bmap.c23
-rw-r--r--fs/xfs/xfs_iomap.c19
-rw-r--r--fs/xfs/xfs_rw.h22
-rw-r--r--fs/xfs/xfs_vnodeops.c17
4 files changed, 38 insertions, 43 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index 9a654faf0c08..183add2f21b7 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -2609,8 +2609,7 @@ xfs_bmap_rtalloc(
2609 xfs_rtblock_t rtb; 2609 xfs_rtblock_t rtb;
2610 2610
2611 mp = ap->ip->i_mount; 2611 mp = ap->ip->i_mount;
2612 align = ap->ip->i_d.di_extsize ? 2612 align = xfs_get_extsz_hint(ap->ip);
2613 ap->ip->i_d.di_extsize : mp->m_sb.sb_rextsize;
2614 prod = align / mp->m_sb.sb_rextsize; 2613 prod = align / mp->m_sb.sb_rextsize;
2615 error = xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp, 2614 error = xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp,
2616 align, 1, ap->eof, 0, 2615 align, 1, ap->eof, 0,
@@ -2715,9 +2714,7 @@ xfs_bmap_btalloc(
2715 int error; 2714 int error;
2716 2715
2717 mp = ap->ip->i_mount; 2716 mp = ap->ip->i_mount;
2718 align = (ap->userdata && ap->ip->i_d.di_extsize && 2717 align = ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0;
2719 (ap->ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE)) ?
2720 ap->ip->i_d.di_extsize : 0;
2721 if (unlikely(align)) { 2718 if (unlikely(align)) {
2722 error = xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp, 2719 error = xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp,
2723 align, 0, ap->eof, 0, ap->conv, 2720 align, 0, ap->eof, 0, ap->conv,
@@ -2817,9 +2814,9 @@ xfs_bmap_btalloc(
2817 args.total = ap->total; 2814 args.total = ap->total;
2818 args.minlen = ap->minlen; 2815 args.minlen = ap->minlen;
2819 } 2816 }
2820 if (unlikely(ap->userdata && ap->ip->i_d.di_extsize && 2817 /* apply extent size hints if obtained earlier */
2821 (ap->ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE))) { 2818 if (unlikely(align)) {
2822 args.prod = ap->ip->i_d.di_extsize; 2819 args.prod = align;
2823 if ((args.mod = (xfs_extlen_t)do_mod(ap->off, args.prod))) 2820 if ((args.mod = (xfs_extlen_t)do_mod(ap->off, args.prod)))
2824 args.mod = (xfs_extlen_t)(args.prod - args.mod); 2821 args.mod = (xfs_extlen_t)(args.prod - args.mod);
2825 } else if (mp->m_sb.sb_blocksize >= NBPP) { 2822 } else if (mp->m_sb.sb_blocksize >= NBPP) {
@@ -4868,12 +4865,7 @@ xfs_bmapi(
4868 xfs_extlen_t extsz; 4865 xfs_extlen_t extsz;
4869 4866
4870 /* Figure out the extent size, adjust alen */ 4867 /* Figure out the extent size, adjust alen */
4871 if (rt) { 4868 extsz = xfs_get_extsz_hint(ip);
4872 if (!(extsz = ip->i_d.di_extsize))
4873 extsz = mp->m_sb.sb_rextsize;
4874 } else {
4875 extsz = ip->i_d.di_extsize;
4876 }
4877 if (extsz) { 4869 if (extsz) {
4878 error = xfs_bmap_extsize_align(mp, 4870 error = xfs_bmap_extsize_align(mp,
4879 &got, &prev, extsz, 4871 &got, &prev, extsz,
@@ -5813,8 +5805,7 @@ xfs_getbmap(
5813 ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) 5805 ip->i_d.di_format != XFS_DINODE_FMT_LOCAL)
5814 return XFS_ERROR(EINVAL); 5806 return XFS_ERROR(EINVAL);
5815 if (whichfork == XFS_DATA_FORK) { 5807 if (whichfork == XFS_DATA_FORK) {
5816 if ((ip->i_d.di_extsize && (ip->i_d.di_flags & 5808 if (xfs_get_extsz_hint(ip) ||
5817 (XFS_DIFLAG_REALTIME|XFS_DIFLAG_EXTSIZE))) ||
5818 ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC|XFS_DIFLAG_APPEND)){ 5809 ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC|XFS_DIFLAG_APPEND)){
5819 prealloced = 1; 5810 prealloced = 1;
5820 fixlen = XFS_MAXIOFFSET(mp); 5811 fixlen = XFS_MAXIOFFSET(mp);
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index ab5062199f55..bf57b75acb90 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -451,19 +451,14 @@ xfs_iomap_write_direct(
451 return XFS_ERROR(error); 451 return XFS_ERROR(error);
452 452
453 rt = XFS_IS_REALTIME_INODE(ip); 453 rt = XFS_IS_REALTIME_INODE(ip);
454 if (unlikely(rt)) { 454 extsz = xfs_get_extsz_hint(ip);
455 if (!(extsz = ip->i_d.di_extsize))
456 extsz = mp->m_sb.sb_rextsize;
457 } else {
458 extsz = ip->i_d.di_extsize;
459 }
460 455
461 isize = ip->i_size; 456 isize = ip->i_size;
462 if (io->io_new_size > isize) 457 if (io->io_new_size > isize)
463 isize = io->io_new_size; 458 isize = io->io_new_size;
464 459
465 offset_fsb = XFS_B_TO_FSBT(mp, offset); 460 offset_fsb = XFS_B_TO_FSBT(mp, offset);
466 last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); 461 last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count)));
467 if ((offset + count) > isize) { 462 if ((offset + count) > isize) {
468 error = xfs_iomap_eof_align_last_fsb(mp, io, isize, extsz, 463 error = xfs_iomap_eof_align_last_fsb(mp, io, isize, extsz,
469 &last_fsb); 464 &last_fsb);
@@ -666,13 +661,7 @@ xfs_iomap_write_delay(
666 if (error) 661 if (error)
667 return XFS_ERROR(error); 662 return XFS_ERROR(error);
668 663
669 if (XFS_IS_REALTIME_INODE(ip)) { 664 extsz = xfs_get_extsz_hint(ip);
670 if (!(extsz = ip->i_d.di_extsize))
671 extsz = mp->m_sb.sb_rextsize;
672 } else {
673 extsz = ip->i_d.di_extsize;
674 }
675
676 offset_fsb = XFS_B_TO_FSBT(mp, offset); 665 offset_fsb = XFS_B_TO_FSBT(mp, offset);
677 666
678retry: 667retry:
diff --git a/fs/xfs/xfs_rw.h b/fs/xfs/xfs_rw.h
index ba74000931ec..fcf28dbded7c 100644
--- a/fs/xfs/xfs_rw.h
+++ b/fs/xfs/xfs_rw.h
@@ -77,6 +77,28 @@ xfs_fsb_to_db_io(struct xfs_iocore *io, xfs_fsblock_t fsb)
77#define XFS_FREE_EOF_LOCK (1<<0) 77#define XFS_FREE_EOF_LOCK (1<<0)
78#define XFS_FREE_EOF_NOLOCK (1<<1) 78#define XFS_FREE_EOF_NOLOCK (1<<1)
79 79
80
81/*
82 * helper function to extract extent size hint from inode
83 */
84STATIC_INLINE xfs_extlen_t
85xfs_get_extsz_hint(
86 xfs_inode_t *ip)
87{
88 xfs_extlen_t extsz;
89
90 if (unlikely(ip->i_d.di_flags & XFS_DIFLAG_REALTIME)) {
91 extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE)
92 ? ip->i_d.di_extsize
93 : ip->i_mount->m_sb.sb_rextsize;
94 ASSERT(extsz);
95 } else {
96 extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE)
97 ? ip->i_d.di_extsize : 0;
98 }
99 return extsz;
100}
101
80/* 102/*
81 * Prototypes for functions in xfs_rw.c. 103 * Prototypes for functions in xfs_rw.c.
82 */ 104 */
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index 6420ca8df5ec..8c830a48165a 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -183,9 +183,8 @@ xfs_getattr(
183 * realtime extent size or the realtime volume's 183 * realtime extent size or the realtime volume's
184 * extent size. 184 * extent size.
185 */ 185 */
186 vap->va_blocksize = ip->i_d.di_extsize ? 186 vap->va_blocksize =
187 (ip->i_d.di_extsize << mp->m_sb.sb_blocklog) : 187 xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
188 (mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog);
189 } 188 }
190 break; 189 break;
191 } 190 }
@@ -4055,22 +4054,16 @@ xfs_alloc_file_space(
4055 if (XFS_FORCED_SHUTDOWN(mp)) 4054 if (XFS_FORCED_SHUTDOWN(mp))
4056 return XFS_ERROR(EIO); 4055 return XFS_ERROR(EIO);
4057 4056
4058 rt = XFS_IS_REALTIME_INODE(ip);
4059 if (unlikely(rt)) {
4060 if (!(extsz = ip->i_d.di_extsize))
4061 extsz = mp->m_sb.sb_rextsize;
4062 } else {
4063 extsz = ip->i_d.di_extsize;
4064 }
4065
4066 if ((error = XFS_QM_DQATTACH(mp, ip, 0))) 4057 if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
4067 return error; 4058 return error;
4068 4059
4069 if (len <= 0) 4060 if (len <= 0)
4070 return XFS_ERROR(EINVAL); 4061 return XFS_ERROR(EINVAL);
4071 4062
4063 rt = XFS_IS_REALTIME_INODE(ip);
4064 extsz = xfs_get_extsz_hint(ip);
4065
4072 count = len; 4066 count = len;
4073 error = 0;
4074 imapp = &imaps[0]; 4067 imapp = &imaps[0];
4075 nimaps = 1; 4068 nimaps = 1;
4076 bmapi_flag = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0); 4069 bmapi_flag = XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : 0);