diff options
Diffstat (limited to 'fs/xfs/xfs_dquot.c')
-rw-r--r-- | fs/xfs/xfs_dquot.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index a41f8bf1da37..044e97a33c8d 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
@@ -249,8 +249,11 @@ xfs_qm_init_dquot_blk( | |||
249 | d->dd_diskdq.d_version = XFS_DQUOT_VERSION; | 249 | d->dd_diskdq.d_version = XFS_DQUOT_VERSION; |
250 | d->dd_diskdq.d_id = cpu_to_be32(curid); | 250 | d->dd_diskdq.d_id = cpu_to_be32(curid); |
251 | d->dd_diskdq.d_flags = type; | 251 | d->dd_diskdq.d_flags = type; |
252 | if (xfs_sb_version_hascrc(&mp->m_sb)) | 252 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
253 | uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); | 253 | uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); |
254 | xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), | ||
255 | XFS_DQUOT_CRC_OFF); | ||
256 | } | ||
254 | } | 257 | } |
255 | 258 | ||
256 | xfs_trans_dquot_buf(tp, bp, | 259 | xfs_trans_dquot_buf(tp, bp, |
@@ -286,23 +289,6 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) | |||
286 | dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; | 289 | dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; |
287 | } | 290 | } |
288 | 291 | ||
289 | STATIC void | ||
290 | xfs_dquot_buf_calc_crc( | ||
291 | struct xfs_mount *mp, | ||
292 | struct xfs_buf *bp) | ||
293 | { | ||
294 | struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; | ||
295 | int i; | ||
296 | |||
297 | if (!xfs_sb_version_hascrc(&mp->m_sb)) | ||
298 | return; | ||
299 | |||
300 | for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { | ||
301 | xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), | ||
302 | offsetof(struct xfs_dqblk, dd_crc)); | ||
303 | } | ||
304 | } | ||
305 | |||
306 | STATIC bool | 292 | STATIC bool |
307 | xfs_dquot_buf_verify_crc( | 293 | xfs_dquot_buf_verify_crc( |
308 | struct xfs_mount *mp, | 294 | struct xfs_mount *mp, |
@@ -328,12 +314,11 @@ xfs_dquot_buf_verify_crc( | |||
328 | 314 | ||
329 | for (i = 0; i < ndquots; i++, d++) { | 315 | for (i = 0; i < ndquots; i++, d++) { |
330 | if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), | 316 | if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), |
331 | offsetof(struct xfs_dqblk, dd_crc))) | 317 | XFS_DQUOT_CRC_OFF)) |
332 | return false; | 318 | return false; |
333 | if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) | 319 | if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) |
334 | return false; | 320 | return false; |
335 | } | 321 | } |
336 | |||
337 | return true; | 322 | return true; |
338 | } | 323 | } |
339 | 324 | ||
@@ -393,6 +378,11 @@ xfs_dquot_buf_read_verify( | |||
393 | } | 378 | } |
394 | } | 379 | } |
395 | 380 | ||
381 | /* | ||
382 | * we don't calculate the CRC here as that is done when the dquot is flushed to | ||
383 | * the buffer after the update is done. This ensures that the dquot in the | ||
384 | * buffer always has an up-to-date CRC value. | ||
385 | */ | ||
396 | void | 386 | void |
397 | xfs_dquot_buf_write_verify( | 387 | xfs_dquot_buf_write_verify( |
398 | struct xfs_buf *bp) | 388 | struct xfs_buf *bp) |
@@ -404,7 +394,6 @@ xfs_dquot_buf_write_verify( | |||
404 | xfs_buf_ioerror(bp, EFSCORRUPTED); | 394 | xfs_buf_ioerror(bp, EFSCORRUPTED); |
405 | return; | 395 | return; |
406 | } | 396 | } |
407 | xfs_dquot_buf_calc_crc(mp, bp); | ||
408 | } | 397 | } |
409 | 398 | ||
410 | const struct xfs_buf_ops xfs_dquot_buf_ops = { | 399 | const struct xfs_buf_ops xfs_dquot_buf_ops = { |
@@ -1151,11 +1140,17 @@ xfs_qm_dqflush( | |||
1151 | * copy the lsn into the on-disk dquot now while we have the in memory | 1140 | * copy the lsn into the on-disk dquot now while we have the in memory |
1152 | * dquot here. This can't be done later in the write verifier as we | 1141 | * dquot here. This can't be done later in the write verifier as we |
1153 | * can't get access to the log item at that point in time. | 1142 | * can't get access to the log item at that point in time. |
1143 | * | ||
1144 | * We also calculate the CRC here so that the on-disk dquot in the | ||
1145 | * buffer always has a valid CRC. This ensures there is no possibility | ||
1146 | * of a dquot without an up-to-date CRC getting to disk. | ||
1154 | */ | 1147 | */ |
1155 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | 1148 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
1156 | struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; | 1149 | struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; |
1157 | 1150 | ||
1158 | dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); | 1151 | dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); |
1152 | xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk), | ||
1153 | XFS_DQUOT_CRC_OFF); | ||
1159 | } | 1154 | } |
1160 | 1155 | ||
1161 | /* | 1156 | /* |