]> Pileus Git - ~andy/linux/blobdiff - fs/xfs/xfs_bmap_util.c
Merge branches 'acpi-resources', 'acpi-ec' and 'acpi-sleep'
[~andy/linux] / fs / xfs / xfs_bmap_util.c
index 82e0dab46ee52cc991a7130d8f671e011eef10a3..f264616080cac0c6bdfdc084c188b15505aa92e7 100644 (file)
@@ -618,22 +618,27 @@ xfs_getbmap(
                return XFS_ERROR(ENOMEM);
 
        xfs_ilock(ip, XFS_IOLOCK_SHARED);
-       if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) {
-               if (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size) {
+       if (whichfork == XFS_DATA_FORK) {
+               if (!(iflags & BMV_IF_DELALLOC) &&
+                   (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size)) {
                        error = -filemap_write_and_wait(VFS_I(ip)->i_mapping);
                        if (error)
                                goto out_unlock_iolock;
+
+                       /*
+                        * Even after flushing the inode, there can still be
+                        * delalloc blocks on the inode beyond EOF due to
+                        * speculative preallocation.  These are not removed
+                        * until the release function is called or the inode
+                        * is inactivated.  Hence we cannot assert here that
+                        * ip->i_delayed_blks == 0.
+                        */
                }
-               /*
-                * even after flushing the inode, there can still be delalloc
-                * blocks on the inode beyond EOF due to speculative
-                * preallocation. These are not removed until the release
-                * function is called or the inode is inactivated. Hence we
-                * cannot assert here that ip->i_delayed_blks == 0.
-                */
-       }
 
-       lock = xfs_ilock_map_shared(ip);
+               lock = xfs_ilock_data_map_shared(ip);
+       } else {
+               lock = xfs_ilock_attr_map_shared(ip);
+       }
 
        /*
         * Don't let nex be bigger than the number of extents
@@ -738,7 +743,7 @@ xfs_getbmap(
  out_free_map:
        kmem_free(map);
  out_unlock_ilock:
-       xfs_iunlock_map_shared(ip, lock);
+       xfs_iunlock(ip, lock);
  out_unlock_iolock:
        xfs_iunlock(ip, XFS_IOLOCK_SHARED);
 
@@ -1169,9 +1174,15 @@ xfs_zero_remaining_bytes(
        xfs_buf_unlock(bp);
 
        for (offset = startoff; offset <= endoff; offset = lastoffset + 1) {
+               uint lock_mode;
+
                offset_fsb = XFS_B_TO_FSBT(mp, offset);
                nimap = 1;
+
+               lock_mode = xfs_ilock_data_map_shared(ip);
                error = xfs_bmapi_read(ip, offset_fsb, 1, &imap, &nimap, 0);
+               xfs_iunlock(ip, lock_mode);
+
                if (error || nimap < 1)
                        break;
                ASSERT(imap.br_blockcount >= 1);