VFS accounting: handle file truncation on open(2)
authorFrancois Tigeot <ftigeot@wolfpond.org>
Thu, 22 Mar 2012 16:51:47 +0000 (17:51 +0100)
committerFran├žois Tigeot <ftigeot@wolfpond.org>
Thu, 22 Mar 2012 17:50:10 +0000 (18:50 +0100)
* Files succesfully opened with O_TRUNC are truncated to zero length.
  This case was not previously handled, leading to a growing drift
  between VFS counters and reality.

* Fix a buildworld issue caused by the last VFS accounting commit

sys/kern/vfs_vnops.c
sys/sys/vfs_quota.h

index 27ac2b1..0bd1aff 100644 (file)
@@ -104,6 +104,8 @@ vn_open(struct nlookupdata *nd, struct file *fp, int fmode, int cmode)
        struct vattr *vap = &vat;
        int error;
        u_int flags;
+       uint64_t osize;
+       struct mount *mp;
 
        /*
         * Certain combinations are illegal
@@ -233,11 +235,17 @@ again:
        if (fmode & O_TRUNC) {
                vn_unlock(vp);                          /* XXX */
                vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);   /* XXX */
+               osize = vp->v_filesize;
                VATTR_NULL(vap);
                vap->va_size = 0;
                error = VOP_SETATTR(vp, vap, cred);
                if (error)
                        goto bad;
+               error = VOP_GETATTR(vp, vap);
+               if (error)
+                       goto bad;
+               mp = vq_vptomp(vp);
+               VFS_ACCOUNT(mp, vap->va_uid, vap->va_gid, -osize);
        }
 
        /*
index d6c438a..9329109 100644 (file)
@@ -34,6 +34,7 @@
 #define _SYS_VFSQUOTA_H_
 
 #include <sys/mount.h>
+#include <sys/vnode.h>
 #include <libprop/proplib.h>
 
 extern void vq_init(struct mount*);
@@ -43,7 +44,9 @@ int vquotactl(const char *path, struct plistref *pref);
 
 extern int vfs_accounting_enabled;
 
+#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
 struct mount* vq_vptomp(struct vnode*);
+#endif
 
 #endif