Setting timestamps should trigger an inotify event.

PiperOrigin-RevId: 240850187
Change-Id: I1458581b771a1031e47bba439e480829794927b8
This commit is contained in:
Nicolas Lacasse 2019-03-28 14:14:13 -07:00 committed by Shentubot
parent f2e5dcf21c
commit 99195b0e16
2 changed files with 28 additions and 1 deletions

View File

@ -1698,7 +1698,13 @@ func utimes(t *kernel.Task, dirFD kdefs.FD, addr usermem.Addr, ts fs.TimeSpec, r
}
}
return d.Inode.SetTimestamps(t, d, ts)
if err := d.Inode.SetTimestamps(t, d, ts); err != nil {
return err
}
// File attribute changed, generate notification.
d.InotifyEvent(linux.IN_ATTRIB, 0)
return nil
}
// From utimes.c:

View File

@ -18,6 +18,7 @@
#include <sys/epoll.h>
#include <sys/inotify.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <atomic>
#include <list>
@ -1232,6 +1233,26 @@ TEST(Inotify, LinkGeneratesAttribAndCreateEvents) {
Event(IN_CREATE, root_wd, Basename(link1.path()))}));
}
TEST(Inotify, UtimesGeneratesAttribEvent) {
const TempPath root = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir());
const FileDescriptor fd =
ASSERT_NO_ERRNO_AND_VALUE(InotifyInit1(IN_NONBLOCK));
const TempPath file1 =
ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFileIn(root.path()));
const FileDescriptor file1_fd =
ASSERT_NO_ERRNO_AND_VALUE(Open(file1.path(), O_RDWR));
const int wd = ASSERT_NO_ERRNO_AND_VALUE(
InotifyAddWatch(fd.get(), root.path(), IN_ALL_EVENTS));
struct timeval times[2] = {{1, 0}, {2, 0}};
EXPECT_THAT(futimes(file1_fd.get(), times), SyscallSucceeds());
const std::vector<Event> events =
ASSERT_NO_ERRNO_AND_VALUE(DrainEvents(fd.get()));
ASSERT_THAT(events, Are({Event(IN_ATTRIB, wd, Basename(file1.path()))}));
}
TEST(Inotify, HardlinksReuseSameWatch) {
const TempPath root = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir());
TempPath file1 =