s3 onefs: Add the OneFS implementation of SMB_VFS_GET_ALLOC_SIZE
[metze/samba/wip.git] / source3 / modules / vfs_onefs.c
index b902812498abc9dc2413a2efca576d9703a161dd..e2f272aa115dff4b9ca4bdeba58f71190a3c09dc 100644 (file)
 static int onefs_mkdir(vfs_handle_struct *handle, const char *path,
                       mode_t mode)
 {
-       DEBUG(0, ("SMB_VFS_MKDIR should never be called in vfs_onefs"));
+       /* SMB_VFS_MKDIR should never be called in vfs_onefs */
+       SMB_ASSERT(false);
        return SMB_VFS_NEXT_MKDIR(handle, path, mode);
 }
 
 static int onefs_open(vfs_handle_struct *handle, const char *fname,
                      files_struct *fsp, int flags, mode_t mode)
 {
-       DEBUG(0, ("SMB_VFS_OPEN should never be called in vfs_onefs"));
+       /* SMB_VFS_OPEN should never be called in vfs_onefs */
+       SMB_ASSERT(false);
        return SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
 }
 
+static uint64_t onefs_get_alloc_size(struct vfs_handle_struct *handle,  files_struct *fsp,
+                               const SMB_STRUCT_STAT *sbuf)
+{
+       uint64_t result;
+
+       START_PROFILE(syscall_get_alloc_size);
+
+       if(S_ISDIR(sbuf->st_mode)) {
+               result = 0;
+               goto out;
+       }
+
+       /* Just use the file size since st_blocks is unreliable on OneFS. */
+       result = get_file_size_stat(sbuf);
+
+       if (fsp && fsp->initial_allocation_size)
+               result = MAX(result,fsp->initial_allocation_size);
+
+       result = smb_roundup(handle->conn, result);
+
+ out:
+       END_PROFILE(syscall_get_alloc_size);
+       return result;
+}
+
 static int onefs_statvfs(vfs_handle_struct *handle, const char *path,
                         vfs_statvfs_struct *statbuf)
 {
@@ -64,13 +91,73 @@ static int onefs_statvfs(vfs_handle_struct *handle, const char *path,
         return result;
 }
 
+static int onefs_ntimes(vfs_handle_struct *handle, const char *fname,
+                       struct smb_file_time *ft)
+{
+       int flags = 0;
+       struct timespec times[3];
+
+       if (!null_timespec(ft->atime)) {
+               flags |= VT_ATIME;
+               times[0] = ft->atime;
+               DEBUG(6,("**** onefs_ntimes: actime: %s.%d\n",
+                       time_to_asc(convert_timespec_to_time_t(ft->atime)),
+                       ft->atime.tv_nsec));
+       }
+
+       if (!null_timespec(ft->mtime)) {
+               flags |= VT_MTIME;
+               times[1] = ft->mtime;
+               DEBUG(6,("**** onefs_ntimes: modtime: %s.%d\n",
+                       time_to_asc(convert_timespec_to_time_t(ft->mtime)),
+                       ft->mtime.tv_nsec));
+       }
+
+       if (!null_timespec(ft->create_time)) {
+               flags |= VT_BTIME;
+               times[2] = ft->create_time;
+               DEBUG(6,("**** onefs_ntimes: createtime: %s.%d\n",
+                  time_to_asc(convert_timespec_to_time_t(ft->create_time)),
+                  ft->create_time.tv_nsec));
+       }
+
+       return onefs_vtimes_streams(handle, fname, flags, times);
+}
+
+static uint32_t onefs_fs_capabilities(struct vfs_handle_struct *handle)
+{
+       return SMB_VFS_NEXT_FS_CAPABILITIES(handle) | FILE_NAMED_STREAMS;
+}
+
 static vfs_op_tuple onefs_ops[] = {
+       {SMB_VFS_OP(onefs_fs_capabilities), SMB_VFS_OP_FS_CAPABILITIES,
+        SMB_VFS_LAYER_TRANSPARENT},
        {SMB_VFS_OP(onefs_mkdir), SMB_VFS_OP_MKDIR,
         SMB_VFS_LAYER_OPAQUE},
        {SMB_VFS_OP(onefs_open), SMB_VFS_OP_OPEN,
         SMB_VFS_LAYER_OPAQUE},
        {SMB_VFS_OP(onefs_create_file), SMB_VFS_OP_CREATE_FILE,
         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(onefs_close), SMB_VFS_OP_CLOSE,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_rename), SMB_VFS_OP_RENAME,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_stat), SMB_VFS_OP_STAT,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_fstat), SMB_VFS_OP_FSTAT,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_lstat), SMB_VFS_OP_LSTAT,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_get_alloc_size), SMB_VFS_OP_GET_ALLOC_SIZE,
+        SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(onefs_unlink), SMB_VFS_OP_UNLINK,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_ntimes), SMB_VFS_OP_NTIMES,
+        SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(onefs_chflags), SMB_VFS_OP_CHFLAGS,
+        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(onefs_streaminfo), SMB_VFS_OP_STREAMINFO,
+        SMB_VFS_LAYER_OPAQUE},
        {SMB_VFS_OP(onefs_fget_nt_acl), SMB_VFS_OP_FGET_NT_ACL,
         SMB_VFS_LAYER_OPAQUE},
        {SMB_VFS_OP(onefs_get_nt_acl), SMB_VFS_OP_GET_NT_ACL,