Fixed handling recordings on other file systems than the video directory

This commit is contained in:
Klaus Schmidinger 2008-02-16 13:38:22 +01:00
parent 47d6f9d187
commit 741400fa66
7 changed files with 74 additions and 28 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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...

17
tools.c
View File

@ -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)

View File

@ -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);

View File

@ -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;
}

View File

@ -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