Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: introduce xlog_copy_iovec

Add a helper to abstract out filling the log iovecs in the log item
format handlers. This will allow us to change the way we do the log
item formatting more easily.

The copy in the name is a bit confusing for now as it just assigns a
pointer and lets the CIL code perform the copy, but that will change
soon.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>

authored by

Christoph Hellwig and committed by
Dave Chinner
1234351c 3de559fb

+103 -108
+12 -18
fs/xfs/xfs_buf_item.c
··· 182 182 trace_xfs_buf_item_size(bip); 183 183 } 184 184 185 - static inline struct xfs_log_iovec * 185 + static inline void 186 186 xfs_buf_item_copy_iovec( 187 - struct xfs_log_iovec *vecp, 187 + struct xfs_log_iovec **vecp, 188 188 struct xfs_buf *bp, 189 189 uint offset, 190 190 int first_bit, 191 191 uint nbits) 192 192 { 193 193 offset += first_bit * XFS_BLF_CHUNK; 194 - 195 - vecp->i_type = XLOG_REG_TYPE_BCHUNK; 196 - vecp->i_addr = xfs_buf_offset(bp, offset); 197 - vecp->i_len = nbits * XFS_BLF_CHUNK; 198 - return vecp + 1; 194 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_BCHUNK, 195 + xfs_buf_offset(bp, offset), 196 + nbits * XFS_BLF_CHUNK); 199 197 } 200 198 201 199 static inline bool ··· 208 210 XFS_BLF_CHUNK); 209 211 } 210 212 211 - static struct xfs_log_iovec * 213 + static void 212 214 xfs_buf_item_format_segment( 213 215 struct xfs_buf_log_item *bip, 214 - struct xfs_log_iovec *vecp, 216 + struct xfs_log_iovec **vecp, 215 217 uint offset, 216 218 struct xfs_buf_log_format *blfp) 217 219 { ··· 243 245 goto out; 244 246 } 245 247 246 - vecp->i_addr = blfp; 247 - vecp->i_len = base_size; 248 - vecp->i_type = XLOG_REG_TYPE_BFORMAT; 249 - vecp++; 248 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_BFORMAT, blfp, base_size); 250 249 nvecs = 1; 251 250 252 251 if (bip->bli_flags & XFS_BLI_STALE) { ··· 286 291 break; 287 292 } else if (next_bit != last_bit + 1 || 288 293 xfs_buf_item_straddle(bp, offset, next_bit, last_bit)) { 289 - vecp = xfs_buf_item_copy_iovec(vecp, bp, offset, 290 - first_bit, nbits); 294 + xfs_buf_item_copy_iovec(vecp, bp, offset, 295 + first_bit, nbits); 291 296 nvecs++; 292 297 first_bit = next_bit; 293 298 last_bit = next_bit; ··· 299 304 } 300 305 out: 301 306 blfp->blf_size = nvecs; 302 - return vecp; 303 307 } 304 308 305 309 /* ··· 354 360 } 355 361 356 362 for (i = 0; i < bip->bli_format_count; i++) { 357 - vecp = xfs_buf_item_format_segment(bip, vecp, offset, 358 - &bip->bli_formats[i]); 363 + xfs_buf_item_format_segment(bip, &vecp, offset, 364 + &bip->bli_formats[i]); 359 365 offset += bp->b_maps[i].bm_len; 360 366 } 361 367
+12 -13
fs/xfs/xfs_dquot_item.c
··· 57 57 STATIC void 58 58 xfs_qm_dquot_logitem_format( 59 59 struct xfs_log_item *lip, 60 - struct xfs_log_iovec *logvec) 60 + struct xfs_log_iovec *vecp) 61 61 { 62 62 struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); 63 63 64 - logvec->i_addr = &qlip->qli_format; 65 - logvec->i_len = sizeof(xfs_dq_logformat_t); 66 - logvec->i_type = XLOG_REG_TYPE_QFORMAT; 67 - logvec++; 68 - logvec->i_addr = &qlip->qli_dquot->q_core; 69 - logvec->i_len = sizeof(xfs_disk_dquot_t); 70 - logvec->i_type = XLOG_REG_TYPE_DQUOT; 64 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_QFORMAT, 65 + &qlip->qli_format, 66 + sizeof(struct xfs_dq_logformat)); 67 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_DQUOT, 68 + &qlip->qli_dquot->q_core, 69 + sizeof(struct xfs_disk_dquot)); 71 70 72 71 qlip->qli_format.qlf_size = 2; 73 - 74 72 } 75 73 76 74 /* ··· 302 304 STATIC void 303 305 xfs_qm_qoff_logitem_format( 304 306 struct xfs_log_item *lip, 305 - struct xfs_log_iovec *log_vector) 307 + struct xfs_log_iovec *vecp) 306 308 { 307 309 struct xfs_qoff_logitem *qflip = QOFF_ITEM(lip); 308 310 309 311 ASSERT(qflip->qql_format.qf_type == XFS_LI_QUOTAOFF); 310 312 311 - log_vector->i_addr = &qflip->qql_format; 312 - log_vector->i_len = sizeof(xfs_qoff_logitem_t); 313 - log_vector->i_type = XLOG_REG_TYPE_QUOTAOFF; 313 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_QUOTAOFF, 314 + &qflip->qql_format, 315 + sizeof(struct xfs_qoff_logitem)); 316 + 314 317 qflip->qql_format.qf_size = 1; 315 318 } 316 319
+9 -10
fs/xfs/xfs_extfree_item.c
··· 26 26 #include "xfs_trans_priv.h" 27 27 #include "xfs_buf_item.h" 28 28 #include "xfs_extfree_item.h" 29 + #include "xfs_log.h" 29 30 30 31 31 32 kmem_zone_t *xfs_efi_zone; ··· 102 101 STATIC void 103 102 xfs_efi_item_format( 104 103 struct xfs_log_item *lip, 105 - struct xfs_log_iovec *log_vector) 104 + struct xfs_log_iovec *vecp) 106 105 { 107 106 struct xfs_efi_log_item *efip = EFI_ITEM(lip); 108 107 ··· 112 111 efip->efi_format.efi_type = XFS_LI_EFI; 113 112 efip->efi_format.efi_size = 1; 114 113 115 - log_vector->i_addr = &efip->efi_format; 116 - log_vector->i_len = xfs_efi_item_sizeof(efip); 117 - log_vector->i_type = XLOG_REG_TYPE_EFI_FORMAT; 118 - ASSERT(log_vector->i_len >= sizeof(xfs_efi_log_format_t)); 114 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_EFI_FORMAT, 115 + &efip->efi_format, 116 + xfs_efi_item_sizeof(efip)); 119 117 } 120 118 121 119 ··· 368 368 STATIC void 369 369 xfs_efd_item_format( 370 370 struct xfs_log_item *lip, 371 - struct xfs_log_iovec *log_vector) 371 + struct xfs_log_iovec *vecp) 372 372 { 373 373 struct xfs_efd_log_item *efdp = EFD_ITEM(lip); 374 374 ··· 377 377 efdp->efd_format.efd_type = XFS_LI_EFD; 378 378 efdp->efd_format.efd_size = 1; 379 379 380 - log_vector->i_addr = &efdp->efd_format; 381 - log_vector->i_len = xfs_efd_item_sizeof(efdp); 382 - log_vector->i_type = XLOG_REG_TYPE_EFD_FORMAT; 383 - ASSERT(log_vector->i_len >= sizeof(xfs_efd_log_format_t)); 380 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_EFD_FORMAT, 381 + &efdp->efd_format, 382 + xfs_efd_item_sizeof(efdp)); 384 383 } 385 384 386 385 /*
+5 -4
fs/xfs/xfs_icreate_item.c
··· 28 28 #include "xfs_trans_priv.h" 29 29 #include "xfs_error.h" 30 30 #include "xfs_icreate_item.h" 31 + #include "xfs_log.h" 31 32 32 33 kmem_zone_t *xfs_icreate_zone; /* inode create item zone */ 33 34 ··· 59 58 STATIC void 60 59 xfs_icreate_item_format( 61 60 struct xfs_log_item *lip, 62 - struct xfs_log_iovec *log_vector) 61 + struct xfs_log_iovec *vecp) 63 62 { 64 63 struct xfs_icreate_item *icp = ICR_ITEM(lip); 65 64 66 - log_vector->i_addr = (xfs_caddr_t)&icp->ic_format; 67 - log_vector->i_len = sizeof(struct xfs_icreate_log); 68 - log_vector->i_type = XLOG_REG_TYPE_ICREATE; 65 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_ICREATE, 66 + &icp->ic_format, 67 + sizeof(struct xfs_icreate_log)); 69 68 } 70 69 71 70
+52 -63
fs/xfs/xfs_inode_item.c
··· 30 30 #include "xfs_trace.h" 31 31 #include "xfs_trans_priv.h" 32 32 #include "xfs_dinode.h" 33 + #include "xfs_log.h" 33 34 34 35 35 36 kmem_zone_t *xfs_ili_zone; /* inode log item zone */ ··· 160 159 * here, so always use the physical fork size to determine the size of the 161 160 * buffer we need to allocate. 162 161 */ 163 - STATIC void 162 + STATIC int 164 163 xfs_inode_item_format_extents( 165 164 struct xfs_inode *ip, 166 - struct xfs_log_iovec *vecp, 165 + struct xfs_log_iovec **vecp, 167 166 int whichfork, 168 167 int type) 169 168 { 170 169 xfs_bmbt_rec_t *ext_buffer; 170 + int len; 171 171 172 172 ext_buffer = kmem_alloc(XFS_IFORK_SIZE(ip, whichfork), KM_SLEEP); 173 173 if (whichfork == XFS_DATA_FORK) ··· 176 174 else 177 175 ip->i_itemp->ili_aextents_buf = ext_buffer; 178 176 179 - vecp->i_addr = ext_buffer; 180 - vecp->i_len = xfs_iextents_copy(ip, ext_buffer, whichfork); 181 - vecp->i_type = type; 177 + len = xfs_iextents_copy(ip, ext_buffer, whichfork); 178 + xlog_copy_iovec(vecp, type, ext_buffer, len); 179 + return len; 182 180 } 183 181 184 182 /* ··· 209 207 } 210 208 } 211 209 212 - STATIC struct xfs_log_iovec * 210 + STATIC void 213 211 xfs_inode_item_format_data_fork( 214 212 struct xfs_inode_log_item *iip, 215 - struct xfs_log_iovec *vecp, 213 + struct xfs_log_iovec **vecp, 216 214 int *nvecs) 217 215 { 218 216 struct xfs_inode *ip = iip->ili_inode; ··· 239 237 * extents, so just point to the 240 238 * real extents array. 241 239 */ 242 - vecp->i_addr = ip->i_df.if_u1.if_extents; 243 - vecp->i_len = ip->i_df.if_bytes; 244 - vecp->i_type = XLOG_REG_TYPE_IEXT; 240 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_IEXT, 241 + ip->i_df.if_u1.if_extents, 242 + ip->i_df.if_bytes); 243 + iip->ili_format.ilf_dsize = ip->i_df.if_bytes; 245 244 } else 246 245 #endif 247 246 { 248 - xfs_inode_item_format_extents(ip, vecp, 249 - XFS_DATA_FORK, XLOG_REG_TYPE_IEXT); 247 + iip->ili_format.ilf_dsize = 248 + xfs_inode_item_format_extents(ip, vecp, 249 + XFS_DATA_FORK, XLOG_REG_TYPE_IEXT); 250 + ASSERT(iip->ili_format.ilf_dsize <= ip->i_df.if_bytes); 250 251 } 251 - ASSERT(vecp->i_len <= ip->i_df.if_bytes); 252 - iip->ili_format.ilf_dsize = vecp->i_len; 253 - vecp++; 254 252 (*nvecs)++; 255 253 } else { 256 254 iip->ili_fields &= ~XFS_ILOG_DEXT; ··· 264 262 if ((iip->ili_fields & XFS_ILOG_DBROOT) && 265 263 ip->i_df.if_broot_bytes > 0) { 266 264 ASSERT(ip->i_df.if_broot != NULL); 267 - vecp->i_addr = ip->i_df.if_broot; 268 - vecp->i_len = ip->i_df.if_broot_bytes; 269 - vecp->i_type = XLOG_REG_TYPE_IBROOT; 270 - vecp++; 265 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_IBROOT, 266 + ip->i_df.if_broot, 267 + ip->i_df.if_broot_bytes); 271 268 (*nvecs)++; 272 269 iip->ili_format.ilf_dsize = ip->i_df.if_broot_bytes; 273 270 } else { ··· 281 280 XFS_ILOG_DEV | XFS_ILOG_UUID); 282 281 if ((iip->ili_fields & XFS_ILOG_DDATA) && 283 282 ip->i_df.if_bytes > 0) { 284 - ASSERT(ip->i_df.if_u1.if_data != NULL); 285 - ASSERT(ip->i_d.di_size > 0); 286 - 287 - vecp->i_addr = ip->i_df.if_u1.if_data; 288 283 /* 289 284 * Round i_bytes up to a word boundary. 290 285 * The underlying memory is guaranteed to 291 286 * to be there by xfs_idata_realloc(). 292 287 */ 293 288 data_bytes = roundup(ip->i_df.if_bytes, 4); 294 - ASSERT((ip->i_df.if_real_bytes == 0) || 295 - (ip->i_df.if_real_bytes == data_bytes)); 296 - vecp->i_len = (int)data_bytes; 297 - vecp->i_type = XLOG_REG_TYPE_ILOCAL; 298 - vecp++; 289 + ASSERT(ip->i_df.if_real_bytes == 0 || 290 + ip->i_df.if_real_bytes == data_bytes); 291 + ASSERT(ip->i_df.if_u1.if_data != NULL); 292 + ASSERT(ip->i_d.di_size > 0); 293 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_ILOCAL, 294 + ip->i_df.if_u1.if_data, data_bytes); 299 295 (*nvecs)++; 300 296 iip->ili_format.ilf_dsize = (unsigned)data_bytes; 301 297 } else { ··· 321 323 ASSERT(0); 322 324 break; 323 325 } 324 - 325 - return vecp; 326 326 } 327 327 328 - STATIC struct xfs_log_iovec * 328 + STATIC void 329 329 xfs_inode_item_format_attr_fork( 330 330 struct xfs_inode_log_item *iip, 331 - struct xfs_log_iovec *vecp, 331 + struct xfs_log_iovec **vecp, 332 332 int *nvecs) 333 333 { 334 334 struct xfs_inode *ip = iip->ili_inode; ··· 348 352 * There are not delayed allocation extents 349 353 * for attributes, so just point at the array. 350 354 */ 351 - vecp->i_addr = ip->i_afp->if_u1.if_extents; 352 - vecp->i_len = ip->i_afp->if_bytes; 353 - vecp->i_type = XLOG_REG_TYPE_IATTR_EXT; 355 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_EXT, 356 + ip->i_afp->if_u1.if_extents, 357 + ip->i_afp->if_bytes); 358 + iip->ili_format.ilf_asize = ip->i_afp->if_bytes; 354 359 #else 355 360 ASSERT(iip->ili_aextents_buf == NULL); 356 - xfs_inode_item_format_extents(ip, vecp, 361 + iip->ili_format.ilf_asize = 362 + xfs_inode_item_format_extents(ip, vecp, 357 363 XFS_ATTR_FORK, XLOG_REG_TYPE_IATTR_EXT); 358 364 #endif 359 - iip->ili_format.ilf_asize = vecp->i_len; 360 - vecp++; 361 365 (*nvecs)++; 362 366 } else { 363 367 iip->ili_fields &= ~XFS_ILOG_AEXT; ··· 371 375 ip->i_afp->if_broot_bytes > 0) { 372 376 ASSERT(ip->i_afp->if_broot != NULL); 373 377 374 - vecp->i_addr = ip->i_afp->if_broot; 375 - vecp->i_len = ip->i_afp->if_broot_bytes; 376 - vecp->i_type = XLOG_REG_TYPE_IATTR_BROOT; 377 - vecp++; 378 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_BROOT, 379 + ip->i_afp->if_broot, 380 + ip->i_afp->if_broot_bytes); 378 381 (*nvecs)++; 379 382 iip->ili_format.ilf_asize = ip->i_afp->if_broot_bytes; 380 383 } else { ··· 386 391 387 392 if ((iip->ili_fields & XFS_ILOG_ADATA) && 388 393 ip->i_afp->if_bytes > 0) { 389 - ASSERT(ip->i_afp->if_u1.if_data != NULL); 390 - 391 - vecp->i_addr = ip->i_afp->if_u1.if_data; 392 394 /* 393 395 * Round i_bytes up to a word boundary. 394 396 * The underlying memory is guaranteed to 395 397 * to be there by xfs_idata_realloc(). 396 398 */ 397 399 data_bytes = roundup(ip->i_afp->if_bytes, 4); 398 - ASSERT((ip->i_afp->if_real_bytes == 0) || 399 - (ip->i_afp->if_real_bytes == data_bytes)); 400 - vecp->i_len = (int)data_bytes; 401 - vecp->i_type = XLOG_REG_TYPE_IATTR_LOCAL; 402 - vecp++; 400 + ASSERT(ip->i_afp->if_real_bytes == 0 || 401 + ip->i_afp->if_real_bytes == data_bytes); 402 + ASSERT(ip->i_afp->if_u1.if_data != NULL); 403 + xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_LOCAL, 404 + ip->i_afp->if_u1.if_data, 405 + data_bytes); 403 406 (*nvecs)++; 404 407 iip->ili_format.ilf_asize = (unsigned)data_bytes; 405 408 } else { ··· 408 415 ASSERT(0); 409 416 break; 410 417 } 411 - 412 - return vecp; 413 418 } 414 419 415 420 /* ··· 426 435 struct xfs_inode *ip = iip->ili_inode; 427 436 uint nvecs; 428 437 429 - vecp->i_addr = &iip->ili_format; 430 - vecp->i_len = sizeof(xfs_inode_log_format_t); 431 - vecp->i_type = XLOG_REG_TYPE_IFORMAT; 432 - vecp++; 433 - nvecs = 1; 438 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_IFORMAT, 439 + &iip->ili_format, 440 + sizeof(struct xfs_inode_log_format)); 441 + nvecs = 1; 434 442 435 - vecp->i_addr = &ip->i_d; 436 - vecp->i_len = xfs_icdinode_size(ip->i_d.di_version); 437 - vecp->i_type = XLOG_REG_TYPE_ICORE; 438 - vecp++; 443 + xlog_copy_iovec(&vecp, XLOG_REG_TYPE_ICORE, 444 + &ip->i_d, 445 + xfs_icdinode_size(ip->i_d.di_version)); 439 446 nvecs++; 440 447 441 448 if (ip->i_d.di_version == 1) 442 449 xfs_inode_item_format_v1_inode(ip); 443 450 444 - vecp = xfs_inode_item_format_data_fork(iip, vecp, &nvecs); 451 + xfs_inode_item_format_data_fork(iip, &vecp, &nvecs); 445 452 if (XFS_IFORK_Q(ip)) { 446 - vecp = xfs_inode_item_format_attr_fork(iip, vecp, &nvecs); 453 + xfs_inode_item_format_attr_fork(iip, &vecp, &nvecs); 447 454 } else { 448 455 iip->ili_fields &= 449 456 ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT);
+13
fs/xfs/xfs_log.h
··· 30 30 31 31 #define XFS_LOG_VEC_ORDERED (-1) 32 32 33 + static inline void * 34 + xlog_copy_iovec(struct xfs_log_iovec **vecp, uint type, void *data, int len) 35 + { 36 + struct xfs_log_iovec *vec = *vecp; 37 + 38 + vec->i_type = type; 39 + vec->i_addr = data; 40 + vec->i_len = len; 41 + 42 + *vecp = vec + 1; 43 + return vec->i_addr; 44 + } 45 + 33 46 /* 34 47 * Structure used to pass callback function and the function's argument 35 48 * to the log manager.