SYSTEM_PERIODIC_HOLD = MATCH_EXP_MachineDisk =!= UNDEFINED && \
                        DiskUsage > int(MATCH_EXP_MachineDiskString)
 {endcode}
+
+{section: What if you care about free disk space, not disk space used?}
+
+The above sections are helpful when you are comparing against the disk space used, but sometimes it is better to worry about the free disk space.  In large environments, especially when some of the execute nodes are desktop machines, hard drives aren't always the same size.  In such cases, you might prefer to be concerned about the remaining space on the disk.  The policy settings are similar, with a few small changes.
+
+{subsection: How to preempt (evict) a job when the disk is near full}
+
+As above, the following configuration settings should be put in the config file of the execute machines (or the whole pool).  The TotalDisk {quote: ClassAd} provides the amount of disk space free, not the total capacity of the disk.
+
+{code}
+MIN_FREE_DISK_KB = insert_number_here
+DISK_EXCEEDED = TotalDisk < $(MIN_FREE_DISK_KB)
+
+PREEMPT = ($(PREEMPT)) || ($(DISK_EXCEEDED))
+
+WANT_SUSPEND = ($(WANT_SUSPEND)) && ($(DISK_EXCEEDED)) =!= TRUE
+{endcode}
+
+{subsection: How to hold/remove a job running on a near-full disk}
+
+Jobs can hold or remove themselves by specifying a periodic_hold or periodic_remove expression.  The schedd can also hold or remove jobs as dictated by the configuration expressions SYSTEM_PERIODIC_HOLD or SYSTEM_PERIODIC_REMOVE.  These are all submit-side controls, whereas the PREEMPT example above is an execute-side control.  One problem with the PREEMPT example is that it doesn't do a very good job of communicating to the job owner why the job was evicted.  Putting the job on hold may help communicate better.  Then the user knows to resubmit the job with disk requirements or investigate why the job used more disk than it should have.  The following example configuration shows how to put jobs on hold from the submit-side when the disk is nearly full.
+
+{code}
+# When a job matches, insert the machine disk space into the
+# job ClassAd so periodic_remove can refer to it.
+MachineTotalDiskString = "$$(TotalDisk)"
+SUBMIT_EXPRS = $(SUBMIT_EXPRS)  MachineTotalDiskString
+
+MIN_FREE_DISK_FOR_HOLD = ( MATCH_TotalDisk - insert_a_value_in_KB_here )
+
+SYSTEM_PERIODIC_HOLD = MATCH_EXP_MachineTotalDisk =!= UNDEFINED && \
+                      ( DiskUsage > $(MIN_FREE_DISK_FOR_HOLD) )
+{endcode}