diff options
Diffstat (limited to 'libdiskfs/io-stat.c')
-rw-r--r-- | libdiskfs/io-stat.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/libdiskfs/io-stat.c b/libdiskfs/io-stat.c index df8b4291..59f3187e 100644 --- a/libdiskfs/io-stat.c +++ b/libdiskfs/io-stat.c @@ -1,5 +1,5 @@ -/* - Copyright (C) 1994, 1995, 1996 Free Software Foundation +/* + Copyright (C) 1994,95,96,97,2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -28,15 +28,24 @@ diskfs_S_io_stat (struct protid *cred, if (!cred) return EOPNOTSUPP; - + np = cred->po->np; mutex_lock (&np->lock); + iohelp_get_conch (&np->conch); if (diskfs_synchronous) diskfs_node_update (np, 1); else diskfs_set_node_times (np); - bcopy (&np->dn_stat, statbuf, sizeof (struct stat)); + + memcpy (statbuf, &np->dn_stat, sizeof (struct stat)); + statbuf->st_mode &= ~(S_IATRANS | S_IROOT); + if (fshelp_translated (&np->transbox)) + statbuf->st_mode |= S_IATRANS; + if (cred->po->shadow_root == np || np == diskfs_root_node) + statbuf->st_mode |= S_IROOT; + mutex_unlock (&np->lock); + return 0; } |