]> Zhao Yanbai Git Server - minix.git/commitdiff
mfs<->vfs stat fallback for old vfs
authorBen Gras <ben@minix3.org>
Tue, 12 Jul 2011 16:09:52 +0000 (18:09 +0200)
committerBen Gras <ben@minix3.org>
Tue, 12 Jul 2011 16:09:52 +0000 (18:09 +0200)
servers/mfs/stadir.c

index 0e980bdd4536b26be0a328bcdc69f285474fe3b0..915141d76b2f63dbcef0816b6b57b9c4798f01d4 100644 (file)
@@ -8,6 +8,24 @@
 #include "super.h"
 #include <minix/vfsif.h>
 
+PRIVATE int copy_new_to_old_stat(endpoint_t who_e,
+       cp_grant_id_t gid, struct stat *st)
+{
+       struct minix_prev_stat prevst;
+
+       memset(&prevst, 0, sizeof(prevst));
+
+       prevst.st_dev = st->st_dev;
+       prevst.st_ino = st->st_ino;
+       prevst.st_mode = st->st_mode;
+       prevst.st_uid = st->st_uid;
+       prevst.st_gid = st->st_gid;
+       prevst.st_size = st->st_size;
+       prevst.st_rdev = st->st_rdev;
+
+       return sys_safecopyto(who_e, gid, (vir_bytes) 0, (vir_bytes) &prevst,
+               (size_t) sizeof(prevst), D);
+}
 
 /*===========================================================================*
  *                             stat_inode                                   *
@@ -57,11 +75,17 @@ PRIVATE int stat_inode(
   /* Copy the struct to user space. */
   r = sys_safecopyto(who_e, gid, (vir_bytes) 0, (vir_bytes) &statbuf,
                (size_t) sizeof(statbuf), D);
+
+  /* Fallback for older VFS (old stat) */
+  if(r != OK) {
+       r = copy_new_to_old_stat(who_e, gid, &statbuf);
+       if(r == OK) printf("MFS: old vfs stat fallback ok\n");
+       else    printf("MFS: old vfs stat fallback failed\n");
+  }
   
   return(r);
 }
 
-
 /*===========================================================================*
  *                             fs_fstatfs                                   *
  *===========================================================================*/