VFS accounting: isolate the code to find the real mp
authorFrançois Tigeot <ftigeot@wolfpond.org>
Thu, 22 Mar 2012 12:48:33 +0000 (13:48 +0100)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Thu, 22 Mar 2012 12:48:33 +0000 (13:48 +0100)
* It was not specific to vop_write()

* Put it in a standalone vq_vptomp() function so that it may be easily
  used in other places

sys/kern/vfs_quota.c
sys/kern/vfs_vopops.c
sys/sys/vfs_quota.h

index f1af1f3..ea67458 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 François Tigeot <ftigeot@wolpond.org>
+ * Copyright (c) 2011,2012 François Tigeot <ftigeot@wolpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -331,3 +331,23 @@ done:
 
        return error;
 }
+
+/* 
+ * Returns a valid mount point for accounting purposes
+ * We cannot simply use vp->v_mount if the vnode belongs
+ * to a PFS mount point
+ */
+struct mount*
+vq_vptomp(struct vnode *vp)
+{
+       /* XXX: vp->v_pfsmp may point to a freed structure
+       * we use mountlist_exists() to check if it is valid
+       * before using it */
+       if ((vp->v_pfsmp != NULL) && (mountlist_exists(vp->v_pfsmp))) {
+               /* This is a PFS, use a copy of the real mp */
+               return vp->v_pfsmp;
+       } else {
+               /* Not a PFS or a PFS beeing unmounted */
+               return vp->v_mount;
+       }
+}
index b544b79..815a89c 100644 (file)
@@ -439,17 +439,7 @@ vop_write(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int ioflag,
        DO_OPS(ops, error, &ap, vop_write);
        if ((error == 0) && do_accounting) {
                size_after = vp->v_filesize;
-               /* does this vnode belong to a pfs/nullfs mount ? */
-               /* XXX: vp->v_pfsmp may point to a freed structure
-               * we use mountlist_exists() to check if it is valid
-               * before using it */
-               if ((vp->v_pfsmp != NULL) && (mountlist_exists(vp->v_pfsmp))) {
-                       /* yes, use a copy of the real mp */
-                       mp = vp->v_pfsmp;
-               } else {
-                       /* no, we can use vp->v_mount directly */
-                       mp = vp->v_mount;
-               }
+               mp = vq_vptomp(vp);
                VFS_ACCOUNT(mp, va.va_uid, va.va_gid, size_after - size_before);
        }
        VFS_MPUNLOCK(vp->v_mount);
index 5802270..d6c438a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 François Tigeot <ftigeot@wolpond.org>
+ * Copyright (c) 2011,2012 François Tigeot <ftigeot@wolpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,5 +43,7 @@ int vquotactl(const char *path, struct plistref *pref);
 
 extern int vfs_accounting_enabled;
 
+struct mount* vq_vptomp(struct vnode*);
+
 #endif