diff --git a/libntfs-3g/inode.c b/libntfs-3g/inode.c index fc24bb05..cd8e52cf 100644 --- a/libntfs-3g/inode.c +++ b/libntfs-3g/inode.c @@ -668,8 +668,11 @@ static int ntfs_inode_sync_file_name(ntfs_inode *ni) } ntfs_index_entry_mark_dirty(ictx); ntfs_index_ctx_put(ictx); - if ((ni != index_ni) && ntfs_inode_close(index_ni) && !err) - err = errno; + if (ni != index_ni) { + ntfs_inode_update_times(index_ni, NTFS_UPDATE_CTIME); + if (ntfs_inode_close(index_ni) && !err) + err = errno; + } } /* Check for real error occurred. */ if (errno != ENOENT) { diff --git a/src/ntfs-3g.c b/src/ntfs-3g.c index b2867c11..d23eb36d 100644 --- a/src/ntfs-3g.c +++ b/src/ntfs-3g.c @@ -1464,9 +1464,17 @@ static int ntfs_fuse_create(const char *org_path, mode_t typemode, dev_t dev, && (ni->flags & FILE_ATTR_ENCRYPTED)) fi->fh |= CLOSE_ENCRYPTED; NInoSetDirty(ni); + /* + * closing ni will necessitate to open dir_ni to + * synchronize the index, which will update the change + * time again. Better avoid a dangerous double opening. + */ + ntfs_fuse_update_times(dir_ni, NTFS_UPDATE_MCTIME); + if (ntfs_inode_close(dir_ni)) + set_fuse_error(&res); + dir_ni = (ntfs_inode*)NULL; if (ntfs_inode_close(ni)) set_fuse_error(&res); - ntfs_fuse_update_times(dir_ni, NTFS_UPDATE_MCTIME); } else res = -errno; #if POSIXACLS