VFS accounting: do not call initialization functions directly
authorFrancois Tigeot <ftigeot@wolfpond.org>
Sun, 15 Apr 2012 19:31:39 +0000 (21:31 +0200)
committerFran├žois Tigeot <ftigeot@wolfpond.org>
Sun, 15 Apr 2012 19:42:02 +0000 (21:42 +0200)
* Use a macro to check if VFS accounting is enabled and they have been
  properly enabled for this mount point first

* Change the return type of vfs_acdone() to void. This function does
  not return errors and should not make a filesystem unmount fail.

sys/kern/vfs_default.c
sys/kern/vfs_vfsops.c
sys/sys/mount.h

index fd91d5c..37bacaf 100644 (file)
@@ -1485,7 +1485,7 @@ vfs_stdac_init(struct mount *mp)
        return (0);
 }
 
-int
+void
 vfs_stdac_done(struct mount *mp)
 {
        const char* fs_type;
@@ -1501,10 +1501,9 @@ vfs_stdac_done(struct mount *mp)
                }
        }
        if (fstype_ok == 0)
-               return (0);
+               return;
 
        vq_done(mp);
-       return (0);
 }
 
 void
index 9d52a3e..ade0eca 100644 (file)
@@ -115,7 +115,7 @@ vfs_start(struct mount *mp, int flags)
        if (error == 0)
                /* do not call vfs_acinit on mount updates */
                if ((mp->mnt_flag & MNT_UPDATE) == 0)
-                       error = (mp->mnt_op->vfs_acinit)(mp);
+                       VFS_ACINIT(mp,error);
        VFS_MPUNLOCK(mp);
        if (error == EMOUNTEXIT)
                error = 0;
@@ -134,12 +134,10 @@ vfs_unmount(struct mount *mp, int mntflags)
        void *ctx;
 
        VFS_MPLOCK1(mp);
-       error = (mp->mnt_op->vfs_acdone)(mp); 
-       if (error == 0) {
-               flags = mp->mnt_kern_flag;
-               ctx = vn_syncer_thr_getctx(mp);
-               error = (mp->mnt_op->vfs_unmount)(mp, mntflags);
-       }
+       VFS_ACDONE(mp);
+       flags = mp->mnt_kern_flag;
+       ctx = vn_syncer_thr_getctx(mp);
+       error = (mp->mnt_op->vfs_unmount)(mp, mntflags);
        if (error == 0 &&
            flags & MNTK_THR_SYNC)
                vn_syncer_thr_stop(ctx);
index 14c9bc0..55ceb3b 100644 (file)
@@ -549,7 +549,7 @@ typedef int vfs_extattrctl_t(struct mount *mp, int cmd, struct vnode *vp,
                    int attrnamespace, const char *attrname,
                    struct ucred *cred);
 typedef int vfs_acinit_t(struct mount *mp);
-typedef int vfs_acdone_t(struct mount *mp);
+typedef void vfs_acdone_t(struct mount *mp);
 typedef void vfs_account_t(struct mount *mp,
                        uid_t uid, gid_t gid, int64_t delta);
 typedef void vfs_ncpgen_set_t(struct mount *mp, struct namecache *ncp);
@@ -630,6 +630,12 @@ struct vfsops {
 #define VFS_ACCOUNT(MP, U, G, D) \
        if ((MP->mnt_op->vfs_account != NULL) && (D != 0)) \
                MP->mnt_op->vfs_account(MP, U, G, D);
+#define VFS_ACINIT(MP, ERROR) \
+       if (vfs_accounting_enabled && MP->mnt_op->vfs_acinit != NULL) \
+               ERROR = MP->mnt_op->vfs_acinit(MP);
+#define VFS_ACDONE(MP) \
+       if (vfs_accounting_enabled && MP->mnt_op->vfs_acdone != NULL) \
+               MP->mnt_op->vfs_acdone(MP);
 #define VFS_NCPGEN_SET(MP, NCP) \
        MP->mnt_op->vfs_ncpgen_set(MP, NCP)
 #define VFS_NCPGEN_TEST(MP, NCP) \