]> Zhao Yanbai Git Server - minix.git/commitdiff
include, vfs: statvfs, fstatvfs calls, contributed by Buccapatnam Tirumala, Gautam.
authorBen Gras <ben@minix3.org>
Wed, 23 Jun 2010 23:53:50 +0000 (23:53 +0000)
committerBen Gras <ben@minix3.org>
Wed, 23 Jun 2010 23:53:50 +0000 (23:53 +0000)
include/minix/callnr.h
include/minix/com.h
include/minix/vfsif.h
servers/vfs/proto.h
servers/vfs/request.c
servers/vfs/stadir.c
servers/vfs/table.c

index 0a492a4ac4a6f4931833835f3f04d8bfd77f6669..3b52911ad8970401799d431ad18e2b3358413d16 100644 (file)
@@ -73,6 +73,8 @@
 #define GETDENTS         80    /* to FS */
 #define LLSEEK           81    /* to VFS */
 #define FSTATFS                  82    /* to VFS */
+#define STATVFS          83    /* to VFS */
+#define FSTATVFS         84    /* to VFS */
 #define SELECT            85   /* to VFS */
 #define FCHDIR            86   /* to VFS */
 #define FSYNC             87   /* to VFS */
index 9a2c2d4fc25f853f3174d6bffa671f336bd7b6b6..bb7820b9ce2ceb81e5009bab51f85c3e89639c6d 100644 (file)
 #define TAPE_STAT0     m2_l1
 #define TAPE_STAT1     m2_l2
 
+/* Field names for the fstatvfs call */
+#define FSTATVFS_FD m1_i1
+#define FSTATVFS_BUF m1_p1
+
+/* Field names for the statvfs call */
+#define STATVFS_LEN m1_i1
+#define STATVFS_NAME m1_p1
+#define STATVFS_BUF m1_p2
 /*===========================================================================*
  *                        Messages for networking layer                     *
  *===========================================================================*/
