changes for whiteouts and union filesystem
[unix-history] / usr / src / sys / ufs / ffs / ffs_vnops.c
index 8706f1e..f49458c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)ffs_vnops.c 8.5 (Berkeley) %G%
+ *     @(#)ffs_vnops.c 8.9 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -40,6 +40,7 @@ struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
        { &vop_default_desc, vn_default_error },
        { &vop_lookup_desc, ufs_lookup },               /* lookup */
        { &vop_create_desc, ufs_create },               /* create */
        { &vop_default_desc, vn_default_error },
        { &vop_lookup_desc, ufs_lookup },               /* lookup */
        { &vop_create_desc, ufs_create },               /* create */
+       { &vop_whiteout_desc, ufs_whiteout },           /* whiteout */
        { &vop_mknod_desc, ufs_mknod },                 /* mknod */
        { &vop_open_desc, ufs_open },                   /* open */
        { &vop_close_desc, ufs_close },                 /* close */
        { &vop_mknod_desc, ufs_mknod },                 /* mknod */
        { &vop_open_desc, ufs_open },                   /* open */
        { &vop_close_desc, ufs_close },                 /* close */
@@ -63,7 +64,7 @@ struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
        { &vop_readlink_desc, ufs_readlink },           /* readlink */
        { &vop_abortop_desc, ufs_abortop },             /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
        { &vop_readlink_desc, ufs_readlink },           /* readlink */
        { &vop_abortop_desc, ufs_abortop },             /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
-       { &vop_reclaim_desc, ufs_reclaim },             /* reclaim */
+       { &vop_reclaim_desc, ffs_reclaim },             /* reclaim */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, ufs_bmap },                   /* bmap */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, ufs_bmap },                   /* bmap */
@@ -74,6 +75,7 @@ struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
        { &vop_advlock_desc, ufs_advlock },             /* advlock */
        { &vop_blkatoff_desc, ffs_blkatoff },           /* blkatoff */
        { &vop_valloc_desc, ffs_valloc },               /* valloc */
        { &vop_advlock_desc, ufs_advlock },             /* advlock */
        { &vop_blkatoff_desc, ffs_blkatoff },           /* blkatoff */
        { &vop_valloc_desc, ffs_valloc },               /* valloc */
+       { &vop_reallocblks_desc, ffs_reallocblks },     /* reallocblks */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, ffs_truncate },           /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, ffs_truncate },           /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
@@ -111,7 +113,7 @@ struct vnodeopv_entry_desc ffs_specop_entries[] = {
        { &vop_readlink_desc, spec_readlink },          /* readlink */
        { &vop_abortop_desc, spec_abortop },            /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
        { &vop_readlink_desc, spec_readlink },          /* readlink */
        { &vop_abortop_desc, spec_abortop },            /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
-       { &vop_reclaim_desc, ufs_reclaim },             /* reclaim */
+       { &vop_reclaim_desc, ffs_reclaim },             /* reclaim */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, spec_bmap },                  /* bmap */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, spec_bmap },                  /* bmap */
@@ -122,6 +124,7 @@ struct vnodeopv_entry_desc ffs_specop_entries[] = {
        { &vop_advlock_desc, spec_advlock },            /* advlock */
        { &vop_blkatoff_desc, spec_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, spec_valloc },              /* valloc */
        { &vop_advlock_desc, spec_advlock },            /* advlock */
        { &vop_blkatoff_desc, spec_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, spec_valloc },              /* valloc */
+       { &vop_reallocblks_desc, spec_reallocblks },    /* reallocblks */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, spec_truncate },          /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, spec_truncate },          /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
@@ -160,7 +163,7 @@ struct vnodeopv_entry_desc ffs_fifoop_entries[] = {
        { &vop_readlink_desc, fifo_readlink },          /* readlink */
        { &vop_abortop_desc, fifo_abortop },            /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
        { &vop_readlink_desc, fifo_readlink },          /* readlink */
        { &vop_abortop_desc, fifo_abortop },            /* abortop */
        { &vop_inactive_desc, ufs_inactive },           /* inactive */
-       { &vop_reclaim_desc, ufs_reclaim },             /* reclaim */
+       { &vop_reclaim_desc, ffs_reclaim },             /* reclaim */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, fifo_bmap },                  /* bmap */
        { &vop_lock_desc, ufs_lock },                   /* lock */
        { &vop_unlock_desc, ufs_unlock },               /* unlock */
        { &vop_bmap_desc, fifo_bmap },                  /* bmap */
@@ -171,6 +174,7 @@ struct vnodeopv_entry_desc ffs_fifoop_entries[] = {
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
        { &vop_advlock_desc, fifo_advlock },            /* advlock */
        { &vop_blkatoff_desc, fifo_blkatoff },          /* blkatoff */
        { &vop_valloc_desc, fifo_valloc },              /* valloc */
+       { &vop_reallocblks_desc, fifo_reallocblks },    /* reallocblks */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, fifo_truncate },          /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
        { &vop_vfree_desc, ffs_vfree },                 /* vfree */
        { &vop_truncate_desc, fifo_truncate },          /* truncate */
        { &vop_update_desc, ffs_update },               /* update */
@@ -181,6 +185,7 @@ struct vnodeopv_desc ffs_fifoop_opv_desc =
        { &ffs_fifoop_p, ffs_fifoop_entries };
 #endif /* FIFO */
 
        { &ffs_fifoop_p, ffs_fifoop_entries };
 #endif /* FIFO */
 
+#ifdef DEBUG
 /*
  * Enabling cluster read/write operations.
  */
 /*
  * Enabling cluster read/write operations.
  */
@@ -189,6 +194,11 @@ int doclusterread = 1;
 struct ctldebug debug11 = { "doclusterread", &doclusterread };
 int doclusterwrite = 1;
 struct ctldebug debug12 = { "doclusterwrite", &doclusterwrite };
 struct ctldebug debug11 = { "doclusterread", &doclusterread };
 int doclusterwrite = 1;
 struct ctldebug debug12 = { "doclusterwrite", &doclusterwrite };
+#else
+/* XXX for ufs_readwrite */
+#define doclusterread 1
+#define doclusterwrite 1
+#endif
 
 #include <ufs/ufs/ufs_readwrite.c>
 
 
 #include <ufs/ufs/ufs_readwrite.c>
 
@@ -251,3 +261,22 @@ loop:
        tv = time;
        return (VOP_UPDATE(ap->a_vp, &tv, &tv, ap->a_waitfor == MNT_WAIT));
 }
        tv = time;
        return (VOP_UPDATE(ap->a_vp, &tv, &tv, ap->a_waitfor == MNT_WAIT));
 }
+
+/*
+ * Reclaim an inode so that it can be used for other purposes.
+ */
+int
+ffs_reclaim(ap)
+       struct vop_reclaim_args /* {
+               struct vnode *a_vp;
+       } */ *ap;
+{
+       register struct vnode *vp = ap->a_vp;
+       int error;
+
+       if (error = ufs_reclaim(vp))
+               return (error);
+       FREE(vp->v_data, M_FFSNODE);
+       vp->v_data = NULL;
+       return (0);
+}