Author: kib
Date: Tue Feb 7 09:51:41 2012
New Revision: 231122
URL: http://svn.freebsd.org/changeset/base/231122
Log:
Sprinkle missed calls to asynchronous UFS_UPDATE() in attempt to
guarantee that all UFS inode metadata changes results in the dirtiness
of the inodeblock. Due to missed inodeblock updates, syncer was
required to fsync each mount point' vnode to guarantee periodic
metadata flush.
Reviewed by: mckusick
Tested by: scottl
MFC after: 2 weeks
Modified:
head/sys/ufs/ufs/ufs_acl.c
head/sys/ufs/ufs/ufs_vnops.c
Modified: head/sys/ufs/ufs/ufs_acl.c
==============================================================================
--- head/sys/ufs/ufs/ufs_acl.c Tue Feb 7 09:40:22 2012 (r231121)
+++ head/sys/ufs/ufs/ufs_acl.c Tue Feb 7 09:51:41 2012 (r231122)
@@ -422,7 +422,8 @@ ufs_setacl_nfs4_internal(struct vnode *v
VN_KNOTE_UNLOCKED(vp, NOTE_ATTRIB);
- return (0);
+ error = UFS_UPDATE(vp, 0);
+ return (error);
}
static int
@@ -591,10 +592,11 @@ ufs_setacl_posix1e(struct vop_setacl_arg
*/
ufs_sync_inode_from_acl(ap->a_aclp, ip);
ip->i_flag |= IN_CHANGE;
+ error = UFS_UPDATE(ap->a_vp, 0);
}
VN_KNOTE_UNLOCKED(ap->a_vp, NOTE_ATTRIB);
- return (0);
+ return (error);
}
int
Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c Tue Feb 7 09:40:22 2012
(r231121)
+++ head/sys/ufs/ufs/ufs_vnops.c Tue Feb 7 09:51:41 2012
(r231122)
@@ -571,8 +571,9 @@ ufs_setattr(ap)
DIP_SET(ip, i_flags, ip->i_flags);
}
ip->i_flag |= IN_CHANGE;
+ error = UFS_UPDATE(vp, 0);
if (vap->va_flags & (IMMUTABLE | APPEND))
- return (0);
+ return (error);
}
if (ip->i_flags & (IMMUTABLE | APPEND))
return (EPERM);
@@ -738,6 +739,9 @@ ufs_markatime(ap)
VI_LOCK(vp);
ip->i_flag |= IN_ACCESS;
VI_UNLOCK(vp);
+ /*
+ * XXXKIB No UFS_UPDATE(ap->a_vp, 0) there.
+ */
return (0);
}
@@ -794,6 +798,9 @@ ufs_chmod(vp, mode, cred, td)
if ((vp->v_mount->mnt_flag & MNT_NFS4ACLS) != 0)
error = ufs_update_nfs4_acl_after_mode_change(vp, mode,
ip->i_uid, cred, td);
#endif
+ if (error == 0 && (ip->i_flag & IN_CHANGE) != 0)
+ error = UFS_UPDATE(vp, 0);
+
return (error);
}
@@ -912,7 +919,8 @@ good:
DIP_SET(ip, i_mode, ip->i_mode);
}
}
- return (0);
+ error = UFS_UPDATE(vp, 0);
+ return (error);
}
static int
@@ -2079,6 +2087,7 @@ ufs_rmdir(ap)
dp->i_nlink--;
DIP_SET(dp, i_nlink, dp->i_nlink);
dp->i_flag |= IN_CHANGE;
+ error = UFS_UPDATE(dvp, 0);
ip->i_nlink--;
DIP_SET(ip, i_nlink, ip->i_nlink);
ip->i_flag |= IN_CHANGE;
@@ -2122,6 +2131,7 @@ ufs_symlink(ap)
ip->i_size = len;
DIP_SET(ip, i_size, len);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ error = UFS_UPDATE(vp, 0);
} else
error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0,
UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"