MCPcopy
hub / github.com/google/gvisor / writeCache

Method writeCache

pkg/sentry/fsimpl/gofer/regular_file.go:282–315  ·  view source on GitHub ↗
(ctx context.Context, d *dentry, offset int64, src usermem.IOSequence)

Source from the content-addressed store, hash-verified

280}
281
282func (fd *regularFileFD) writeCache(ctx context.Context, d *dentry, offset int64, src usermem.IOSequence) error {
283 // Write dirty cached pages that will be touched by the write back to
284 // the remote file.
285 if err := d.writeback(ctx, offset, src.NumBytes()); err != nil {
286 return err
287 }
288
289 // Remove touched pages from the cache.
290 pgstart := hostarch.PageRoundDown(uint64(offset))
291 pgend, ok := hostarch.PageRoundUp(uint64(offset + src.NumBytes()))
292 if !ok {
293 return linuxerr.EINVAL
294 }
295 mr := memmap.MappableRange{pgstart, pgend}
296 var freed []memmap.FileRange
297
298 d.inode.dataMu.Lock()
299 d.inode.cache.RemoveRangeWith(mr, func(cseg fsutil.FileRangeIterator) {
300 freed = append(freed, memmap.FileRange{cseg.Value(), cseg.Value() + cseg.Range().Length()})
301 })
302 d.inode.dataMu.Unlock()
303
304 // Invalidate mappings of removed pages.
305 d.inode.mapsMu.Lock()
306 d.inode.mappings.Invalidate(mr, memmap.InvalidateOpts{})
307 d.inode.mapsMu.Unlock()
308
309 // Finally free pages removed from the cache.
310 mf := d.inode.fs.mf
311 for _, freedFR := range freed {
312 mf.DecRef(freedFR)
313 }
314 return nil
315}
316
317// Write implements vfs.FileDescriptionImpl.Write.
318func (fd *regularFileFD) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error) {

Callers 1

pwriteMethod · 0.95

Calls 12

PageRoundDownFunction · 0.92
PageRoundUpFunction · 0.92
RemoveRangeWithMethod · 0.80
LockMethod · 0.65
ValueMethod · 0.65
UnlockMethod · 0.65
InvalidateMethod · 0.65
DecRefMethod · 0.65
writebackMethod · 0.45
NumBytesMethod · 0.45
LengthMethod · 0.45
RangeMethod · 0.45

Tested by

no test coverage detected