in file.go [131:188]
func openWith(file vfs.File, opts Options) (*File, reason) {
sz, ferr := file.Size()
if ferr != nil {
return nil, wrapErr(ferr)
}
isNew := false
fileExists := sz > 0
if !fileExists {
if err := initNewFile(file, opts); err != nil {
return nil, err
}
isNew = true
}
meta, metaActive, err := readValidMeta(file)
if err != nil {
return nil, err
}
pageSize := meta.pageSize.Get()
maxSize := meta.maxSize.Get()
if maxSize == 0 && opts.MaxSize > 0 {
maxSize = opts.MaxSize
}
if maxSize > uint64(maxUint) {
return nil, raiseInvalidParam("max file size to large for this system")
}
f, err := newFile(file, opts, metaActive, uint(maxSize), uint(pageSize))
if err != nil {
return nil, err
}
// Update the files MaxSize after the new file object has been created.
// This allows us to handle the max size update like a transaction.
if (!isNew && opts.Flags.check(FlagUpdMaxSize)) && opts.MaxSize != maxSize {
ok := false
defer cleanup.IfNot(&ok, cleanup.IgnoreError(f.Close))
op := growFile
if opts.MaxSize > 0 && opts.MaxSize < maxSize {
op = shrinkFile
}
err := op(f, opts)
if err != nil {
return nil, err
}
ok = true
}
return f, nil
}