code: function update_node_times(context, path, node, times, callback) {
    // Honour mount flags for how we update times
    var flags = context.flags;
    if(flags.includes(FS_NOCTIME)) {
      delete times.ctime;
    }
    if(flags.includes(FS_NOMTIME)) {
      delete times.mtime;
    }
  
    // Only do the update if required (i.e., times are still present)
    var update = false;
    if(times.ctime) {
      node.ctime = times.ctime;
      // We don't do atime tracking for perf reasons, but do mirror ctime
      node.atime = times.ctime;
      update = true;
    }
    if(times.atime) {
      // The only time we explicitly pass atime is when utimes(), futimes() is called.
      // Override ctime mirror here if so
      node.atime = times.atime;
      update = true;
    }
    if(times.mtime) {
      node.mtime = times.mtime;
      update = true;
    }
  
    function complete(error) {
      // Queue this change so we can send watch events.
      // Unlike node.js, we send the full path vs. basename/dirname only.
      context.changes.push({ event: 'change', path: path });
      callback(error);
    }
  
    if(update) {
      context.putObject(node.id, node, complete);
    } else {
      complete();
    }
  }
docs: Update node times. Only passed times are modified (undefined times are ignored)
  and filesystem flags are examined in order to override update logic.