From 253c2932135118c495861c0f6f71f7575158b8c7 Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Tue, 12 Jul 2011 18:09:52 +0200 Subject: [PATCH] mfs<->vfs stat fallback for old vfs --- servers/mfs/stadir.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/servers/mfs/stadir.c b/servers/mfs/stadir.c index 0e980bdd4..915141d76 100644 --- a/servers/mfs/stadir.c +++ b/servers/mfs/stadir.c @@ -8,6 +8,24 @@ #include "super.h" #include +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 * *===========================================================================*/ -- 2.44.0