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_bmap_util.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_bmap_util.c')
-rw-r--r-- | fs/xfs/xfs_bmap_util.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 82e0dab46ee5..f264616080ca 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c | |||
@@ -618,22 +618,27 @@ xfs_getbmap( | |||
618 | return XFS_ERROR(ENOMEM); | 618 | return XFS_ERROR(ENOMEM); |
619 | 619 | ||
620 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 620 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
621 | if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) { | 621 | if (whichfork == XFS_DATA_FORK) { |
622 | if (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size) { | 622 | if (!(iflags & BMV_IF_DELALLOC) && |
623 | (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size)) { | ||
623 | error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); | 624 | error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); |
624 | if (error) | 625 | if (error) |
625 | goto out_unlock_iolock; | 626 | goto out_unlock_iolock; |
627 | |||
628 | /* | ||
629 | * Even after flushing the inode, there can still be | ||
630 | * delalloc blocks on the inode beyond EOF due to | ||
631 | * speculative preallocation. These are not removed | ||
632 | * until the release function is called or the inode | ||
633 | * is inactivated. Hence we cannot assert here that | ||
634 | * ip->i_delayed_blks == 0. | ||
635 | */ | ||
626 | } | 636 | } |
627 | /* | ||
628 | * even after flushing the inode, there can still be delalloc | ||
629 | * blocks on the inode beyond EOF due to speculative | ||
630 | * preallocation. These are not removed until the release | ||
631 | * function is called or the inode is inactivated. Hence we | ||
632 | * cannot assert here that ip->i_delayed_blks == 0. | ||
633 | */ | ||
634 | } | ||
635 | 637 | ||
636 | lock = xfs_ilock_map_shared(ip); | 638 | lock = xfs_ilock_data_map_shared(ip); |
639 | } else { | ||
640 | lock = xfs_ilock_attr_map_shared(ip); | ||
641 | } | ||
637 | 642 | ||
638 | /* | 643 | /* |
639 | * Don't let nex be bigger than the number of extents | 644 | * Don't let nex be bigger than the number of extents |
@@ -738,7 +743,7 @@ xfs_getbmap( | |||
738 | out_free_map: | 743 | out_free_map: |
739 | kmem_free(map); | 744 | kmem_free(map); |
740 | out_unlock_ilock: | 745 | out_unlock_ilock: |
741 | xfs_iunlock_map_shared(ip, lock); | 746 | xfs_iunlock(ip, lock); |
742 | out_unlock_iolock: | 747 | out_unlock_iolock: |
743 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 748 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
744 | 749 | ||
@@ -1169,9 +1174,15 @@ xfs_zero_remaining_bytes( | |||
1169 | xfs_buf_unlock(bp); | 1174 | xfs_buf_unlock(bp); |
1170 | 1175 | ||
1171 | for (offset = startoff; offset <= endoff; offset = lastoffset + 1) { | 1176 | for (offset = startoff; offset <= endoff; offset = lastoffset + 1) { |
1177 | uint lock_mode; | ||
1178 | |||
1172 | offset_fsb = XFS_B_TO_FSBT(mp, offset); | 1179 | offset_fsb = XFS_B_TO_FSBT(mp, offset); |
1173 | nimap = 1; | 1180 | nimap = 1; |
1181 | |||
1182 | lock_mode = xfs_ilock_data_map_shared(ip); | ||
1174 | error = xfs_bmapi_read(ip, offset_fsb, 1, &imap, &nimap, 0); | 1183 | error = xfs_bmapi_read(ip, offset_fsb, 1, &imap, &nimap, 0); |
1184 | xfs_iunlock(ip, lock_mode); | ||
1185 | |||
1175 | if (error || nimap < 1) | 1186 | if (error || nimap < 1) |
1176 | break; | 1187 | break; |
1177 | ASSERT(imap.br_blockcount >= 1); | 1188 | ASSERT(imap.br_blockcount >= 1); |