monitor: Fix directory symlink deletion handling

When a symlink to a direcotry is deleted inotify cannot tell it from a
regular file rendering all its children orphans.
This sometimes leads to an unexpected effect - they may appear later in
a newly created directory when it gets an id used by the deleted symlink.
This commit is contained in:
Georgy Kibardin
2023-05-19 20:05:50 +03:00
committed by Justin Maggard
parent 0a6e10e821
commit c5c4d9e169
3 changed files with 25 additions and 9 deletions

View File

@@ -366,21 +366,13 @@ monitor_insert_directory(int fd, char *name, const char * path)
}
int
monitor_remove_directory(int fd, const char * path)
monitor_remove_tree(const char * path)
{
char * sql;
char **result;
int64_t detailID = 0;
int rows, i, ret = 1;
/* Invalidate the scanner cache so we don't insert files into non-existent containers */
valid_cache = 0;
#ifdef HAVE_WATCH
if( fd > 0 )
{
monitor_remove_watch(fd, path);
}
#endif
sql = sqlite3_mprintf("SELECT ID from DETAILS where (PATH > '%q/' and PATH <= '%q/%c')"
" or PATH = '%q'", path, path, 0xFF, path);
if( (sql_get_table(db, sql, &result, &rows, NULL) == SQLITE_OK) )
@@ -403,3 +395,17 @@ monitor_remove_directory(int fd, const char * path)
return ret;
}
int
monitor_remove_directory(int fd, const char * path)
{
/* Invalidate the scanner cache so we don't insert files into non-existent containers */
valid_cache = 0;
#ifdef HAVE_WATCH
if( fd > 0 )
{
monitor_remove_watch(fd, path);
}
#endif
return monitor_remove_tree(path);
}