file_systems/cdda: Various fixes.

* When restoring shared attributes, don't affect CDDB:lookup status
 * Volume renames should not affect CDDB:lookup status, only file renames should

This fixes some of the "cddb_daemon not updating CD info" problems.

Signed-off-by: Jérôme Duval <jerome.duval@gmail.com>
This commit is contained in:
Augustin Cavalier 2014-07-07 11:33:29 -04:00 committed by Jérôme Duval
parent e8f82cdb6e
commit 8566c721c7

View File

@ -105,7 +105,7 @@ public:
size_t BufferSize() const { return 32 * kFrameSize; }
// TODO: for now
void DisableCDDBLookUps();
void SetCDDBLookupsEnabled(bool doLookup);
static void DetermineName(uint32 cddbId, int device, char* name,
size_t length);
@ -129,6 +129,7 @@ private:
ino_t fNextID;
char* fName;
off_t fNumBlocks;
bool fIgnoreCDDBLookupChanges;
// root directory contents - we don't support other directories
Inode* fFirstEntry;
@ -569,6 +570,7 @@ Volume::Volume(fs_volume* fsVolume)
fNextID(1),
fName(NULL),
fNumBlocks(0),
fIgnoreCDDBLookupChanges(false),
fFirstEntry(NULL)
{
}
@ -730,8 +732,7 @@ Volume::Mount(const char* device)
fRootNode->AddAttribute(kCddbIdAttribute, B_UINT32_TYPE, fDiscID);
// Add CD:do_lookup attribute.
fRootNode->AddAttribute(kDoLookupAttribute, B_BOOL_TYPE, true,
(const uint8*)&doLookup, sizeof(bool));
SetCDDBLookupsEnabled(true);
// Add CD:toc attribute.
fRootNode->AddAttribute(kTocAttribute, B_RAW_TYPE, true,
@ -807,11 +808,12 @@ Volume::Find(const char* name)
void
Volume::DisableCDDBLookUps()
Volume::SetCDDBLookupsEnabled(bool doLookup)
{
bool doLookup = false;
RootNode().AddAttribute(kDoLookupAttribute, B_BOOL_TYPE, true,
(const uint8*)&doLookup, sizeof(bool));
if (!fIgnoreCDDBLookupChanges) {
fRootNode->AddAttribute(kDoLookupAttribute, B_BOOL_TYPE, true,
(const uint8*)&doLookup, sizeof(bool));
}
}
@ -960,8 +962,10 @@ Volume::_StoreAttributes()
void
Volume::_RestoreSharedAttributes()
{
// device attributes overwrite shared attributes
// Don't affect CDDB lookup status while changing shared attributes
fIgnoreCDDBLookupChanges = true;
// device attributes overwrite shared attributes
int fd = _OpenAttributes(O_RDONLY, kSharedAttributes);
if (fd >= 0) {
read_attributes(fd, fRootNode);
@ -973,6 +977,8 @@ Volume::_RestoreSharedAttributes()
read_attributes(fd, fRootNode);
close(fd);
}
fIgnoreCDDBLookupChanges = false;
}
@ -1542,13 +1548,6 @@ cdda_write_fs_stat(fs_volume* _volume, const struct fs_info* info, uint32 mask)
if ((mask & FS_WRITE_FSINFO_NAME) != 0) {
status = volume->SetName(info->volume_name);
if (status == B_OK) {
// The volume had its name changed from outside the filesystem
// add-on. Disable CDDB lookups. Note this will usually mean that
// the user manually renamed the volume or that cddblinkd (or other
// program) did this so we do not want to do it again.
volume->DisableCDDBLookUps();
}
}
return status;
@ -1813,7 +1812,7 @@ cdda_rename(fs_volume* _volume, fs_vnode* _oldDir, const char* oldName,
// add-on. Disable CDDB lookups. Note this will usually mean that the
// user manually renamed a track or that cddblinkd (or other program)
// did this so we do not want to do it again.
volume->DisableCDDBLookUps();
volume->SetCDDBLookupsEnabled(false);
notify_entry_moved(volume->ID(), volume->RootNode().ID(), oldName,
volume->RootNode().ID(), newName, inode->ID());