From 741400fa666f9754337652c624e95aa6bdfaf98c Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 16 Feb 2008 13:38:22 +0100 Subject: [PATCH] Fixed handling recordings on other file systems than the video directory --- HISTORY | 9 ++++++++- UPDATE-1.6.0 | 13 ++++++++++++- recording.c | 46 ++++++++++++++++++++++++---------------------- tools.c | 17 ++++++++++++++++- tools.h | 3 ++- videodir.c | 11 ++++++++++- videodir.h | 3 ++- 7 files changed, 74 insertions(+), 28 deletions(-) diff --git a/HISTORY b/HISTORY index 6c146150..e4494700 100644 --- a/HISTORY +++ b/HISTORY @@ -5579,7 +5579,7 @@ Video Disk Recorder Revision History is not available, in order to allow staying on an encrypted channel that takes a while for the CAM to start decrypting. -2008-02-10: Version 1.5.15 +2008-02-16: Version 1.5.15 - Updated the Italian OSD texts (thanks to Diego Pierotto). - Added option -i to the pictures plugin's pic2mpg to ignore unknown file types. @@ -5624,3 +5624,10 @@ Video Disk Recorder Revision History stopped immediately (thanks to Mikko Matilainen for reporting a possible crash if the Info key is pressed after deleting the currently replayed recording). - Updated the Russian OSD texts (thanks to Oleg Roitburd). +- When determining the amount of free disk space, any deleted (but not yet removed) + recordings on different file systems (that are mounted under the video directory) + are no longer taken into account. +- When running out of disk space during a recording, only such deleted or old + recordings are removed, that actually are on the video directory file system(s). + This prevents VDR from accidentally deleting recordings on other file systems, + which would not add any free space to the video directory. diff --git a/UPDATE-1.6.0 b/UPDATE-1.6.0 index 39f8073c..1a79e517 100644 --- a/UPDATE-1.6.0 +++ b/UPDATE-1.6.0 @@ -63,9 +63,18 @@ Channels: parameter to 0 turns off the automatic channel switching, and the user will have to confirm the entry by pressing the "Ok" key. -Recording: +Recordings: - The info.vdr file now also stores the name of the channel. +- When deleting the recording that is currently replayed, the replay is now + stopped immediately. +- When determining the amount of free disk space, any deleted (but not yet removed) + recordings on different file systems (that are mounted under the video directory) + are no longer taken into account. +- When running out of disk space during a recording, only such deleted or old + recordings are removed, that actually are on the video directory file system(s). + This prevents VDR from accidentally deleting recordings on other file systems, + which would not add any free space to the video directory. SVDRP: @@ -128,3 +137,5 @@ Misc: menu. - Changed the message "Upcoming VPS recording!" to "Upcoming recording!" because it applies to non-VPS recordings as well. +- Limiting the length of the recording name in timers in case VDR is run with + --vfat, in order to avoid names that are too long for Windows. diff --git a/recording.c b/recording.c index 894757c7..4ecf4a96 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.160 2008/02/15 15:50:06 kls Exp $ + * $Id: recording.c 1.161 2008/02/16 13:31:39 kls Exp $ */ #include "recording.h" @@ -144,10 +144,12 @@ void AssertFreeDiskSpace(int Priority, bool Force) cThreadLock DeletedRecordingsLock(&DeletedRecordings); if (DeletedRecordings.Count()) { cRecording *r = DeletedRecordings.First(); - cRecording *r0 = r; + cRecording *r0 = NULL; while (r) { - if (r->start < r0->start) - r0 = r; + if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space + if (!r0 || r->start < r0->start) + r0 = r; + } r = DeletedRecordings.Next(r); } if (r0 && r0->Remove()) { @@ -156,11 +158,13 @@ void AssertFreeDiskSpace(int Priority, bool Force) return; } } - // DeletedRecordings was empty, so to be absolutely sure there are no - // deleted recordings we need to double check: - DeletedRecordings.Update(true); - if (DeletedRecordings.Count()) - return; // the next call will actually remove it + else { + // DeletedRecordings was empty, so to be absolutely sure there are no + // deleted recordings we need to double check: + DeletedRecordings.Update(true); + if (DeletedRecordings.Count()) + return; // the next call will actually remove it + } // No "deleted" files to remove, so let's see if we can delete a recording: isyslog("...no deleted recording found, trying to delete an old recording..."); cThreadLock RecordingsLock(&Recordings); @@ -168,15 +172,17 @@ void AssertFreeDiskSpace(int Priority, bool Force) cRecording *r = Recordings.First(); cRecording *r0 = NULL; while (r) { - if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever - if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority - (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired - if (r0) { - if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start)) - r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities) + if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space + if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever + if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority + (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired + if (r0) { + if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start)) + r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities) + } + else + r0 = r; } - else - r0 = r; } } r = Recordings.Next(r); @@ -1035,7 +1041,7 @@ int cRecordings::TotalFileSizeMB(void) int size = 0; LOCK_THREAD; for (cRecording *recording = First(); recording; recording = Next(recording)) { - if (recording->fileSizeMB > 0) + if (recording->fileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName())) size += recording->fileSizeMB; } return size; @@ -1401,10 +1407,6 @@ bool cIndexFile::IsStillRecording() // --- cFileName ------------------------------------------------------------- -#include -#include -#include "videodir.h" - #define MAXFILESPERRECORDING 255 #define RECORDFILESUFFIX "/%03d.vdr" #define RECORDFILESUFFIXLEN 20 // some additional bytes for safety... diff --git a/tools.c b/tools.c index 43f5bfad..64f4464d 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.142 2008/02/15 14:45:05 kls Exp $ + * $Id: tools.c 1.143 2008/02/16 13:38:22 kls Exp $ */ #include "tools.h" @@ -277,6 +277,21 @@ cString itoa(int n) return buf; } +bool EntriesOnSameFileSystem(const char *File1, const char *File2) +{ + struct statfs statFs; + if (statfs(File1, &statFs) == 0) { + fsid_t fsid1 = statFs.f_fsid; + if (statfs(File2, &statFs) == 0) + return memcmp(&statFs.f_fsid, &fsid1, sizeof(fsid1)) == 0; + else + LOG_ERROR_STR(File2); + } + else + LOG_ERROR_STR(File1); + return false; +} + int FreeDiskSpaceMB(const char *Directory, int *UsedMB) { if (UsedMB) diff --git a/tools.h b/tools.h index dd93ef02..4013b2ab 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 1.111 2008/02/15 14:10:11 kls Exp $ + * $Id: tools.h 1.112 2008/02/16 13:00:16 kls Exp $ */ #ifndef __TOOLS_H @@ -193,6 +193,7 @@ int numdigits(int n); bool isnumber(const char *s); cString itoa(int n); cString AddDirectory(const char *DirName, const char *FileName); +bool EntriesOnSameFileSystem(const char *File1, const char *File2); int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL); bool DirectoryOk(const char *DirName, bool LogErrors = false); bool MakeDirs(const char *FileName, bool IsDirectory = false); diff --git a/videodir.c b/videodir.c index a07ed28e..e61e3cbc 100644 --- a/videodir.c +++ b/videodir.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: videodir.c 1.14 2005/12/18 10:33:20 kls Exp $ + * $Id: videodir.c 1.15 2008/02/16 13:00:03 kls Exp $ */ #include "videodir.h" @@ -232,3 +232,12 @@ void RemoveEmptyVideoDirectories(void) } while (Dir.Next()); } +bool IsOnVideoDirectoryFileSystem(const char *FileName) +{ + cVideoDirectory Dir; + do { + if (EntriesOnSameFileSystem(Dir.Name(), FileName)) + return true; + } while (Dir.Next()); + return false; +} diff --git a/videodir.h b/videodir.h index 6dd2d8c1..253e07b0 100644 --- a/videodir.h +++ b/videodir.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: videodir.h 1.6 2005/10/31 11:50:23 kls Exp $ + * $Id: videodir.h 1.7 2008/02/16 12:53:11 kls Exp $ */ #ifndef __VIDEODIR_H @@ -23,5 +23,6 @@ bool VideoFileSpaceAvailable(int SizeMB); int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent cString PrefixVideoFileName(const char *FileName, char Prefix); void RemoveEmptyVideoDirectories(void); +bool IsOnVideoDirectoryFileSystem(const char *FileName); #endif //__VIDEODIR_H