diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2008-02-16 13:38:22 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2008-02-16 13:38:22 +0100 |
commit | 741400fa666f9754337652c624e95aa6bdfaf98c (patch) | |
tree | 3d6d49358106e9a3f4abe9af6016376bac3a928e | |
parent | 47d6f9d18711c6388e93b23bc8d9ac82b3e7adbf (diff) | |
download | vdr-741400fa666f9754337652c624e95aa6bdfaf98c.tar.gz vdr-741400fa666f9754337652c624e95aa6bdfaf98c.tar.bz2 |
Fixed handling recordings on other file systems than the video directory
-rw-r--r-- | HISTORY | 9 | ||||
-rw-r--r-- | UPDATE-1.6.0 | 13 | ||||
-rw-r--r-- | recording.c | 46 | ||||
-rw-r--r-- | tools.c | 17 | ||||
-rw-r--r-- | tools.h | 3 | ||||
-rw-r--r-- | videodir.c | 11 | ||||
-rw-r--r-- | videodir.h | 3 |
7 files changed, 74 insertions, 28 deletions
@@ -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 <errno.h> -#include <unistd.h> -#include "videodir.h" - #define MAXFILESPERRECORDING 255 #define RECORDFILESUFFIX "/%03d.vdr" #define RECORDFILESUFFIXLEN 20 // some additional bytes for safety... @@ -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) @@ -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); @@ -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; +} @@ -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 |