]> Zhao Yanbai Git Server - minix.git/commitdiff
HGFS: statvfs support
authorDavid van Moolenbroek <david@minix3.org>
Sun, 27 Jun 2010 17:19:50 +0000 (17:19 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Sun, 27 Jun 2010 17:19:50 +0000 (17:19 +0000)
servers/hgfs/const.h
servers/hgfs/inode.h
servers/hgfs/misc.c
servers/hgfs/proto.h
servers/hgfs/table.c

index 937554af0807e40b4faa1c7f11a8dfba91800bbe..c757d3c8c9a79a3359249267a0d0745d7f04ba7a 100644 (file)
@@ -6,7 +6,7 @@
 /* Number of entries in the name hashtable. */
 #define NUM_HASH_SLOTS 1023
 
-/* Arbitrary block size constant returned by fstatfs. du(1) uses this.
+/* Arbitrary block size constant returned by fstatfs and statvfs.
  * Also used by getdents. This is not the actual HGFS data transfer unit size.
  */
 #define BLOCK_SIZE     4096
index 092f4d00f478b40e93f79caa05312892204c1573..12f6b4b062c51aa43ee76b0435fe334167d97fcc 100644 (file)
@@ -72,7 +72,6 @@ struct inode {
 #define i_file         i_u.u_file
 #define i_dir          i_u.u_dir
 
-
 #define I_DIR          0x01            /* this inode represents a directory */
 #define I_HANDLE       0x02            /* this inode has an open handle */
 
index b7c4c60c18eca3acfa3e372f40a8df8972f002ce..9ad1a9c7d596b7fbe7519599530a8b4bf178f7e3 100644 (file)
@@ -1,7 +1,8 @@
-/* This file contains miscellaneous file system call handlers.
+* This file contains miscellaneous file system call handlers.
  *
  * The entry points into this file are:
  *   do_fstatfs                perform the FSTATFS file system call
+ *   do_statvfs                perform the STATVFS file system call
  *
  * Created:
  *   April 2009 (D.C. van Moolenbroek)
@@ -10,6 +11,7 @@
 #include "inc.h"
 
 #include <sys/statfs.h>
+#include <sys/statvfs.h>
 
 /*===========================================================================*
  *                             do_fstatfs                                   *
@@ -25,3 +27,53 @@ PUBLIC int do_fstatfs()
   return sys_safecopyto(m_in.m_source, m_in.REQ_GRANT, 0,
        (vir_bytes) &statfs, sizeof(statfs), D);
 }
+
+/*===========================================================================*
+ *                             do_statvfs                                   *
+ *===========================================================================*/
+PUBLIC int do_statvfs()
+{
+/* Retrieve file system statistics.
+ */
+  struct statvfs statvfs;
+  struct inode *ino;
+  char path[PATH_MAX];
+  u64_t free, total;
+  int r;
+
+  /* Unfortunately, we cannot be any more specific than this, because we are
+   * not given an inode number. Statistics of individual shared folders can
+   * only be obtained by using the "prefix=" option when mounting.
+   */
+  if ((ino = find_inode(ROOT_INODE_NR)) == NULL)
+       return EINVAL;
+
+  if ((r = verify_inode(ino, path, NULL)) != OK)
+       return r;
+
+  /* It appears that this call always fails with EACCES ("permission denied")
+   * on read-only folders. As far as I can tell, this is a VMware bug.
+   */
+  if ((r = hgfs_queryvol(path, &free, &total)) != OK)
+       return r;
+
+  memset(&statvfs, 0, sizeof(statvfs));
+
+  /* Returning zero for unknown values seems to be the convention. However, we
+   * do have to use a nonzero block size, even though it is entirely arbitrary.
+   */
+  statvfs.f_bsize = BLOCK_SIZE;
+  statvfs.f_frsize = BLOCK_SIZE;
+  statvfs.f_blocks = div64u(total, BLOCK_SIZE);
+  statvfs.f_bfree = div64u(free, BLOCK_SIZE);
+  statvfs.f_bavail = statvfs.f_bfree;
+  statvfs.f_files = 0;
+  statvfs.f_ffree = 0;
+  statvfs.f_favail = 0;
+  statvfs.f_fsid = state.dev;
+  statvfs.f_flag = state.read_only ? ST_RDONLY : 0;
+  statvfs.f_namemax = NAME_MAX;
+
+  return sys_safecopyto(m_in.m_source, m_in.REQ_GRANT, 0,
+       (vir_bytes) &statvfs, sizeof(statvfs), D);
+}
index 93575c99b9675232af356605980db21bedd8a91a..cfc782c3f905f204b4a9e09a9011f3c4aa31ce67 100644 (file)
@@ -38,6 +38,7 @@ _PROTOTYPE( int main, (int argc, char *argv[])                                );
 
 /* misc.c */
 _PROTOTYPE( int do_fstatfs, (void)                                     );
+_PROTOTYPE( int do_statvfs, (void)                                     );
 
 /* mount.c */
 _PROTOTYPE( int do_readsuper, (void)                                   );
index 9db3dbfc5b778f2120d4ae0ea00f70346533b17b..487e053ac2fcfc31b880c61402c46fedfc11fd66 100644 (file)
@@ -40,7 +40,7 @@ PUBLIC _PROTOTYPE( int (*call_vec[]), (void) ) = {
        no_sys,         /* 29 newnode           */
        no_sys,         /* 30 rdlink            */
        do_getdents,    /* 31 getdents          */
-       no_sys,   /* 32 statvfs */
+       do_statvfs,     /* 32 statvfs           */
 };
 
 /* This should not fail with "array size is negative": */