From b70df753693a289eb33e0e5c8d403d98a6d707e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Pierre=20Andr=C3=A9?= Date: Tue, 11 Mar 2014 10:28:02 +0100 Subject: [PATCH] Updated ctime after setting an ACL When setting a Posix ACL, the ctime was not updated to match ext2/ext3 behavior. This ext2/ext3 behavior has been changed, so do the same. --- src/lowntfs-3g.c | 64 +++++++++++++++++++++++++++++++--------------- src/ntfs-3g.c | 66 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 87 insertions(+), 43 deletions(-) diff --git a/src/lowntfs-3g.c b/src/lowntfs-3g.c index 7de8a00f..23fb9910 100644 --- a/src/lowntfs-3g.c +++ b/src/lowntfs-3g.c @@ -4,7 +4,7 @@ * Copyright (c) 2005-2007 Yura Pakhuchiy * Copyright (c) 2005 Yuval Fledel * Copyright (c) 2006-2009 Szabolcs Szakacsits - * Copyright (c) 2007-2013 Jean-Pierre Andre + * Copyright (c) 2007-2014 Jean-Pierre Andre * Copyright (c) 2009 Erik Larsson * * This file is originated from the Linux-NTFS project. @@ -214,7 +214,7 @@ static const char *usage_msg = "\n" "Copyright (C) 2005-2007 Yura Pakhuchiy\n" "Copyright (C) 2006-2009 Szabolcs Szakacsits\n" -"Copyright (C) 2007-2013 Jean-Pierre Andre\n" +"Copyright (C) 2007-2014 Jean-Pierre Andre\n" "Copyright (C) 2009 Erik Larsson\n" "\n" "Usage: %s [-o option[,...]] \n" @@ -3034,7 +3034,7 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, * hijack internal data and ACL setting, whatever * mode was selected for xattr (from the user's * point of view, ACLs are not xattr) - * Note : updating an ACL does not set ctime + * Note : ctime updated on successful settings */ #if !KERNELPERMS | (POSIXACLS & !KERNELACLS) ni = ntfs_check_access_xattr(req,&security,ino,attr,TRUE); @@ -3051,9 +3051,13 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #else @@ -3081,9 +3085,13 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #endif @@ -3221,9 +3229,12 @@ static void ntfs_fuse_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, res = -errno; } } - if (!res && !(ni->flags & FILE_ATTR_ARCHIVE)) { - set_archive(ni); - NInoFileNameSetDirty(ni); + if (!res) { + ntfs_fuse_update_times(ni, NTFS_UPDATE_CTIME); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } } exit: if (na) @@ -3282,9 +3293,13 @@ static void ntfs_fuse_removexattr(fuse_req_t req, fuse_ino_t ino, const char *na /* never have to close dir_ni */ } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #else @@ -3312,9 +3327,13 @@ static void ntfs_fuse_removexattr(fuse_req_t req, fuse_ino_t ino, const char *na res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #endif @@ -3409,9 +3428,12 @@ static void ntfs_fuse_removexattr(fuse_req_t req, fuse_ino_t ino, const char *na errno = ENODATA; res = -errno; } - if (!(ni->flags & FILE_ATTR_ARCHIVE)) { - set_archive(ni); - NInoFileNameSetDirty(ni); + if (!res) { + ntfs_fuse_update_times(ni, NTFS_UPDATE_CTIME); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } } exit: free(lename); diff --git a/src/ntfs-3g.c b/src/ntfs-3g.c index cdf91f21..bcf2f24f 100644 --- a/src/ntfs-3g.c +++ b/src/ntfs-3g.c @@ -4,7 +4,7 @@ * Copyright (c) 2005-2007 Yura Pakhuchiy * Copyright (c) 2005 Yuval Fledel * Copyright (c) 2006-2009 Szabolcs Szakacsits - * Copyright (c) 2007-2013 Jean-Pierre Andre + * Copyright (c) 2007-2014 Jean-Pierre Andre * Copyright (c) 2009 Erik Larsson * * This file is originated from the Linux-NTFS project. @@ -168,7 +168,7 @@ static const char *usage_msg = "\n" "Copyright (C) 2005-2007 Yura Pakhuchiy\n" "Copyright (C) 2006-2009 Szabolcs Szakacsits\n" -"Copyright (C) 2007-2013 Jean-Pierre Andre\n" +"Copyright (C) 2007-2014 Jean-Pierre Andre\n" "Copyright (C) 2009 Erik Larsson\n" "\n" "Usage: %s [-o option[,...]] \n" @@ -2893,7 +2893,7 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, * hijack internal data and ACL setting, whatever * mode was selected for xattr (from the user's * point of view, ACLs are not xattr) - * Note : updating an ACL does not set ctime + * Note : ctime updated on successful settings */ ni = ntfs_check_access_xattr(&security,path,attr,TRUE); if (ni) { @@ -2909,9 +2909,13 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #else @@ -2947,9 +2951,13 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; } @@ -3069,9 +3077,12 @@ static int ntfs_fuse_setxattr(const char *path, const char *name, res = -errno; } } - if (!res && !(ni->flags & FILE_ATTR_ARCHIVE)) { - set_archive(ni); - NInoFileNameSetDirty(ni); + if (!res) { + ntfs_fuse_update_times(ni, NTFS_UPDATE_CTIME); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } } exit: if (na) @@ -3115,7 +3126,7 @@ static int ntfs_fuse_removexattr(const char *path, const char *name) * hijack internal data and ACL removal, whatever * mode was selected for xattr (from the user's * point of view, ACLs are not xattr) - * Note : updating an ACL does not set ctime + * Note : ctime updated on successful settings */ ni = ntfs_check_access_xattr(&security,path,attr,TRUE); if (ni) { @@ -3131,9 +3142,13 @@ static int ntfs_fuse_removexattr(const char *path, const char *name) res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #else @@ -3172,9 +3187,13 @@ static int ntfs_fuse_removexattr(const char *path, const char *name) res = -errno; } else res = -errno; - if ((attr != XATTR_NTFS_DOS_NAME) - && ntfs_inode_close(ni)) - set_fuse_error(&res); + if (attr != XATTR_NTFS_DOS_NAME) { + if (!res) + ntfs_fuse_update_times(ni, + NTFS_UPDATE_CTIME); + if (ntfs_inode_close(ni)) + set_fuse_error(&res); + } } else res = -errno; #endif @@ -3249,9 +3268,12 @@ static int ntfs_fuse_removexattr(const char *path, const char *name) errno = ENODATA; res = -errno; } - if (!(ni->flags & FILE_ATTR_ARCHIVE)) { - set_archive(ni); - NInoFileNameSetDirty(ni); + if (!res) { + ntfs_fuse_update_times(ni, NTFS_UPDATE_CTIME); + if (!(ni->flags & FILE_ATTR_ARCHIVE)) { + set_archive(ni); + NInoFileNameSetDirty(ni); + } } exit: free(lename);