// Copyright 2015 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package fileutil

import (
	
	
)

// Preallocate tries to allocate the space for given
// file. This operation is only supported on linux by a
// few filesystems (btrfs, ext4, etc.).
// If the operation is unsupported, no error will be returned.
// Otherwise, the error encountered will be returned.
func ( *os.File,  int64,  bool) error {
	if  == 0 {
		// fallocate will return EINVAL if length is 0; skip
		return nil
	}
	if  {
		return preallocExtend(, )
	}
	return preallocFixed(, )
}

func preallocExtendTrunc( *os.File,  int64) error {
	,  := .Seek(0, io.SeekCurrent)
	if  != nil {
		return 
	}
	,  := .Seek(, io.SeekEnd)
	if  != nil {
		return 
	}
	if _,  = .Seek(, io.SeekStart);  != nil {
		return 
	}
	if  >  {
		return nil
	}
	return .Truncate()
}