aboutsummaryrefslogtreecommitdiff
path: root/libdiskfs/io-identity.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdiskfs/io-identity.c')
-rw-r--r--libdiskfs/io-identity.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/libdiskfs/io-identity.c b/libdiskfs/io-identity.c
index 2cd64907..6f4e7546 100644
--- a/libdiskfs/io-identity.c
+++ b/libdiskfs/io-identity.c
@@ -1,5 +1,5 @@
/* libdiskfs implementation of io_identity RPC
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996,97,98,2001,02 Free Software Foundation, Inc.
Written by Michael I. Bushnell, p/BSG.
This file is part of the GNU Hurd.
@@ -28,26 +28,40 @@ diskfs_S_io_identity (struct protid *cred,
mach_msg_type_name_t *idtype,
mach_port_t *fsys,
mach_msg_type_name_t *fsystype,
- int *fileno)
+ ino_t *fileno)
{
struct node *np;
error_t err;
+ ino_t inum;
if (!cred)
return EOPNOTSUPP;
-
+
np = cred->po->np;
mutex_lock (&np->lock);
-
- err = fshelp_get_identity (diskfs_port_bucket, np->dn_stat.st_ino, id);
- if (!err)
+ inum = np->dn_stat.st_ino;
+ mutex_unlock (&np->lock);
+
+ err = fshelp_get_identity (diskfs_port_bucket, inum, id);
+ if (! err)
+ {
+ if (cred->po->shadow_root && cred->po->shadow_root != diskfs_root_node)
+ {
+ err = fshelp_get_identity (diskfs_port_bucket,
+ cred->po->shadow_root->dn_stat.st_ino,
+ fsys);
+ if (err)
+ mach_port_deallocate (mach_task_self (), *id);
+ }
+ else
+ *fsys = diskfs_fsys_identity;
+ }
+ if (! err)
{
*idtype = MACH_MSG_TYPE_MAKE_SEND;
- *fsys = diskfs_fsys_identity;
*fsystype = MACH_MSG_TYPE_MAKE_SEND;
- *fileno = np->dn_stat.st_ino;
+ *fileno = inum;
}
-
- mutex_unlock (&np->lock);
+
return err;
}