1. rpc.idmapd (userspace daemon as server)
nfs-utils/utils/idmap.c: nfscb(), nfsdcb()
check /proc/net/rpc/nfs4.idtoname/channel
/proc/net/rpc/nfs4.nametoid/channel event,
read() request of idmap_msg &&
imconv() &&
write() reply
2. the client of rpc.idmapd is {NFSv4 kernel client and server}
fs/nfs/nfsd/nfs4imapd.c:
static struct cache_detail idtoname_cache_template = { .name = "nfs4.idtoname", };
static struct cache_detail nametoid_cache_template = { .name = "nfs4.nametoid", };
-->nfsd_idmap_init()
-->net/sunrpc/cache.c: cache_create_net()
-->net/sunrpc/cache.c: cache_register_net()
-->create_cache_proc_entries()
-->fs/proc/generic.c: proc_create_data()
create the file's /proc/net/rpc/nfs4.idtoname/{channel,flush,content},
the f_ops is {static const struct file_operations cache_file_operations_procfs}
nfs4 kernel object Initiated the request, by:
nfsd_map_name_to_[ug]id()-->do_name_to_id()->idmap_name_to_id()
nfsd_map_[ug]id_to_name()-->do_id_to_name()->idmap_id_to_name()
idmap_lookup()
-->cache_make_upcall()
-->cd->cache_upcall(cd, h)
-->nametoid_upcall()-->sunrpc_cache_pipe_upcall()-->nametoid_request()
-->idtoname_upcall()-->sunrpc_cache_pipe_upcall()-->idtoname_request()
In sunrpc_cache_pipe_upcall() kmalloc memory to save the imapd_msg info, and should release after cache_file_operations_procfs.read.
----------------------------------------------------------------------------------------------------------------------------------------
man 7 nfsd
Each directory representing a cache can hold from 1 to 3 files. They are:
flush When a number of seconds since epoch (1 Jan 1970) is written to this file, all entries in the cache that were last updated before that file
become invalidated and will be flushed out. Writing 1 will flush everything. This is the only file that will always be present.
content
This file, if present, contains a textual representation of ever entry in the cache, one per line. If an entry is still in the cache
(because it is actively being used) but has expired or is otherwise invalid, it will be presented as a comment (with a leading hash charac‐
ter).
channel
This file, if present, acts a channel for request from the kernel-based nfs server to be passed to a user-space program for handling.
When the kernel needs some information which isn't in the cache, it makes a line appear in the channel file giving the key for the informa‐
tion. A user-space program should read this, find the answer, and write a line containing the key, an expiry time, and the content. For
example the kernel might make
nfsd 127.0.0.1
appear in the auth.unix.ip/content file. The user-space program might then write
nfsd 127.0.0.1 1057206953 localhost
to indicate that 127.0.0.1 should map to localhost, at least for now.
If the program uses select(2) or poll(2) to discover if it can read from the channel then it will never see and end-of-file but when all
requests have been answered, it will block until another request appears.
阅读(1876) | 评论(0) | 转发(0) |