Index: programs/mythbackend/mainserver.cpp
===================================================================
--- programs/mythbackend/mainserver.cpp	(revision 9953)
+++ programs/mythbackend/mainserver.cpp	(working copy)
@@ -1341,16 +1341,22 @@
     if (followLinks)
     {
         QFileInfo finfo(filename);
-        if (finfo.isSymLink() && (err = unlink(finfo.readLink().local8Bit())))
+        if (finfo.isSymLink() && (err = GradualDelete(finfo.readLink())))
         {
             VERBOSE(VB_IMPORTANT, QString("Error deleting '%1' @ '%2', %3")
                     .arg(filename).arg(finfo.readLink().local8Bit())
                     .arg(strerror(errno)));
         }
+        if ((err = unlink(filename.local8Bit())))
+            VERBOSE(VB_IMPORTANT, QString("Error deleting '%1', %2")
+                    .arg(filename).arg(strerror(errno)));
     }
-    if ((err = unlink(filename.local8Bit())))
-        VERBOSE(VB_IMPORTANT, QString("Error deleting '%1', %2")
-                .arg(filename).arg(strerror(errno)));
+    else
+    {
+        if ((err = GradualDelete(filename)))
+            VERBOSE(VB_IMPORTANT, QString("Error deleting '%1', %2")
+                    .arg(filename).arg(strerror(errno)));
+    }
     
     sleep(2);
 
@@ -1474,6 +1480,32 @@
     deletelock.unlock();
 }
 
+// Gradually delete a file by repeatedly truncating it. Helps to spread
+// the I/O load on some filesystems (e.g ext3).
+int MainServer::GradualDelete(QString filename)
+{
+    int err, increment;
+    struct stat buf;
+
+    if ((increment = gContext->GetNumSetting("GradualDeleteIncrement", 0)) > 0)
+    {
+        while (1)
+        {
+            // Get the file size. We can't use QFileInfo.size() because 
+            // it's only 32-bit (at least in QT3).
+            stat(filename.local8Bit(), &buf);
+            if (buf.st_size <= increment) break;
+
+            if ((err = truncate(filename.local8Bit(), buf.st_size - increment)))
+                return err;
+            
+            sleep(2);
+        }
+    }
+
+    return unlink(filename.local8Bit());
+}
+
 void MainServer::HandleCheckRecordingActive(QStringList &slist, 
                                             PlaybackSock *pbs)
 {
Index: programs/mythbackend/mainserver.h
===================================================================
--- programs/mythbackend/mainserver.h	(revision 9953)
+++ programs/mythbackend/mainserver.h	(working copy)
@@ -142,6 +142,7 @@
 
     static void *SpawnDeleteThread(void *param);
     void DoDeleteThread(DeleteStruct *ds);
+    int GradualDelete(QString filename);
 
     LiveTVChain *GetExistingChain(QString id);
     LiveTVChain *GetExistingChain(QSocket *sock);
