github.com/gaukas/goofys100m@v0.24.0/api/common/panic_logger.go (about) 1 // Copyright 2019 Ka-Hing Cheung 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package common 16 17 import ( 18 "context" 19 "runtime/debug" 20 21 "github.com/jacobsa/fuse" 22 "github.com/jacobsa/fuse/fuseops" 23 "github.com/jacobsa/fuse/fuseutil" 24 ) 25 26 type FusePanicLogger struct { 27 Fs fuseutil.FileSystem 28 } 29 30 func LogPanic(err *error) { 31 if e := recover(); e != nil { 32 log.Errorf("stacktrace from panic: %v \n"+string(debug.Stack()), e) 33 if *err == nil { 34 *err = fuse.EIO 35 } 36 } 37 } 38 39 func (fs FusePanicLogger) StatFS(ctx context.Context, op *fuseops.StatFSOp) (err error) { 40 defer LogPanic(&err) 41 return fs.Fs.StatFS(ctx, op) 42 } 43 func (fs FusePanicLogger) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) (err error) { 44 defer LogPanic(&err) 45 return fs.Fs.LookUpInode(ctx, op) 46 } 47 func (fs FusePanicLogger) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) (err error) { 48 defer LogPanic(&err) 49 return fs.Fs.GetInodeAttributes(ctx, op) 50 } 51 func (fs FusePanicLogger) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) (err error) { 52 defer LogPanic(&err) 53 return fs.Fs.SetInodeAttributes(ctx, op) 54 } 55 func (fs FusePanicLogger) Fallocate(ctx context.Context, op *fuseops.FallocateOp) (err error) { 56 defer LogPanic(&err) 57 return fs.Fs.Fallocate(ctx, op) 58 } 59 func (fs FusePanicLogger) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) (err error) { 60 defer LogPanic(&err) 61 return fs.Fs.ForgetInode(ctx, op) 62 } 63 func (fs FusePanicLogger) MkDir(ctx context.Context, op *fuseops.MkDirOp) (err error) { 64 defer LogPanic(&err) 65 return fs.Fs.MkDir(ctx, op) 66 } 67 func (fs FusePanicLogger) MkNode(ctx context.Context, op *fuseops.MkNodeOp) (err error) { 68 defer LogPanic(&err) 69 return fs.Fs.MkNode(ctx, op) 70 } 71 func (fs FusePanicLogger) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) (err error) { 72 defer LogPanic(&err) 73 return fs.Fs.CreateFile(ctx, op) 74 } 75 func (fs FusePanicLogger) CreateLink(ctx context.Context, op *fuseops.CreateLinkOp) (err error) { 76 defer LogPanic(&err) 77 return fs.Fs.CreateLink(ctx, op) 78 } 79 func (fs FusePanicLogger) CreateSymlink(ctx context.Context, op *fuseops.CreateSymlinkOp) (err error) { 80 defer LogPanic(&err) 81 return fs.Fs.CreateSymlink(ctx, op) 82 } 83 func (fs FusePanicLogger) Rename(ctx context.Context, op *fuseops.RenameOp) (err error) { 84 defer LogPanic(&err) 85 return fs.Fs.Rename(ctx, op) 86 } 87 func (fs FusePanicLogger) RmDir(ctx context.Context, op *fuseops.RmDirOp) (err error) { 88 defer LogPanic(&err) 89 return fs.Fs.RmDir(ctx, op) 90 } 91 func (fs FusePanicLogger) Unlink(ctx context.Context, op *fuseops.UnlinkOp) (err error) { 92 defer LogPanic(&err) 93 return fs.Fs.Unlink(ctx, op) 94 } 95 func (fs FusePanicLogger) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) (err error) { 96 defer LogPanic(&err) 97 return fs.Fs.OpenDir(ctx, op) 98 } 99 func (fs FusePanicLogger) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) (err error) { 100 defer LogPanic(&err) 101 return fs.Fs.ReadDir(ctx, op) 102 } 103 func (fs FusePanicLogger) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) (err error) { 104 defer LogPanic(&err) 105 return fs.Fs.ReleaseDirHandle(ctx, op) 106 } 107 func (fs FusePanicLogger) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) (err error) { 108 defer LogPanic(&err) 109 return fs.Fs.OpenFile(ctx, op) 110 } 111 func (fs FusePanicLogger) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) (err error) { 112 defer LogPanic(&err) 113 return fs.Fs.ReadFile(ctx, op) 114 } 115 func (fs FusePanicLogger) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) (err error) { 116 defer LogPanic(&err) 117 return fs.Fs.WriteFile(ctx, op) 118 } 119 func (fs FusePanicLogger) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) (err error) { 120 defer LogPanic(&err) 121 return fs.Fs.SyncFile(ctx, op) 122 } 123 func (fs FusePanicLogger) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) (err error) { 124 defer LogPanic(&err) 125 return fs.Fs.FlushFile(ctx, op) 126 } 127 func (fs FusePanicLogger) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) (err error) { 128 defer LogPanic(&err) 129 return fs.Fs.ReleaseFileHandle(ctx, op) 130 } 131 func (fs FusePanicLogger) ReadSymlink(ctx context.Context, op *fuseops.ReadSymlinkOp) (err error) { 132 defer LogPanic(&err) 133 return fs.Fs.ReadSymlink(ctx, op) 134 } 135 func (fs FusePanicLogger) RemoveXattr(ctx context.Context, op *fuseops.RemoveXattrOp) (err error) { 136 defer LogPanic(&err) 137 return fs.Fs.RemoveXattr(ctx, op) 138 } 139 func (fs FusePanicLogger) GetXattr(ctx context.Context, op *fuseops.GetXattrOp) (err error) { 140 defer LogPanic(&err) 141 return fs.Fs.GetXattr(ctx, op) 142 } 143 func (fs FusePanicLogger) ListXattr(ctx context.Context, op *fuseops.ListXattrOp) (err error) { 144 defer LogPanic(&err) 145 return fs.Fs.ListXattr(ctx, op) 146 } 147 func (fs FusePanicLogger) SetXattr(ctx context.Context, op *fuseops.SetXattrOp) (err error) { 148 defer LogPanic(&err) 149 return fs.Fs.SetXattr(ctx, op) 150 } 151 152 func (fs FusePanicLogger) Destroy() { 153 fs.Fs.Destroy() 154 }