aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode_item.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_inode_item.c')
-rw-r--r--fs/xfs/xfs_inode_item.c92
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(
163STATIC int 163STATIC int
164xfs_inode_item_format_extents( 164xfs_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(
212STATIC void 213STATIC void
213xfs_inode_item_format_data_fork( 214xfs_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(
326STATIC void 324STATIC void
327xfs_inode_item_format_attr_fork( 325xfs_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(
420STATIC void 419STATIC void
421xfs_inode_item_format( 420xfs_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/*