* fix(mount): preserve user-set mtime through async/periodic flush (#9363)
flushMetadataToFiler and flushFileMetadata both stamped time.Now() onto
the entry before sending it to the filer, clobbering any mtime SetAttr
had stored from utimes()/touch -m -d. The reproducer hit this ~1s after
touch because the writebackCache deferred close from the prior write
ran flushMetadataToFiler after the user's utimes call.
Flush has no business inventing timestamps. Move the write-time stamp
into Write (where it always belonged for POSIX correctness) and let
flush persist whatever Write or SetAttr already put on the entry.
* test(mount): tighten mtime regression test, drop tautological one
- userMtime now has non-zero nanoseconds, so the *Ns assertions catch a
regression that would zero the field.
- Add CtimeNs assertion (was missing).
- Drop TestWriteStampsEntryMtime: it duplicated the implementation it
was supposed to test, so a regression in Write would not have failed
it. Driving the real Write path needs a full PageWriter, which is out
of scope for this fix; TestFlushFileMetadataPreservesUserMtime is the
meaningful regression for #9363.