diff options
Diffstat (limited to 'fs/xfs/xfs_inode_item.c')
-rw-r--r-- | fs/xfs/xfs_inode_item.c | 92 |
1 files changed, 45 insertions, 47 deletions
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index c75e14beff06..6ab318f80c96 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
@@ -163,6 +163,7 @@ xfs_inode_item_size( | |||
163 | STATIC int | 163 | STATIC int |
164 | xfs_inode_item_format_extents( | 164 | xfs_inode_item_format_extents( |
165 | struct xfs_inode *ip, | 165 | struct xfs_inode *ip, |
166 | struct xfs_log_vec *lv, | ||
166 | struct xfs_log_iovec **vecp, | 167 | struct xfs_log_iovec **vecp, |
167 | int whichfork, | 168 | int whichfork, |
168 | int type) | 169 | int type) |
@@ -177,7 +178,7 @@ xfs_inode_item_format_extents( | |||
177 | ip->i_itemp->ili_aextents_buf = ext_buffer; | 178 | ip->i_itemp->ili_aextents_buf = ext_buffer; |
178 | 179 | ||
179 | len = xfs_iextents_copy(ip, ext_buffer, whichfork); | 180 | len = xfs_iextents_copy(ip, ext_buffer, whichfork); |
180 | xlog_copy_iovec(vecp, type, ext_buffer, len); | 181 | xlog_copy_iovec(lv, vecp, type, ext_buffer, len); |
181 | return len; | 182 | return len; |
182 | } | 183 | } |
183 | 184 | ||
@@ -212,8 +213,9 @@ xfs_inode_item_format_v1_inode( | |||
212 | STATIC void | 213 | STATIC void |
213 | xfs_inode_item_format_data_fork( | 214 | xfs_inode_item_format_data_fork( |
214 | struct xfs_inode_log_item *iip, | 215 | struct xfs_inode_log_item *iip, |
215 | struct xfs_log_iovec **vecp, | 216 | struct xfs_inode_log_format *ilf, |
216 | int *nvecs) | 217 | struct xfs_log_vec *lv, |
218 | struct xfs_log_iovec **vecp) | ||
217 | { | 219 | { |
218 | struct xfs_inode *ip = iip->ili_inode; | 220 | struct xfs_inode *ip = iip->ili_inode; |
219 | size_t data_bytes; | 221 | size_t data_bytes; |
@@ -239,19 +241,19 @@ xfs_inode_item_format_data_fork( | |||
239 | * extents, so just point to the | 241 | * extents, so just point to the |
240 | * real extents array. | 242 | * real extents array. |
241 | */ | 243 | */ |
242 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_IEXT, | 244 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IEXT, |
243 | ip->i_df.if_u1.if_extents, | 245 | ip->i_df.if_u1.if_extents, |
244 | ip->i_df.if_bytes); | 246 | ip->i_df.if_bytes); |
245 | iip->ili_format.ilf_dsize = ip->i_df.if_bytes; | 247 | ilf->ilf_dsize = ip->i_df.if_bytes; |
246 | } else | 248 | } else |
247 | #endif | 249 | #endif |
248 | { | 250 | { |
249 | iip->ili_format.ilf_dsize = | 251 | ilf->ilf_dsize = |
250 | xfs_inode_item_format_extents(ip, vecp, | 252 | xfs_inode_item_format_extents(ip, lv, vecp, |
251 | XFS_DATA_FORK, XLOG_REG_TYPE_IEXT); | 253 | XFS_DATA_FORK, XLOG_REG_TYPE_IEXT); |
252 | ASSERT(iip->ili_format.ilf_dsize <= ip->i_df.if_bytes); | 254 | ASSERT(iip->ili_format.ilf_dsize <= ip->i_df.if_bytes); |
253 | } | 255 | } |
254 | (*nvecs)++; | 256 | ilf->ilf_size++; |
255 | } else { | 257 | } else { |
256 | iip->ili_fields &= ~XFS_ILOG_DEXT; | 258 | iip->ili_fields &= ~XFS_ILOG_DEXT; |
257 | } | 259 | } |
@@ -264,11 +266,11 @@ xfs_inode_item_format_data_fork( | |||
264 | if ((iip->ili_fields & XFS_ILOG_DBROOT) && | 266 | if ((iip->ili_fields & XFS_ILOG_DBROOT) && |
265 | ip->i_df.if_broot_bytes > 0) { | 267 | ip->i_df.if_broot_bytes > 0) { |
266 | ASSERT(ip->i_df.if_broot != NULL); | 268 | ASSERT(ip->i_df.if_broot != NULL); |
267 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_IBROOT, | 269 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT, |
268 | ip->i_df.if_broot, | 270 | ip->i_df.if_broot, |
269 | ip->i_df.if_broot_bytes); | 271 | ip->i_df.if_broot_bytes); |
270 | (*nvecs)++; | 272 | ilf->ilf_dsize = ip->i_df.if_broot_bytes; |
271 | iip->ili_format.ilf_dsize = ip->i_df.if_broot_bytes; | 273 | ilf->ilf_size++; |
272 | } else { | 274 | } else { |
273 | ASSERT(!(iip->ili_fields & | 275 | ASSERT(!(iip->ili_fields & |
274 | XFS_ILOG_DBROOT)); | 276 | XFS_ILOG_DBROOT)); |
@@ -291,10 +293,10 @@ xfs_inode_item_format_data_fork( | |||
291 | ip->i_df.if_real_bytes == data_bytes); | 293 | ip->i_df.if_real_bytes == data_bytes); |
292 | ASSERT(ip->i_df.if_u1.if_data != NULL); | 294 | ASSERT(ip->i_df.if_u1.if_data != NULL); |
293 | ASSERT(ip->i_d.di_size > 0); | 295 | ASSERT(ip->i_d.di_size > 0); |
294 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_ILOCAL, | 296 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_ILOCAL, |
295 | ip->i_df.if_u1.if_data, data_bytes); | 297 | ip->i_df.if_u1.if_data, data_bytes); |
296 | (*nvecs)++; | 298 | ilf->ilf_dsize = (unsigned)data_bytes; |
297 | iip->ili_format.ilf_dsize = (unsigned)data_bytes; | 299 | ilf->ilf_size++; |
298 | } else { | 300 | } else { |
299 | iip->ili_fields &= ~XFS_ILOG_DDATA; | 301 | iip->ili_fields &= ~XFS_ILOG_DDATA; |
300 | } | 302 | } |
@@ -303,19 +305,15 @@ xfs_inode_item_format_data_fork( | |||
303 | iip->ili_fields &= | 305 | iip->ili_fields &= |
304 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | | 306 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | |
305 | XFS_ILOG_DEXT | XFS_ILOG_UUID); | 307 | XFS_ILOG_DEXT | XFS_ILOG_UUID); |
306 | if (iip->ili_fields & XFS_ILOG_DEV) { | 308 | if (iip->ili_fields & XFS_ILOG_DEV) |
307 | iip->ili_format.ilf_u.ilfu_rdev = | 309 | ilf->ilf_u.ilfu_rdev = ip->i_df.if_u2.if_rdev; |
308 | ip->i_df.if_u2.if_rdev; | ||
309 | } | ||
310 | break; | 310 | break; |
311 | case XFS_DINODE_FMT_UUID: | 311 | case XFS_DINODE_FMT_UUID: |
312 | iip->ili_fields &= | 312 | iip->ili_fields &= |
313 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | | 313 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | |
314 | XFS_ILOG_DEXT | XFS_ILOG_DEV); | 314 | XFS_ILOG_DEXT | XFS_ILOG_DEV); |
315 | if (iip->ili_fields & XFS_ILOG_UUID) { | 315 | if (iip->ili_fields & XFS_ILOG_UUID) |
316 | iip->ili_format.ilf_u.ilfu_uuid = | 316 | ilf->ilf_u.ilfu_uuid = ip->i_df.if_u2.if_uuid; |
317 | ip->i_df.if_u2.if_uuid; | ||
318 | } | ||
319 | break; | 317 | break; |
320 | default: | 318 | default: |
321 | ASSERT(0); | 319 | ASSERT(0); |
@@ -326,8 +324,9 @@ xfs_inode_item_format_data_fork( | |||
326 | STATIC void | 324 | STATIC void |
327 | xfs_inode_item_format_attr_fork( | 325 | xfs_inode_item_format_attr_fork( |
328 | struct xfs_inode_log_item *iip, | 326 | struct xfs_inode_log_item *iip, |
329 | struct xfs_log_iovec **vecp, | 327 | struct xfs_inode_log_format *ilf, |
330 | int *nvecs) | 328 | struct xfs_log_vec *lv, |
329 | struct xfs_log_iovec **vecp) | ||
331 | { | 330 | { |
332 | struct xfs_inode *ip = iip->ili_inode; | 331 | struct xfs_inode *ip = iip->ili_inode; |
333 | size_t data_bytes; | 332 | size_t data_bytes; |
@@ -348,17 +347,17 @@ xfs_inode_item_format_attr_fork( | |||
348 | * There are not delayed allocation extents | 347 | * There are not delayed allocation extents |
349 | * for attributes, so just point at the array. | 348 | * for attributes, so just point at the array. |
350 | */ | 349 | */ |
351 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_EXT, | 350 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_EXT, |
352 | ip->i_afp->if_u1.if_extents, | 351 | ip->i_afp->if_u1.if_extents, |
353 | ip->i_afp->if_bytes); | 352 | ip->i_afp->if_bytes); |
354 | iip->ili_format.ilf_asize = ip->i_afp->if_bytes; | 353 | ilf->ilf_asize = ip->i_afp->if_bytes; |
355 | #else | 354 | #else |
356 | ASSERT(iip->ili_aextents_buf == NULL); | 355 | ASSERT(iip->ili_aextents_buf == NULL); |
357 | iip->ili_format.ilf_asize = | 356 | ilf->ilf_asize = |
358 | xfs_inode_item_format_extents(ip, vecp, | 357 | xfs_inode_item_format_extents(ip, lv, vecp, |
359 | XFS_ATTR_FORK, XLOG_REG_TYPE_IATTR_EXT); | 358 | XFS_ATTR_FORK, XLOG_REG_TYPE_IATTR_EXT); |
360 | #endif | 359 | #endif |
361 | (*nvecs)++; | 360 | ilf->ilf_size++; |
362 | } else { | 361 | } else { |
363 | iip->ili_fields &= ~XFS_ILOG_AEXT; | 362 | iip->ili_fields &= ~XFS_ILOG_AEXT; |
364 | } | 363 | } |
@@ -371,11 +370,11 @@ xfs_inode_item_format_attr_fork( | |||
371 | ip->i_afp->if_broot_bytes > 0) { | 370 | ip->i_afp->if_broot_bytes > 0) { |
372 | ASSERT(ip->i_afp->if_broot != NULL); | 371 | ASSERT(ip->i_afp->if_broot != NULL); |
373 | 372 | ||
374 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_BROOT, | 373 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_BROOT, |
375 | ip->i_afp->if_broot, | 374 | ip->i_afp->if_broot, |
376 | ip->i_afp->if_broot_bytes); | 375 | ip->i_afp->if_broot_bytes); |
377 | (*nvecs)++; | 376 | ilf->ilf_asize = ip->i_afp->if_broot_bytes; |
378 | iip->ili_format.ilf_asize = ip->i_afp->if_broot_bytes; | 377 | ilf->ilf_size++; |
379 | } else { | 378 | } else { |
380 | iip->ili_fields &= ~XFS_ILOG_ABROOT; | 379 | iip->ili_fields &= ~XFS_ILOG_ABROOT; |
381 | } | 380 | } |
@@ -395,11 +394,11 @@ xfs_inode_item_format_attr_fork( | |||
395 | ASSERT(ip->i_afp->if_real_bytes == 0 || | 394 | ASSERT(ip->i_afp->if_real_bytes == 0 || |
396 | ip->i_afp->if_real_bytes == data_bytes); | 395 | ip->i_afp->if_real_bytes == data_bytes); |
397 | ASSERT(ip->i_afp->if_u1.if_data != NULL); | 396 | ASSERT(ip->i_afp->if_u1.if_data != NULL); |
398 | xlog_copy_iovec(vecp, XLOG_REG_TYPE_IATTR_LOCAL, | 397 | xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_LOCAL, |
399 | ip->i_afp->if_u1.if_data, | 398 | ip->i_afp->if_u1.if_data, |
400 | data_bytes); | 399 | data_bytes); |
401 | (*nvecs)++; | 400 | ilf->ilf_asize = (unsigned)data_bytes; |
402 | iip->ili_format.ilf_asize = (unsigned)data_bytes; | 401 | ilf->ilf_size++; |
403 | } else { | 402 | } else { |
404 | iip->ili_fields &= ~XFS_ILOG_ADATA; | 403 | iip->ili_fields &= ~XFS_ILOG_ADATA; |
405 | } | 404 | } |
@@ -420,28 +419,28 @@ xfs_inode_item_format_attr_fork( | |||
420 | STATIC void | 419 | STATIC void |
421 | xfs_inode_item_format( | 420 | xfs_inode_item_format( |
422 | struct xfs_log_item *lip, | 421 | struct xfs_log_item *lip, |
423 | struct xfs_log_iovec *vecp) | 422 | struct xfs_log_vec *lv) |
424 | { | 423 | { |
425 | struct xfs_inode_log_item *iip = INODE_ITEM(lip); | 424 | struct xfs_inode_log_item *iip = INODE_ITEM(lip); |
426 | struct xfs_inode *ip = iip->ili_inode; | 425 | struct xfs_inode *ip = iip->ili_inode; |
427 | uint nvecs; | 426 | struct xfs_inode_log_format *ilf; |
427 | struct xfs_log_iovec *vecp = NULL; | ||
428 | 428 | ||
429 | xlog_copy_iovec(&vecp, XLOG_REG_TYPE_IFORMAT, | 429 | ilf = xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT, |
430 | &iip->ili_format, | 430 | &iip->ili_format, |
431 | sizeof(struct xfs_inode_log_format)); | 431 | sizeof(struct xfs_inode_log_format)); |
432 | nvecs = 1; | 432 | ilf->ilf_size = 1; |
433 | |||
434 | xlog_copy_iovec(&vecp, XLOG_REG_TYPE_ICORE, | ||
435 | &ip->i_d, | ||
436 | xfs_icdinode_size(ip->i_d.di_version)); | ||
437 | nvecs++; | ||
438 | 433 | ||
439 | if (ip->i_d.di_version == 1) | 434 | if (ip->i_d.di_version == 1) |
440 | xfs_inode_item_format_v1_inode(ip); | 435 | xfs_inode_item_format_v1_inode(ip); |
436 | xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICORE, | ||
437 | &ip->i_d, | ||
438 | xfs_icdinode_size(ip->i_d.di_version)); | ||
439 | ilf->ilf_size++; | ||
441 | 440 | ||
442 | xfs_inode_item_format_data_fork(iip, &vecp, &nvecs); | 441 | xfs_inode_item_format_data_fork(iip, ilf, lv, &vecp); |
443 | if (XFS_IFORK_Q(ip)) { | 442 | if (XFS_IFORK_Q(ip)) { |
444 | xfs_inode_item_format_attr_fork(iip, &vecp, &nvecs); | 443 | xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp); |
445 | } else { | 444 | } else { |
446 | iip->ili_fields &= | 445 | iip->ili_fields &= |
447 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); | 446 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); |
@@ -455,7 +454,6 @@ xfs_inode_item_format( | |||
455 | */ | 454 | */ |
456 | iip->ili_format.ilf_fields = XFS_ILOG_CORE | | 455 | iip->ili_format.ilf_fields = XFS_ILOG_CORE | |
457 | (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); | 456 | (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); |
458 | iip->ili_format.ilf_size = nvecs; | ||
459 | } | 457 | } |
460 | 458 | ||
461 | /* | 459 | /* |