From 1bb7443eb6a69ba6e20cfde4eebc04fcf78c4ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Pierre=20Andr=C3=A9?= Date: Wed, 24 Feb 2010 12:08:56 +0100 Subject: [PATCH] Fixed setting archive bit on file and alternated data stream creation --- libntfs-3g/dir.c | 2 ++ src/lowntfs-3g.c | 14 +++++++++++--- src/ntfs-3g.c | 14 +++++++++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libntfs-3g/dir.c b/libntfs-3g/dir.c index 03e98c74..9c827657 100644 --- a/libntfs-3g/dir.c +++ b/libntfs-3g/dir.c @@ -1396,6 +1396,7 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni, le32 securid, si->file_attributes = FILE_ATTR_SYSTEM; ni->flags = FILE_ATTR_SYSTEM; } + ni->flags |= FILE_ATTR_ARCHIVE; if ((dir_ni->flags & FILE_ATTR_COMPRESSED) && (S_ISREG(type) || S_ISDIR(type))) ni->flags |= FILE_ATTR_COMPRESSED; @@ -1525,6 +1526,7 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni, le32 securid, fn->file_attributes = FILE_ATTR_SYSTEM; else fn->file_attributes |= ni->flags & FILE_ATTR_COMPRESSED; + fn->file_attributes |= FILE_ATTR_ARCHIVE; fn->creation_time = ni->creation_time; fn->last_data_change_time = ni->last_data_change_time; fn->last_mft_change_time = ni->last_mft_change_time; diff --git a/src/lowntfs-3g.c b/src/lowntfs-3g.c index 06ad2d06..02d0afd3 100644 --- a/src/lowntfs-3g.c +++ b/src/lowntfs-3g.c @@ -3244,7 +3244,10 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, res = -errno; goto exit; } - set_archive(ni); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } na = ntfs_attr_open(ni, AT_DATA, lename, lename_len); if (!na) { res = -errno; @@ -3273,8 +3276,10 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, && (ni->flags & FILE_ATTR_ENCRYPTED)) res = ntfs_efs_fixup_attribute(NULL, na); - if (total) + if (total && !(ni->flags & FILE_ATTR_ARCHIVE)) { set_archive(ni); + NInoFileNameSetDirty(ni); + } } else res = 0; exit: @@ -3451,7 +3456,10 @@ static void ntfs_fuse_removexattr(fuse_req_t req, fuse_ino_t ino, const char *na errno = ENODATA; res = -errno; } - set_archive(ni); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } exit: free(lename); if (ntfs_inode_close(ni)) diff --git a/src/ntfs-3g.c b/src/ntfs-3g.c index 5da26e28..1c7489f4 100644 --- a/src/ntfs-3g.c +++ b/src/ntfs-3g.c @@ -3186,7 +3186,10 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, res = -errno; goto exit; } - set_archive(ni); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } na = ntfs_attr_open(ni, AT_DATA, lename, lename_len); if (!na) { res = -errno; @@ -3215,8 +3218,10 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, && (ni->flags & FILE_ATTR_ENCRYPTED)) res = ntfs_efs_fixup_attribute(NULL, na); - if (total) + if (total && !(ni->flags & FILE_ATTR_ARCHIVE)) { set_archive(ni); + NInoFileNameSetDirty(ni); + } } else res = 0; exit: @@ -3413,7 +3418,10 @@ static int ntfs_fuse_removexattr(const char *path, const char *name) errno = ENODATA; res = -errno; } - set_archive(ni); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } exit: free(lename); if (ntfs_inode_close(ni))