aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/linux-2.6/xfs_iops.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 9c4d99709705..11edd72baac7 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -179,18 +179,19 @@ xfs_ichgtime_fast(
179 */ 179 */
180STATIC void 180STATIC void
181xfs_validate_fields( 181xfs_validate_fields(
182 struct inode *ip, 182 struct inode *inode)
183 bhv_vattr_t *vattr)
184{ 183{
185 vattr->va_mask = XFS_AT_NLINK|XFS_AT_SIZE|XFS_AT_NBLOCKS; 184 struct xfs_inode *ip = XFS_I(inode);
186 if (!xfs_getattr(XFS_I(ip), vattr, ATTR_LAZY)) { 185 loff_t size;
187 ip->i_nlink = vattr->va_nlink; 186
188 ip->i_blocks = vattr->va_nblocks; 187 inode->i_nlink = ip->i_d.di_nlink;
189 188 inode->i_blocks =
190 /* we're under i_sem so i_size can't change under us */ 189 XFS_FSB_TO_BB(ip->i_mount, ip->i_d.di_nblocks +
191 if (i_size_read(ip) != vattr->va_size) 190 ip->i_delayed_blks);
192 i_size_write(ip, vattr->va_size); 191 /* we're under i_sem so i_size can't change under us */
193 } 192 size = XFS_ISIZE(ip);
193 if (i_size_read(inode) != size)
194 i_size_write(inode, size);
194} 195}
195 196
196/* 197/*
@@ -334,9 +335,9 @@ xfs_vn_mknod(
334 if (S_ISCHR(mode) || S_ISBLK(mode)) 335 if (S_ISCHR(mode) || S_ISBLK(mode))
335 ip->i_rdev = rdev; 336 ip->i_rdev = rdev;
336 else if (S_ISDIR(mode)) 337 else if (S_ISDIR(mode))
337 xfs_validate_fields(ip, &vattr); 338 xfs_validate_fields(ip);
338 d_instantiate(dentry, ip); 339 d_instantiate(dentry, ip);
339 xfs_validate_fields(dir, &vattr); 340 xfs_validate_fields(dir);
340 } 341 }
341 return -error; 342 return -error;
342} 343}
@@ -391,7 +392,6 @@ xfs_vn_link(
391{ 392{
392 struct inode *ip; /* inode of guy being linked to */ 393 struct inode *ip; /* inode of guy being linked to */
393 bhv_vnode_t *vp; /* vp of name being linked */ 394 bhv_vnode_t *vp; /* vp of name being linked */
394 bhv_vattr_t vattr;
395 int error; 395 int error;
396 396
397 ip = old_dentry->d_inode; /* inode being linked to */ 397 ip = old_dentry->d_inode; /* inode being linked to */
@@ -403,7 +403,7 @@ xfs_vn_link(
403 VN_RELE(vp); 403 VN_RELE(vp);
404 } else { 404 } else {
405 xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED); 405 xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
406 xfs_validate_fields(ip, &vattr); 406 xfs_validate_fields(ip);
407 d_instantiate(dentry, ip); 407 d_instantiate(dentry, ip);
408 } 408 }
409 return -error; 409 return -error;
@@ -415,15 +415,14 @@ xfs_vn_unlink(
415 struct dentry *dentry) 415 struct dentry *dentry)
416{ 416{
417 struct inode *inode; 417 struct inode *inode;
418 bhv_vattr_t vattr;
419 int error; 418 int error;
420 419
421 inode = dentry->d_inode; 420 inode = dentry->d_inode;
422 421
423 error = xfs_remove(XFS_I(dir), dentry); 422 error = xfs_remove(XFS_I(dir), dentry);
424 if (likely(!error)) { 423 if (likely(!error)) {
425 xfs_validate_fields(dir, &vattr); /* size needs update */ 424 xfs_validate_fields(dir); /* size needs update */
426 xfs_validate_fields(inode, &vattr); 425 xfs_validate_fields(inode);
427 } 426 }
428 return -error; 427 return -error;
429} 428}
@@ -451,8 +450,8 @@ xfs_vn_symlink(
451 if (likely(!error)) { 450 if (likely(!error)) {
452 ip = vn_to_inode(cvp); 451 ip = vn_to_inode(cvp);
453 d_instantiate(dentry, ip); 452 d_instantiate(dentry, ip);
454 xfs_validate_fields(dir, &va); 453 xfs_validate_fields(dir);
455 xfs_validate_fields(ip, &va); 454 xfs_validate_fields(ip);
456 } else { 455 } else {
457 xfs_cleanup_inode(dir, cvp, dentry, 0); 456 xfs_cleanup_inode(dir, cvp, dentry, 0);
458 } 457 }
@@ -466,13 +465,12 @@ xfs_vn_rmdir(
466 struct dentry *dentry) 465 struct dentry *dentry)
467{ 466{
468 struct inode *inode = dentry->d_inode; 467 struct inode *inode = dentry->d_inode;
469 bhv_vattr_t vattr;
470 int error; 468 int error;
471 469
472 error = xfs_rmdir(XFS_I(dir), dentry); 470 error = xfs_rmdir(XFS_I(dir), dentry);
473 if (likely(!error)) { 471 if (likely(!error)) {
474 xfs_validate_fields(inode, &vattr); 472 xfs_validate_fields(inode);
475 xfs_validate_fields(dir, &vattr); 473 xfs_validate_fields(dir);
476 } 474 }
477 return -error; 475 return -error;
478} 476}
@@ -486,7 +484,6 @@ xfs_vn_rename(
486{ 484{
487 struct inode *new_inode = ndentry->d_inode; 485 struct inode *new_inode = ndentry->d_inode;
488 bhv_vnode_t *tvp; /* target directory */ 486 bhv_vnode_t *tvp; /* target directory */
489 bhv_vattr_t vattr;
490 int error; 487 int error;
491 488
492 tvp = vn_from_inode(ndir); 489 tvp = vn_from_inode(ndir);
@@ -494,10 +491,10 @@ xfs_vn_rename(
494 error = xfs_rename(XFS_I(odir), odentry, tvp, ndentry); 491 error = xfs_rename(XFS_I(odir), odentry, tvp, ndentry);
495 if (likely(!error)) { 492 if (likely(!error)) {
496 if (new_inode) 493 if (new_inode)
497 xfs_validate_fields(new_inode, &vattr); 494 xfs_validate_fields(new_inode);
498 xfs_validate_fields(odir, &vattr); 495 xfs_validate_fields(odir);
499 if (ndir != odir) 496 if (ndir != odir)
500 xfs_validate_fields(ndir, &vattr); 497 xfs_validate_fields(ndir);
501 } 498 }
502 return -error; 499 return -error;
503} 500}