func (t *traceWrapper) Delete(ctx context.Context, path string) (err error) {
	if tr, ok := trace.FromContext(ctx); ok {
		tr.LazyPrintf("%v: delete: %v", t.name, path)
		defer func() {
			if err != nil {
				tr.LazyPrintf("%v: error: %v", t.name, err)
				tr.SetError()
			}
		}()
	}
	return t.fs.Delete(ctx, path)
}
Delete implements FS.  All calls to Delete are logged via golang.org/x/net/trace.
package storage
import (
	"context"
	"io"
	"golang.org/x/net/trace"
)
func NewTraceWrapper(fs FS, name string) FS {
	return &traceWrapper{
		fs:   fs,
		name: name,
	}
}
type traceWrapper struct {
	fs FS
	name string
}
func (t *traceWrapper) Open(ctx context.Context, path string, options *ReaderOptions) (f *File, err error) {
	if tr, ok := trace.FromContext(ctx); ok {
		tr.LazyPrintf("%v: open: %v", t.name, path)
		defer func() {
			if err != nil {
				tr.LazyPrintf("%v: error: %v", t.name, err)
				tr.SetError()
			}
		}()
	}
	return t.fs.Open(ctx, path, options)
}
func (t *traceWrapper) Attributes(ctx context.Context, path string, options *ReaderOptions) (f *Attributes, err error) {
	if tr, ok := trace.FromContext(ctx); ok {
		tr.LazyPrintf("%v: attrs: %v", t.name, path)
		defer func() {
			if err != nil {
				tr.LazyPrintf("%v: error: %v", t.name, err)
				tr.SetError()
			}
		}()
	}
	return t.fs.Attributes(ctx, path, options)
}
func (t *traceWrapper) Create(ctx context.Context, path string, options *WriterOptions) (wc io.WriteCloser, err error) {
	if tr, ok := trace.FromContext(ctx); ok {
		tr.LazyPrintf("%v: create: %v", t.name, path)
		defer func() {
			if err != nil {
				tr.LazyPrintf("%v: error: %v", t.name, err)
				tr.SetError()
			}
		}()
	}
	return t.fs.Create(ctx, path, options)
}