Index: usmb_file.c
--- usmb_file.c.orig
+++ usmb_file.c
@@ -60,7 +60,18 @@ static bool fix_nlink (const char *url, struct stat *s
   return (NULL == dirent);
 }
 
+static bool change_blksiz(struct stat *st)
+{
+  if (st == NULL)
+    return false;
 
+  if (S_ISREG(st->st_mode)) {
+    st->st_blksize = 32768;
+    return true;
+  }
+  return false;
+}
+
 int usmb_getattr (const char *filename, struct stat *st)
 {
   char *url = make_url (filename);
@@ -74,6 +85,8 @@ int usmb_getattr (const char *filename, struct stat *s
   if ((0 > ret) || !fix_nlink (url, st))
     ret = -errno;
 
+  change_blksiz(st);
+
   free (url);
   return ret;
 }
@@ -101,6 +114,8 @@ int usmb_fgetattr (const char *filename UNUSED, struct
       return -errno;
   }
 
+  change_blksiz(st);
+
   return 0;
 }
 
@@ -147,8 +162,6 @@ int usmb_release (const char *filename UNUSED, struct 
 int usmb_read (const char *filename UNUSED, char *buff, size_t len, off_t off,
                struct fuse_file_info *fi)
 {
-  assert (32768 >= len);
-
   SMBCFILE *file = fd_to_smbcfile (fi->fh);
   DEBUG (fprintf (stderr, "read (%p, %p, %llu, %lld) ",
                   (void *)file, buff, (unsigned long long)len, (long long)off));
@@ -178,14 +191,11 @@ int usmb_write (const char *filename UNUSED, const cha
   size_t written = 0;
   int bytes = 0;
 
-  // No idea whether Windows servers don't like > 32768 byte writes
-  // (cf. usmb_read), but taking no chances...
-
   const smbc_write_fn write_fn = smbc_getFunctionWrite (ctx);
 
   while (written < len)
   {
-    bytes = write_fn (ctx, file, (char *)buff, (len > 32768) ? 32768 : len);
+    bytes = write_fn (ctx, file, (char *)buff, len);
     if (0 > bytes)
       break;
 
@@ -199,6 +209,30 @@ int usmb_write (const char *filename UNUSED, const cha
 
   DEBUG (fprintf (stderr, "= %d\n", (0 > bytes) ? -errno : (int)written));
   return (0 > bytes) ? -errno : (int)written;
+}
+
+
+/* File systems must support mknod on OpenBSD */
+int usmb_mknod (const char *filename, mode_t mode, __attribute__((unused)) dev_t dev)
+{
+  char *url = make_url (filename);
+  if (NULL == url)
+    return -ENOMEM;
+
+  if (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode) || S_ISSOCK(mode))
+    return -EPERM;
+
+  DEBUG (fprintf (stderr, "mknod (%s)", url));
+
+  SMBCFILE *file = smbc_getFunctionCreat (ctx) (ctx, url, mode);
+  DEBUG (fprintf (stderr, " = %p\n", (void *)file));
+  int ret = (NULL == file) ? -errno : 0;
+
+  /* File must not be open when mknod returns. */
+  if (ret == 0)
+    smbc_getFunctionClose (ctx) (ctx, file);
+  free (url);
+  return ret;
 }
 
 
