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,
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to