diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 12:16:20 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 12:16:20 -0500 |
commit | 1d32bdafaaa8bcc4c39b41ab9f674887d147f188 (patch) | |
tree | c1aae09d8b98b033fd4dd85ba3dbf97a25776e90 /fs/xfs/xfs_ialloc.c | |
parent | 0dc3fd0249a295863900984e02dd4bb89204205b (diff) | |
parent | bf3964c188d686424ff7b69a45941851b9f437f0 (diff) |
Merge tag 'xfs-for-linus-v3.14-rc1' of git://oss.sgi.com/xfs/xfs
Pull xfs update from Ben Myers:
"This is primarily bug fixes, many of which you already have. New
stuff includes a series to decouple the in-memory and on-disk log
format, helpers in the area of inode clusters, and i_version handling.
We decided to try to use more topic branches this release, so there
are some merge commits in there on account of that. I'm afraid I
didn't do a good job of putting meaningful comments in the first
couple of merges. Sorry about that. I think I have the hang of it
now.
For 3.14-rc1 there are fixes in the areas of remote attributes,
discard, growfs, memory leaks in recovery, directory v2, quotas, the
MAINTAINERS file, allocation alignment, extent list locking, and in
xfs_bmapi_allocate. There are cleanups in xfs_setsize_buftarg,
removing unused macros, quotas, setattr, and freeing of inode
clusters. The in-memory and on-disk log format have been decoupled, a
common helper to calculate the number of blocks in an inode cluster
has been added, and handling of i_version has been pulled into the
filesystems that use it.
- cleanup in xfs_setsize_buftarg
- removal of remaining unused flags for vop toss/flush/flushinval
- fix for memory corruption in xfs_attrlist_by_handle
- fix for out-of-date comment in xfs_trans_dqlockedjoin
- fix for discard if range length is less than one block
- fix for overrun of agfl buffer using growfs on v4 superblock
filesystems
- pull i_version handling out into the filesystems that use it
- don't leak recovery items on error
- fix for memory leak in xfs_dir2_node_removename
- several cleanups for quotas
- fix bad assertion in xfs_qm_vop_create_dqattach
- cleanup for xfs_setattr_mode, and add xfs_setattr_time
- fix quota assert in xfs_setattr_nonsize
- fix an infinite loop when turning off group/project quota before
user quota
- fix for temporary buffer allocation failure in xfs_dir2_block_to_sf
with large directory block sizes
- fix Dave's email address in MAINTAINERS
- cleanup calculation of freed inode cluster blocks
- fix alignment of initial file allocations to match filesystem
geometry
- decouple in-memory and on-disk log format
- introduce a common helper to calculate the number of filesystem
blocks in an inode cluster
- fixes for extent list locking
- fix for off-by-one in xfs_attr3_rmt_verify
- fix for missing destroy_work_on_stack in xfs_bmapi_allocate"
* tag 'xfs-for-linus-v3.14-rc1' of git://oss.sgi.com/xfs/xfs: (51 commits)
xfs: Calling destroy_work_on_stack() to pair with INIT_WORK_ONSTACK()
xfs: fix off-by-one error in xfs_attr3_rmt_verify
xfs: assert that we hold the ilock for extent map access
xfs: use xfs_ilock_attr_map_shared in xfs_attr_list_int
xfs: use xfs_ilock_attr_map_shared in xfs_attr_get
xfs: use xfs_ilock_data_map_shared in xfs_qm_dqiterate
xfs: use xfs_ilock_data_map_shared in xfs_qm_dqtobp
xfs: take the ilock around xfs_bmapi_read in xfs_zero_remaining_bytes
xfs: reinstate the ilock in xfs_readdir
xfs: add xfs_ilock_attr_map_shared
xfs: rename xfs_ilock_map_shared
xfs: remove xfs_iunlock_map_shared
xfs: no need to lock the inode in xfs_find_handle
xfs: use xfs_icluster_size_fsb in xfs_imap
xfs: use xfs_icluster_size_fsb in xfs_ifree_cluster
xfs: use xfs_icluster_size_fsb in xfs_ialloc_inode_init
xfs: use xfs_icluster_size_fsb in xfs_bulkstat
xfs: introduce a common helper xfs_icluster_size_fsb
xfs: get rid of XFS_IALLOC_BLOCKS macros
xfs: get rid of XFS_INODE_CLUSTER_SIZE macros
...
Diffstat (limited to 'fs/xfs/xfs_ialloc.c')
-rw-r--r-- | fs/xfs/xfs_ialloc.c | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e87719c5bebe..5d7f105a1c82 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
@@ -52,7 +52,7 @@ xfs_ialloc_cluster_alignment( | |||
52 | { | 52 | { |
53 | if (xfs_sb_version_hasalign(&args->mp->m_sb) && | 53 | if (xfs_sb_version_hasalign(&args->mp->m_sb) && |
54 | args->mp->m_sb.sb_inoalignmt >= | 54 | args->mp->m_sb.sb_inoalignmt >= |
55 | XFS_B_TO_FSBT(args->mp, XFS_INODE_CLUSTER_SIZE(args->mp))) | 55 | XFS_B_TO_FSBT(args->mp, args->mp->m_inode_cluster_size)) |
56 | return args->mp->m_sb.sb_inoalignmt; | 56 | return args->mp->m_sb.sb_inoalignmt; |
57 | return 1; | 57 | return 1; |
58 | } | 58 | } |
@@ -170,27 +170,20 @@ xfs_ialloc_inode_init( | |||
170 | { | 170 | { |
171 | struct xfs_buf *fbuf; | 171 | struct xfs_buf *fbuf; |
172 | struct xfs_dinode *free; | 172 | struct xfs_dinode *free; |
173 | int blks_per_cluster, nbufs, ninodes; | 173 | int nbufs, blks_per_cluster, inodes_per_cluster; |
174 | int version; | 174 | int version; |
175 | int i, j; | 175 | int i, j; |
176 | xfs_daddr_t d; | 176 | xfs_daddr_t d; |
177 | xfs_ino_t ino = 0; | 177 | xfs_ino_t ino = 0; |
178 | 178 | ||
179 | /* | 179 | /* |
180 | * Loop over the new block(s), filling in the inodes. | 180 | * Loop over the new block(s), filling in the inodes. For small block |
181 | * For small block sizes, manipulate the inodes in buffers | 181 | * sizes, manipulate the inodes in buffers which are multiples of the |
182 | * which are multiples of the blocks size. | 182 | * blocks size. |
183 | */ | 183 | */ |
184 | if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { | 184 | blks_per_cluster = xfs_icluster_size_fsb(mp); |
185 | blks_per_cluster = 1; | 185 | inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; |
186 | nbufs = length; | 186 | nbufs = length / blks_per_cluster; |
187 | ninodes = mp->m_sb.sb_inopblock; | ||
188 | } else { | ||
189 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) / | ||
190 | mp->m_sb.sb_blocksize; | ||
191 | nbufs = length / blks_per_cluster; | ||
192 | ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; | ||
193 | } | ||
194 | 187 | ||
195 | /* | 188 | /* |
196 | * Figure out what version number to use in the inodes we create. If | 189 | * Figure out what version number to use in the inodes we create. If |
@@ -225,7 +218,7 @@ xfs_ialloc_inode_init( | |||
225 | * they track in the AIL as if they were physically logged. | 218 | * they track in the AIL as if they were physically logged. |
226 | */ | 219 | */ |
227 | if (tp) | 220 | if (tp) |
228 | xfs_icreate_log(tp, agno, agbno, XFS_IALLOC_INODES(mp), | 221 | xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, |
229 | mp->m_sb.sb_inodesize, length, gen); | 222 | mp->m_sb.sb_inodesize, length, gen); |
230 | } else if (xfs_sb_version_hasnlink(&mp->m_sb)) | 223 | } else if (xfs_sb_version_hasnlink(&mp->m_sb)) |
231 | version = 2; | 224 | version = 2; |
@@ -246,7 +239,7 @@ xfs_ialloc_inode_init( | |||
246 | /* Initialize the inode buffers and log them appropriately. */ | 239 | /* Initialize the inode buffers and log them appropriately. */ |
247 | fbuf->b_ops = &xfs_inode_buf_ops; | 240 | fbuf->b_ops = &xfs_inode_buf_ops; |
248 | xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); | 241 | xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); |
249 | for (i = 0; i < ninodes; i++) { | 242 | for (i = 0; i < inodes_per_cluster; i++) { |
250 | int ioffset = i << mp->m_sb.sb_inodelog; | 243 | int ioffset = i << mp->m_sb.sb_inodelog; |
251 | uint isize = xfs_dinode_size(version); | 244 | uint isize = xfs_dinode_size(version); |
252 | 245 | ||
@@ -329,11 +322,11 @@ xfs_ialloc_ag_alloc( | |||
329 | * Locking will ensure that we don't have two callers in here | 322 | * Locking will ensure that we don't have two callers in here |
330 | * at one time. | 323 | * at one time. |
331 | */ | 324 | */ |
332 | newlen = XFS_IALLOC_INODES(args.mp); | 325 | newlen = args.mp->m_ialloc_inos; |
333 | if (args.mp->m_maxicount && | 326 | if (args.mp->m_maxicount && |
334 | args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) | 327 | args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) |
335 | return XFS_ERROR(ENOSPC); | 328 | return XFS_ERROR(ENOSPC); |
336 | args.minlen = args.maxlen = XFS_IALLOC_BLOCKS(args.mp); | 329 | args.minlen = args.maxlen = args.mp->m_ialloc_blks; |
337 | /* | 330 | /* |
338 | * First try to allocate inodes contiguous with the last-allocated | 331 | * First try to allocate inodes contiguous with the last-allocated |
339 | * chunk of inodes. If the filesystem is striped, this will fill | 332 | * chunk of inodes. If the filesystem is striped, this will fill |
@@ -343,7 +336,7 @@ xfs_ialloc_ag_alloc( | |||
343 | newino = be32_to_cpu(agi->agi_newino); | 336 | newino = be32_to_cpu(agi->agi_newino); |
344 | agno = be32_to_cpu(agi->agi_seqno); | 337 | agno = be32_to_cpu(agi->agi_seqno); |
345 | args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + | 338 | args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + |
346 | XFS_IALLOC_BLOCKS(args.mp); | 339 | args.mp->m_ialloc_blks; |
347 | if (likely(newino != NULLAGINO && | 340 | if (likely(newino != NULLAGINO && |
348 | (args.agbno < be32_to_cpu(agi->agi_length)))) { | 341 | (args.agbno < be32_to_cpu(agi->agi_length)))) { |
349 | args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); | 342 | args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); |
@@ -585,7 +578,7 @@ xfs_ialloc_ag_select( | |||
585 | * Is there enough free space for the file plus a block of | 578 | * Is there enough free space for the file plus a block of |
586 | * inodes? (if we need to allocate some)? | 579 | * inodes? (if we need to allocate some)? |
587 | */ | 580 | */ |
588 | ineed = XFS_IALLOC_BLOCKS(mp); | 581 | ineed = mp->m_ialloc_blks; |
589 | longest = pag->pagf_longest; | 582 | longest = pag->pagf_longest; |
590 | if (!longest) | 583 | if (!longest) |
591 | longest = pag->pagf_flcount > 0; | 584 | longest = pag->pagf_flcount > 0; |
@@ -999,7 +992,7 @@ xfs_dialloc( | |||
999 | * inode. | 992 | * inode. |
1000 | */ | 993 | */ |
1001 | if (mp->m_maxicount && | 994 | if (mp->m_maxicount && |
1002 | mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { | 995 | mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { |
1003 | noroom = 1; | 996 | noroom = 1; |
1004 | okalloc = 0; | 997 | okalloc = 0; |
1005 | } | 998 | } |
@@ -1202,7 +1195,7 @@ xfs_difree( | |||
1202 | * When an inode cluster is free, it becomes eligible for removal | 1195 | * When an inode cluster is free, it becomes eligible for removal |
1203 | */ | 1196 | */ |
1204 | if (!(mp->m_flags & XFS_MOUNT_IKEEP) && | 1197 | if (!(mp->m_flags & XFS_MOUNT_IKEEP) && |
1205 | (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { | 1198 | (rec.ir_freecount == mp->m_ialloc_inos)) { |
1206 | 1199 | ||
1207 | *delete = 1; | 1200 | *delete = 1; |
1208 | *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); | 1201 | *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); |
@@ -1212,7 +1205,7 @@ xfs_difree( | |||
1212 | * AGI and Superblock inode counts, and mark the disk space | 1205 | * AGI and Superblock inode counts, and mark the disk space |
1213 | * to be freed when the transaction is committed. | 1206 | * to be freed when the transaction is committed. |
1214 | */ | 1207 | */ |
1215 | ilen = XFS_IALLOC_INODES(mp); | 1208 | ilen = mp->m_ialloc_inos; |
1216 | be32_add_cpu(&agi->agi_count, -ilen); | 1209 | be32_add_cpu(&agi->agi_count, -ilen); |
1217 | be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); | 1210 | be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); |
1218 | xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); | 1211 | xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); |
@@ -1228,9 +1221,9 @@ xfs_difree( | |||
1228 | goto error0; | 1221 | goto error0; |
1229 | } | 1222 | } |
1230 | 1223 | ||
1231 | xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, | 1224 | xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, |
1232 | agno, XFS_INO_TO_AGBNO(mp,rec.ir_startino)), | 1225 | XFS_AGINO_TO_AGBNO(mp, rec.ir_startino)), |
1233 | XFS_IALLOC_BLOCKS(mp), flist, mp); | 1226 | mp->m_ialloc_blks, flist, mp); |
1234 | } else { | 1227 | } else { |
1235 | *delete = 0; | 1228 | *delete = 0; |
1236 | 1229 | ||
@@ -1311,7 +1304,7 @@ xfs_imap_lookup( | |||
1311 | 1304 | ||
1312 | /* check that the returned record contains the required inode */ | 1305 | /* check that the returned record contains the required inode */ |
1313 | if (rec.ir_startino > agino || | 1306 | if (rec.ir_startino > agino || |
1314 | rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) | 1307 | rec.ir_startino + mp->m_ialloc_inos <= agino) |
1315 | return EINVAL; | 1308 | return EINVAL; |
1316 | 1309 | ||
1317 | /* for untrusted inodes check it is allocated first */ | 1310 | /* for untrusted inodes check it is allocated first */ |
@@ -1384,7 +1377,7 @@ xfs_imap( | |||
1384 | return XFS_ERROR(EINVAL); | 1377 | return XFS_ERROR(EINVAL); |
1385 | } | 1378 | } |
1386 | 1379 | ||
1387 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; | 1380 | blks_per_cluster = xfs_icluster_size_fsb(mp); |
1388 | 1381 | ||
1389 | /* | 1382 | /* |
1390 | * For bulkstat and handle lookups, we have an untrusted inode number | 1383 | * For bulkstat and handle lookups, we have an untrusted inode number |
@@ -1405,7 +1398,7 @@ xfs_imap( | |||
1405 | * If the inode cluster size is the same as the blocksize or | 1398 | * If the inode cluster size is the same as the blocksize or |
1406 | * smaller we get to the buffer by simple arithmetics. | 1399 | * smaller we get to the buffer by simple arithmetics. |
1407 | */ | 1400 | */ |
1408 | if (XFS_INODE_CLUSTER_SIZE(mp) <= mp->m_sb.sb_blocksize) { | 1401 | if (blks_per_cluster == 1) { |
1409 | offset = XFS_INO_TO_OFFSET(mp, ino); | 1402 | offset = XFS_INO_TO_OFFSET(mp, ino); |
1410 | ASSERT(offset < mp->m_sb.sb_inopblock); | 1403 | ASSERT(offset < mp->m_sb.sb_inopblock); |
1411 | 1404 | ||