Ticket #2364: mythtv-stat_before_unlink.patch

File mythtv-stat_before_unlink.patch, 2.8 KB (added by sphery <mtdean@…>, 15 years ago)
  • programs/mythbackend/mainserver.h

     
    152152    static int  DeleteFile(const QString &filename, bool followLinks);
    153153    static int  OpenAndUnlink(const QString &filename);
    154154    static bool TruncateAndClose(const AutoExpire *expirer,
    155                                  int fd, const QString &filename);
     155                                 int fd, const QString &filename,
     156                                 off_t fsize);
    156157
    157158    QPtrList<LiveTVChain> liveTVChains;
    158159    QMutex liveTVChainsLock;
  • programs/mythbackend/mainserver.cpp

     
    14301430    bool followLinks = gContext->GetNumSetting("DeletesFollowLinks", 0);
    14311431    bool slowDeletes = gContext->GetNumSetting("TruncateDeletesSlowly", 0);
    14321432    int fd = -1;
     1433    off_t size = 0;
    14331434    bool errmsg = false;
    14341435
    14351436    /* Delete recording. */
    14361437    if (slowDeletes)
    14371438    {
     1439        // Since stat fails after unlinking on some filesystems,
     1440        // get the filesize first
     1441        struct stat st;
     1442        if (stat(ds->filename, &st) == 0)
     1443            size = st.st_size;
    14381444        fd = DeleteFile(ds->filename, followLinks);
    14391445
    14401446        if ((fd < 0) && checkFile.exists())
     
    14821488    if (slowDeletes && fd != -1)
    14831489    {
    14841490        m_expirer->TruncatePending();
    1485         TruncateAndClose(m_expirer, fd, ds->filename);
     1491        TruncateAndClose(m_expirer, fd, ds->filename, size);
    14861492        m_expirer->TruncateFinished();
    14871493    }
    14881494}
     
    16381644 *         is running at a time.
    16391645 */
    16401646bool MainServer::TruncateAndClose(const AutoExpire *expirer,
    1641                                   int fd, const QString &filename)
     1647                                  int fd, const QString &filename,
     1648                                  off_t fsize)
    16421649{
    16431650    QMutexLocker locker(&truncate_and_close_lock);
    16441651
     
    16591666            .arg(increment / (1024.0 * 1024.0), 0, 'f', 2)
    16601667            .arg(sleep_time));
    16611668
    1662     // Get the on disk file size and preferred I/O block size.
    1663     struct stat buf;
    1664     fstat(fd, &buf);
    1665     // Estimate the file size.  Don't use buf.st_blksize * buf.st_blocks
    1666     // The unit for st_blocks is undefined.  See section "RATIONALE" at
    1667     // http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/stat.h.html
    1668     off_t fsize = ((buf.st_size / buf.st_blksize) + 1) * buf.st_blksize;
    1669 
    1670     // Round truncate increment up to a blocksize, w/min of 1 block.
    1671     increment = ((increment / buf.st_blksize) + 1) * buf.st_blksize;
    1672 
    16731669    while (fsize > 0)
    16741670    {
    16751671        //VERBOSE(VB_FILE, QString("Truncating '%1' to %2 MB")