diff options
| -rw-r--r-- | fs/iomap.c | 14 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_ag_resv.c | 12 | ||||
| -rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 17 | ||||
| -rw-r--r-- | fs/xfs/xfs_aops.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap_util.c | 14 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_error.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_file.c | 39 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 8 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode_item.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_ioctl.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_iomap.c | 7 | ||||
| -rw-r--r-- | fs/xfs/xfs_iomap.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_pnfs.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_super.c | 10 |
15 files changed, 81 insertions, 56 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 8194d30bdca0..be61cf742b5e 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
| @@ -1009,6 +1009,13 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
| 1009 | WARN_ON_ONCE(ret); | 1009 | WARN_ON_ONCE(ret); |
| 1010 | ret = 0; | 1010 | ret = 0; |
| 1011 | 1011 | ||
| 1012 | if (iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) && | ||
| 1013 | !inode->i_sb->s_dio_done_wq) { | ||
| 1014 | ret = sb_init_dio_done_wq(inode->i_sb); | ||
| 1015 | if (ret < 0) | ||
| 1016 | goto out_free_dio; | ||
| 1017 | } | ||
| 1018 | |||
| 1012 | inode_dio_begin(inode); | 1019 | inode_dio_begin(inode); |
| 1013 | 1020 | ||
| 1014 | blk_start_plug(&plug); | 1021 | blk_start_plug(&plug); |
| @@ -1031,13 +1038,6 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
| 1031 | if (ret < 0) | 1038 | if (ret < 0) |
| 1032 | iomap_dio_set_error(dio, ret); | 1039 | iomap_dio_set_error(dio, ret); |
| 1033 | 1040 | ||
| 1034 | if (ret >= 0 && iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) && | ||
| 1035 | !inode->i_sb->s_dio_done_wq) { | ||
| 1036 | ret = sb_init_dio_done_wq(inode->i_sb); | ||
| 1037 | if (ret < 0) | ||
| 1038 | iomap_dio_set_error(dio, ret); | ||
| 1039 | } | ||
| 1040 | |||
| 1041 | if (!atomic_dec_and_test(&dio->ref)) { | 1041 | if (!atomic_dec_and_test(&dio->ref)) { |
| 1042 | if (!is_sync_kiocb(iocb)) | 1042 | if (!is_sync_kiocb(iocb)) |
| 1043 | return -EIOCBQUEUED; | 1043 | return -EIOCBQUEUED; |
diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c index b008ff3250eb..df3e600835e8 100644 --- a/fs/xfs/libxfs/xfs_ag_resv.c +++ b/fs/xfs/libxfs/xfs_ag_resv.c | |||
| @@ -156,7 +156,8 @@ __xfs_ag_resv_free( | |||
| 156 | trace_xfs_ag_resv_free(pag, type, 0); | 156 | trace_xfs_ag_resv_free(pag, type, 0); |
| 157 | 157 | ||
| 158 | resv = xfs_perag_resv(pag, type); | 158 | resv = xfs_perag_resv(pag, type); |
| 159 | pag->pag_mount->m_ag_max_usable += resv->ar_asked; | 159 | if (pag->pag_agno == 0) |
| 160 | pag->pag_mount->m_ag_max_usable += resv->ar_asked; | ||
| 160 | /* | 161 | /* |
| 161 | * AGFL blocks are always considered "free", so whatever | 162 | * AGFL blocks are always considered "free", so whatever |
| 162 | * was reserved at mount time must be given back at umount. | 163 | * was reserved at mount time must be given back at umount. |
| @@ -216,7 +217,14 @@ __xfs_ag_resv_init( | |||
| 216 | return error; | 217 | return error; |
| 217 | } | 218 | } |
| 218 | 219 | ||
| 219 | mp->m_ag_max_usable -= ask; | 220 | /* |
| 221 | * Reduce the maximum per-AG allocation length by however much we're | ||
| 222 | * trying to reserve for an AG. Since this is a filesystem-wide | ||
| 223 | * counter, we only make the adjustment for AG 0. This assumes that | ||
| 224 | * there aren't any AGs hungrier for per-AG reservation than AG 0. | ||
| 225 | */ | ||
| 226 | if (pag->pag_agno == 0) | ||
| 227 | mp->m_ag_max_usable -= ask; | ||
| 220 | 228 | ||
| 221 | resv = xfs_perag_resv(pag, type); | 229 | resv = xfs_perag_resv(pag, type); |
| 222 | resv->ar_asked = ask; | 230 | resv->ar_asked = ask; |
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 459f4b4f08fe..044a363119be 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c | |||
| @@ -49,7 +49,6 @@ | |||
| 49 | #include "xfs_rmap.h" | 49 | #include "xfs_rmap.h" |
| 50 | #include "xfs_ag_resv.h" | 50 | #include "xfs_ag_resv.h" |
| 51 | #include "xfs_refcount.h" | 51 | #include "xfs_refcount.h" |
| 52 | #include "xfs_rmap_btree.h" | ||
| 53 | #include "xfs_icache.h" | 52 | #include "xfs_icache.h" |
| 54 | 53 | ||
| 55 | 54 | ||
| @@ -192,12 +191,8 @@ xfs_bmap_worst_indlen( | |||
| 192 | int maxrecs; /* maximum record count at this level */ | 191 | int maxrecs; /* maximum record count at this level */ |
| 193 | xfs_mount_t *mp; /* mount structure */ | 192 | xfs_mount_t *mp; /* mount structure */ |
| 194 | xfs_filblks_t rval; /* return value */ | 193 | xfs_filblks_t rval; /* return value */ |
| 195 | xfs_filblks_t orig_len; | ||
| 196 | 194 | ||
| 197 | mp = ip->i_mount; | 195 | mp = ip->i_mount; |
| 198 | |||
| 199 | /* Calculate the worst-case size of the bmbt. */ | ||
| 200 | orig_len = len; | ||
| 201 | maxrecs = mp->m_bmap_dmxr[0]; | 196 | maxrecs = mp->m_bmap_dmxr[0]; |
| 202 | for (level = 0, rval = 0; | 197 | for (level = 0, rval = 0; |
| 203 | level < XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK); | 198 | level < XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK); |
| @@ -205,20 +200,12 @@ xfs_bmap_worst_indlen( | |||
| 205 | len += maxrecs - 1; | 200 | len += maxrecs - 1; |
| 206 | do_div(len, maxrecs); | 201 | do_div(len, maxrecs); |
| 207 | rval += len; | 202 | rval += len; |
| 208 | if (len == 1) { | 203 | if (len == 1) |
| 209 | rval += XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - | 204 | return rval + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - |
| 210 | level - 1; | 205 | level - 1; |
| 211 | break; | ||
| 212 | } | ||
| 213 | if (level == 0) | 206 | if (level == 0) |
| 214 | maxrecs = mp->m_bmap_dmxr[1]; | 207 | maxrecs = mp->m_bmap_dmxr[1]; |
| 215 | } | 208 | } |
| 216 | |||
| 217 | /* Calculate the worst-case size of the rmapbt. */ | ||
| 218 | if (xfs_sb_version_hasrmapbt(&mp->m_sb)) | ||
| 219 | rval += 1 + xfs_rmapbt_calc_size(mp, orig_len) + | ||
| 220 | mp->m_rmap_maxlevels; | ||
| 221 | |||
| 222 | return rval; | 209 | return rval; |
| 223 | } | 210 | } |
| 224 | 211 | ||
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 29172609f2a3..f18e5932aec4 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c | |||
| @@ -343,7 +343,8 @@ xfs_end_io( | |||
| 343 | error = xfs_reflink_end_cow(ip, offset, size); | 343 | error = xfs_reflink_end_cow(ip, offset, size); |
| 344 | break; | 344 | break; |
| 345 | case XFS_IO_UNWRITTEN: | 345 | case XFS_IO_UNWRITTEN: |
| 346 | error = xfs_iomap_write_unwritten(ip, offset, size); | 346 | /* writeback should never update isize */ |
| 347 | error = xfs_iomap_write_unwritten(ip, offset, size, false); | ||
| 347 | break; | 348 | break; |
| 348 | default: | 349 | default: |
| 349 | ASSERT(!xfs_ioend_is_append(ioend) || ioend->io_append_trans); | 350 | ASSERT(!xfs_ioend_is_append(ioend) || ioend->io_append_trans); |
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index cd9a5400ba4f..bc6c6e10a969 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c | |||
| @@ -1459,7 +1459,19 @@ xfs_shift_file_space( | |||
| 1459 | return error; | 1459 | return error; |
| 1460 | 1460 | ||
| 1461 | /* | 1461 | /* |
| 1462 | * The extent shiting code works on extent granularity. So, if | 1462 | * Clean out anything hanging around in the cow fork now that |
| 1463 | * we've flushed all the dirty data out to disk to avoid having | ||
| 1464 | * CoW extents at the wrong offsets. | ||
| 1465 | */ | ||
| 1466 | if (xfs_is_reflink_inode(ip)) { | ||
| 1467 | error = xfs_reflink_cancel_cow_range(ip, offset, NULLFILEOFF, | ||
| 1468 | true); | ||
| 1469 | if (error) | ||
| 1470 | return error; | ||
| 1471 | } | ||
| 1472 | |||
| 1473 | /* | ||
| 1474 | * The extent shifting code works on extent granularity. So, if | ||
| 1463 | * stop_fsb is not the starting block of extent, we need to split | 1475 | * stop_fsb is not the starting block of extent, we need to split |
| 1464 | * the extent at stop_fsb. | 1476 | * the extent at stop_fsb. |
| 1465 | */ | 1477 | */ |
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index da14658da310..2f97c12ca75e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
| @@ -1258,8 +1258,6 @@ xfs_buf_ioapply_map( | |||
| 1258 | int size; | 1258 | int size; |
| 1259 | int offset; | 1259 | int offset; |
| 1260 | 1260 | ||
| 1261 | total_nr_pages = bp->b_page_count; | ||
| 1262 | |||
| 1263 | /* skip the pages in the buffer before the start offset */ | 1261 | /* skip the pages in the buffer before the start offset */ |
| 1264 | page_index = 0; | 1262 | page_index = 0; |
| 1265 | offset = *buf_offset; | 1263 | offset = *buf_offset; |
diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index bd786a9ac2c3..eaf86f55b7f2 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c | |||
| @@ -347,7 +347,7 @@ xfs_verifier_error( | |||
| 347 | { | 347 | { |
| 348 | struct xfs_mount *mp = bp->b_target->bt_mount; | 348 | struct xfs_mount *mp = bp->b_target->bt_mount; |
| 349 | 349 | ||
| 350 | xfs_alert(mp, "Metadata %s detected at %pF, %s block 0x%llx", | 350 | xfs_alert(mp, "Metadata %s detected at %pS, %s block 0x%llx", |
| 351 | bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", | 351 | bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", |
| 352 | __return_address, bp->b_ops->name, bp->b_bn); | 352 | __return_address, bp->b_ops->name, bp->b_bn); |
| 353 | 353 | ||
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ebdd0bd2b261..309e26c9dddb 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
| @@ -58,7 +58,7 @@ xfs_zero_range( | |||
| 58 | xfs_off_t count, | 58 | xfs_off_t count, |
| 59 | bool *did_zero) | 59 | bool *did_zero) |
