diff --git a/internal/buffer/in_message.go b/internal/buffer/in_message.go index c991b9a..2611f9d 100644 --- a/internal/buffer/in_message.go +++ b/internal/buffer/in_message.go @@ -16,16 +16,34 @@ package buffer import ( "errors" + "fmt" "io" + "syscall" "unsafe" "github.com/jacobsa/fuse/internal/fusekernel" ) +// All requests read from the kernel, without data, are shorter than +// this. +const pageSize = 4096 + +func init() { + // Confirm the page size. + if syscall.Getpagesize() != pageSize { + panic(fmt.Sprintf("Page size is unexpectedly %d", syscall.Getpagesize())) + } +} + +// We size the buffer to have enough room for a fuse request plus data +// associated with a write request. +const bufSize = pageSize + MaxWriteSize + // An incoming message from the kernel, including leading fusekernel.InHeader // struct. Provides storage for messages and convenient access to their // contents. type InMessage struct { + buf [bufSize]byte } // Initialize with the data read by a single call to r.Read. The first call to diff --git a/internal/buffer/in_message_darwin.go b/internal/buffer/in_message_darwin.go new file mode 100644 index 0000000..d1f6b9f --- /dev/null +++ b/internal/buffer/in_message_darwin.go @@ -0,0 +1,20 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// 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 buffer + +// The maximum fuse write request size that InMessage can acommodate. +// +// Experimentally, OS X appears to cap the size of writes to 1 MiB. +const MaxWriteSize = 1 << 20