@@ -512,6 +512,8 @@ func (fs *Filesystem) MknodAt(ctx context.Context, rp *vfs.ResolvingPath, opts v
512512// OpenAt implements vfs.FilesystemImpl.OpenAt.
513513func (fs * Filesystem ) OpenAt (ctx context.Context , rp * vfs.ResolvingPath , opts vfs.OpenOptions ) (* vfs.FileDescription , error ) {
514514 ats := vfs .AccessTypesForOpenFlags (& opts )
515+ trunc := opts .Flags & linux .O_TRUNC != 0
516+ mnt := rp .Mount ()
515517
516518 // Do not create new file.
517519 if opts .Flags & linux .O_CREAT == 0 {
@@ -526,6 +528,12 @@ func (fs *Filesystem) OpenAt(ctx context.Context, rp *vfs.ResolvingPath, opts vf
526528 fs .mu .RUnlock ()
527529 return nil , err
528530 }
531+ if trunc && d .isRegular () {
532+ if err := mnt .CheckBeginWrite (); err != nil {
533+ return nil , err
534+ }
535+ defer mnt .EndWrite ()
536+ }
529537 // Open may block so we need to unlock fs.mu. IncRef d to prevent
530538 // its destruction while fs.mu is unlocked.
531539 d .IncRef ()
@@ -561,6 +569,12 @@ func (fs *Filesystem) OpenAt(ctx context.Context, rp *vfs.ResolvingPath, opts vf
561569 if err := start .inode .CheckPermissions (ctx , rp .Credentials (), ats ); err != nil {
562570 return nil , err
563571 }
572+ if trunc && start .isRegular () {
573+ if err := mnt .CheckBeginWrite (); err != nil {
574+ return nil , err
575+ }
576+ defer mnt .EndWrite ()
577+ }
564578 // Open may block so we need to unlock fs.mu. IncRef d to prevent
565579 // its destruction while fs.mu is unlocked.
566580 start .IncRef ()
@@ -612,10 +626,10 @@ afterTrailingSymlink:
612626 if err := parent .inode .CheckPermissions (ctx , rp .Credentials (), vfs .MayWrite ); err != nil {
613627 return nil , err
614628 }
615- if err := rp . Mount () .CheckBeginWrite (); err != nil {
629+ if err := mnt .CheckBeginWrite (); err != nil {
616630 return nil , err
617631 }
618- defer rp . Mount () .EndWrite ()
632+ defer mnt .EndWrite ()
619633 // Create and open the child.
620634 childI , err := parent .inode .NewFile (ctx , pc , opts )
621635 if err != nil {
@@ -646,6 +660,12 @@ afterTrailingSymlink:
646660 if err := child .inode .CheckPermissions (ctx , rp .Credentials (), ats ); err != nil {
647661 return nil , err
648662 }
663+ if trunc && child .isRegular () {
664+ if err := mnt .CheckBeginWrite (); err != nil {
665+ return nil , err
666+ }
667+ defer mnt .EndWrite ()
668+ }
649669 if child .isDir () {
650670 // Can't open directories with O_CREAT.
651671 if opts .Flags & linux .O_CREAT != 0 {
0 commit comments