diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-25 14:47:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-25 14:47:06 -0400 |
commit | e1d33a5c634bcf5f944034a2127c0026308c005c (patch) | |
tree | 08b42bfb5255e7234d1cfa639850732cb817bd2e /fs | |
parent | 2432cbe4f29fbb8d349e481695ac6e88b884bacb (diff) | |
parent | a672e1be30d5bc848cd0067c55ed29b2015b7c17 (diff) |
Merge tag 'for-linus-v3.6-rc4' of git://oss.sgi.com/xfs/xfs
Pull xfs bugfixes from Ben Myers:
- fix uninitialised variable in xfs_rtbuf_get()
- unlock the AGI buffer when looping in xfs_dialloc
- check for possible overflow in xfs_ioc_trim
* tag 'for-linus-v3.6-rc4' of git://oss.sgi.com/xfs/xfs:
xfs: check for possible overflow in xfs_ioc_trim
xfs: unlock the AGI buffer when looping in xfs_dialloc
xfs: fix uninitialised variable in xfs_rtbuf_get()
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_discard.c | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_ialloc.c | 17 | ||||
-rw-r--r-- | fs/xfs/xfs_rtalloc.c | 2 |
3 files changed, 14 insertions, 11 deletions
diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index f9c3fe304a17..69cf4fcde03e 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c | |||
@@ -179,12 +179,14 @@ xfs_ioc_trim( | |||
179 | * used by the fstrim application. In the end it really doesn't | 179 | * used by the fstrim application. In the end it really doesn't |
180 | * matter as trimming blocks is an advisory interface. | 180 | * matter as trimming blocks is an advisory interface. |
181 | */ | 181 | */ |
182 | if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || | ||
183 | range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp))) | ||
184 | return -XFS_ERROR(EINVAL); | ||
185 | |||
182 | start = BTOBB(range.start); | 186 | start = BTOBB(range.start); |
183 | end = start + BTOBBT(range.len) - 1; | 187 | end = start + BTOBBT(range.len) - 1; |
184 | minlen = BTOBB(max_t(u64, granularity, range.minlen)); | 188 | minlen = BTOBB(max_t(u64, granularity, range.minlen)); |
185 | 189 | ||
186 | if (XFS_BB_TO_FSB(mp, start) >= mp->m_sb.sb_dblocks) | ||
187 | return -XFS_ERROR(EINVAL); | ||
188 | if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1) | 190 | if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1) |
189 | end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1; | 191 | end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1; |
190 | 192 | ||
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 21e37b55f7e5..5aceb3f8ecd6 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
@@ -962,23 +962,22 @@ xfs_dialloc( | |||
962 | if (!pag->pagi_freecount && !okalloc) | 962 | if (!pag->pagi_freecount && !okalloc) |
963 | goto nextag; | 963 | goto nextag; |
964 | 964 | ||
965 | /* | ||
966 | * Then read in the AGI buffer and recheck with the AGI buffer | ||
967 | * lock held. | ||
968 | */ | ||
965 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | 969 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); |
966 | if (error) | 970 | if (error) |
967 | goto out_error; | 971 | goto out_error; |
968 | 972 | ||
969 | /* | ||
970 | * Once the AGI has been read in we have to recheck | ||
971 | * pagi_freecount with the AGI buffer lock held. | ||
972 | */ | ||
973 | if (pag->pagi_freecount) { | 973 | if (pag->pagi_freecount) { |
974 | xfs_perag_put(pag); | 974 | xfs_perag_put(pag); |
975 | goto out_alloc; | 975 | goto out_alloc; |
976 | } | 976 | } |
977 | 977 | ||
978 | if (!okalloc) { | 978 | if (!okalloc) |
979 | xfs_trans_brelse(tp, agbp); | 979 | goto nextag_relse_buffer; |
980 | goto nextag; | 980 | |
981 | } | ||
982 | 981 | ||
983 | error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); | 982 | error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); |
984 | if (error) { | 983 | if (error) { |
@@ -1007,6 +1006,8 @@ xfs_dialloc( | |||
1007 | return 0; | 1006 | return 0; |
1008 | } | 1007 | } |
1009 | 1008 | ||
1009 | nextag_relse_buffer: | ||
1010 | xfs_trans_brelse(tp, agbp); | ||
1010 | nextag: | 1011 | nextag: |
1011 | xfs_perag_put(pag); | 1012 | xfs_perag_put(pag); |
1012 | if (++agno == mp->m_sb.sb_agcount) | 1013 | if (++agno == mp->m_sb.sb_agcount) |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 92d4331cd4f1..ca28a4ba4b54 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
@@ -857,7 +857,7 @@ xfs_rtbuf_get( | |||
857 | xfs_buf_t *bp; /* block buffer, result */ | 857 | xfs_buf_t *bp; /* block buffer, result */ |
858 | xfs_inode_t *ip; /* bitmap or summary inode */ | 858 | xfs_inode_t *ip; /* bitmap or summary inode */ |
859 | xfs_bmbt_irec_t map; | 859 | xfs_bmbt_irec_t map; |
860 | int nmap; | 860 | int nmap = 1; |
861 | int error; /* error value */ | 861 | int error; /* error value */ |
862 | 862 | ||
863 | ip = issum ? mp->m_rsumip : mp->m_rbmip; | 863 | ip = issum ? mp->m_rsumip : mp->m_rbmip; |