index a46e7c2e6ab2bd7daf2fe1a998e5b559eb691b72..32149ec27c736ce786a9c9cd7e3215548e1978f6 100644 (file)
@@ -113,8 +113,9 @@ typedef struct {
 #define REQ_NEWNODE    (VFS_BASE + 29)
 #define REQ_RDLINK     (VFS_BASE + 30)
 #define REQ_GETDENTS   (VFS_BASE + 31)
+#define REQ_STATVFS            (VFS_BASE + 32)
 
-#define NREQS                   3
+#define NREQS                   33
 
 #endif
 
index 8fad59a9589986bc998bbda12952495a842c99d2..2d799972d3a393c6fbb48944626cc6a6491cc6c6 100644 (file)
@@ -165,6 +165,7 @@ _PROTOTYPE( int req_create, (int fs_e, ino_t inode_nr, int omode,
                uid_t uid, gid_t gid, char *path, node_details_t *res)  ); 
 _PROTOTYPE( int req_flush, (endpoint_t fs_e, dev_t dev)                        );
 _PROTOTYPE( int req_fstatfs, (int fs_e, int who_e, char *buf)          );
+_PROTOTYPE( int req_statvfs, (int fs_e, int who_e, char *buf)          );
 _PROTOTYPE( int req_ftrunc, (endpoint_t fs_e, ino_t inode_nr,
                                                off_t start, off_t end) );
 _PROTOTYPE( int req_getdents, (endpoint_t fs_e, ino_t inode_nr, u64_t pos,
@@ -220,6 +221,8 @@ _PROTOTYPE( int do_chroot, (void)                                   );
 _PROTOTYPE( int do_fstat, (void)                                       );
 _PROTOTYPE( int do_stat, (void)                                                );
 _PROTOTYPE( int do_fstatfs, (void)                                     );
+_PROTOTYPE( int do_statvfs, (void)                                     );
+_PROTOTYPE( int do_fstatvfs, (void)                                    );
 _PROTOTYPE( int do_rdlink, (void)                                      );
 _PROTOTYPE( int do_lstat, (void)                                       );
 
index 329c7cef41f89d59f9c65312ca47cf16f7db55bf..cdd208da4fc38155072b799de33996d18c06b0cf 100644 (file)
@@ -11,6 +11,7 @@
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/statfs.h>
+#include <sys/statvfs.h>
 #include <minix/vfsif.h>
 #include <minix/com.h>
 #include <minix/const.h>
@@ -227,6 +228,32 @@ PUBLIC int req_fstatfs(int fs_e, int who_e, char *buf)
 }
 
 
+/*===========================================================================*
+ *                             req_statvfs                                  *
+ *===========================================================================*/
+PUBLIC int req_statvfs(int fs_e, int who_e, char *buf)
+{
+  int r;
+  cp_grant_id_t grant_id;
+  message m;
+
+  grant_id = cpf_grant_magic(fs_e, who_e, (vir_bytes) buf, sizeof(struct statvfs),
+                       CPF_WRITE);
+  if(grant_id == -1) 
+         panic("req_statvfs: cpf_grant_magic failed");
+
+  /* Fill in request message */
+  m.m_type = REQ_STATVFS;
+  m.REQ_GRANT = grant_id;
+
+  /* Send/rec request */
+  r = fs_sendrec(fs_e, &m);
+  cpf_revoke(grant_id);
+
+  return(r);
+}
+
+
 /*===========================================================================*
  *                             req_ftrunc                                   *
  *===========================================================================*/
index 142784f25558894de84368a17185c3f0855dbdc6..3805f63db82f2311c52d53d0f84d784aea01c7c2 100644 (file)
@@ -8,6 +8,8 @@
  *   do_stat:  perform the STAT system call
  *   do_fstat: perform the FSTAT system call
  *   do_fstatfs: perform the FSTATFS system call
+ *   do_statvfs: perform the STATVFS system call
+ *   do_fstatvfs: perform the FSTATVFS system call
  */
 
 #include "fs.h"
@@ -169,6 +171,38 @@ PUBLIC int do_fstatfs()
   return req_fstatfs(rfilp->filp_vno->v_fs_e, who_e, m_in.buffer);
 }
 
+/*===========================================================================*
+ *                             do_statvfs                                           *
+ *===========================================================================*/
+PUBLIC int do_statvfs()
+{
+/* Perform the stat(name, buf) system call. */
+  int r;
+  struct vnode *vp;
+
+  if (fetch_name(m_in.STATVFS_NAME, m_in.STATVFS_LEN, M1) != OK) return(err_code);
+  if ((vp = eat_path(PATH_NOFLAGS)) == NULL) return(err_code);
+  r = req_statvfs(vp->v_fs_e, who_e, m_in.STATVFS_BUF);
+
+  put_vnode(vp);
+  return r;
+}
+
+
+/*===========================================================================*
+ *                             do_fstatvfs                                  *
+ *===========================================================================*/
+PUBLIC int do_fstatvfs()
+{
+/* Perform the fstat(fd, buf) system call. */
+  register struct filp *rfilp;
+
+  /* Is the file descriptor valid? */
+  if ((rfilp = get_filp(m_in.FSTATVFS_FD)) == NULL) return(err_code);
+  
+  return req_statvfs(rfilp->filp_vno->v_fs_e, who_e, m_in.FSTATVFS_BUF);
+}
+
 
 /*===========================================================================*
  *                             do_lstat                                             *
index 064990f8bb32edcf5502d5177fc2f70c67167741..6d7f4f28a637bb5a9f4a5142e6e9234106e6ff99 100644 (file)
@@ -98,8 +98,8 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
        do_getdents,    /* 80 = getdents */
        do_llseek,      /* 81 = llseek */
        do_fstatfs,     /* 82 = fstatfs */
-       no_sys,         /* 83 = unused */
-       no_sys,         /* 84 = unused */
+       do_statvfs,             /* 83 = fstatvfs */
+       do_fstatvfs,            /* 84 = statvfs */
        do_select,      /* 85 = select */
        do_fchdir,      /* 86 = fchdir */
        do_fsync,       /* 87 = fsync */