@@ -185,14 +185,14 @@ func (fi *File) Mode() (os.FileMode, error) {
185185 defer fi .nodeLock .RUnlock ()
186186
187187 nd , err := fi .GetNode ()
188- if err == nil {
189- fsn , err := ft .ExtractFSNode (nd )
190- if err == nil {
191- return fsn .Mode () & 0xFFF , nil
192- }
188+ if err != nil {
189+ return 0 , err
193190 }
194-
195- return 0 , err
191+ fsn , err := ft .ExtractFSNode (nd )
192+ if err != nil {
193+ return 0 , err
194+ }
195+ return fsn .Mode () & 0xFFF , nil
196196}
197197
198198func (fi * File ) SetMode (mode os.FileMode ) error {
@@ -203,6 +203,11 @@ func (fi *File) SetMode(mode os.FileMode) error {
203203
204204 fsn , err := ft .ExtractFSNode (nd )
205205 if err != nil {
206+ if errors .Is (err , ft .ErrNotProtoNode ) {
207+ // Wrap raw node in protonode.
208+ data := nd .RawData ()
209+ return fi .setNodeData (ft .FilePBDataWithStat (data , uint64 (len (data )), mode , time.Time {}))
210+ }
206211 return err
207212 }
208213
@@ -221,14 +226,14 @@ func (fi *File) ModTime() (time.Time, error) {
221226 defer fi .nodeLock .RUnlock ()
222227
223228 nd , err := fi .GetNode ()
224- if err == nil {
225- fsn , err := ft .ExtractFSNode (nd )
226- if err == nil {
227- return fsn .ModTime (), nil
228- }
229+ if err != nil {
230+ return time.Time {}, err
229231 }
230-
231- return time.Time {}, err
232+ fsn , err := ft .ExtractFSNode (nd )
233+ if err != nil {
234+ return time.Time {}, err
235+ }
236+ return fsn .ModTime (), nil
232237}
233238
234239// SetModTime sets the files' last modification time
@@ -240,6 +245,11 @@ func (fi *File) SetModTime(ts time.Time) error {
240245
241246 fsn , err := ft .ExtractFSNode (nd )
242247 if err != nil {
248+ if errors .Is (err , ft .ErrNotProtoNode ) {
249+ // Wrap raw node in protonode.
250+ data := nd .RawData ()
251+ return fi .setNodeData (ft .FilePBDataWithStat (data , uint64 (len (data )), 0 , ts ))
252+ }
243253 return err
244254 }
245255
@@ -267,3 +277,8 @@ func (fi *File) setNodeData(data []byte) error {
267277
268278 return parent .updateChildEntry (child {name , fi .node })
269279}
280+
281+ func (fi * File ) replaceRawNodeWithStatNode (data []byte , mode os.FileMode , mtime time.Time ) error {
282+ data = ft .FilePBDataWithStat (data , uint64 (len (data )), mode , mtime )
283+ return fi .setNodeData (data )
284+ }
0 commit comments