Hi, Sergiu Ivanov wrote: > diff --git a/eth-multiplexer/device_impl.c b/eth-multiplexer/device_impl.c > index 4b2d37d..abbd146 100644 > --- a/eth-multiplexer/device_impl.c > +++ b/eth-multiplexer/device_impl.c > @@ -98,8 +98,6 @@ ds_device_open (mach_port_t master_port, mach_port_t > reply_port, > { > extern struct port_bucket *port_bucket; > extern struct port_class *vdev_portclass; > - extern struct stat underlying_node_stat; > - static int ino_count = 0; > /* Create a new light node (virtual device). */ > struct lnode *ln = (struct lnode *) add_vdev (pi->po->np->nn->name, > sizeof (*ln), > @@ -110,13 +108,12 @@ ds_device_open (mach_port_t master_port, mach_port_t > reply_port, > ports_port_deref (pi); > return D_NO_MEMORY; > } > - memset (&ln->st, 0, sizeof (ln->st)); > - ln->st.st_ino = ++ino_count; > - ln->st.st_mode = S_IFCHR | (underlying_node_stat.st_mode & ~S_IFMT); > - ln->st.st_ctime = ln->st.st_mtime = ln->st.st_atime = time (NULL); > - fshelp_touch (&ln->st, TOUCH_ATIME|TOUCH_MTIME|TOUCH_CTIME, > - multiplexer_maptime); > - pi->po->np->nn->ln = ln; > + > + /* Connect the libnetfs node and the light node together. */ > + ln->n = pi->po->np; > + ln->n->nn->ln = ln; > + > + ln->st = ln->n->nn_stat; > } > > dev = (struct vether_device *) pi->po->np->nn->ln; > diff --git a/eth-multiplexer/multiplexer.c b/eth-multiplexer/multiplexer.c > index 1d0b7ed..173a8f9 100644 > --- a/eth-multiplexer/multiplexer.c > +++ b/eth-multiplexer/multiplexer.c > @@ -180,7 +180,7 @@ main (int argc, char *argv[]) > > stat.st_mode &= ~(S_ITRANS | S_IFMT); > stat.st_mode |= S_IFDIR; > - netfs_root_node->nn->ln->st = stat; > + netfs_root_node->nn_stat = stat; > fshelp_touch (&netfs_root_node->nn_stat, > TOUCH_ATIME|TOUCH_MTIME|TOUCH_CTIME, > multiplexer_maptime); > > diff --git a/eth-multiplexer/netfs_impl.c b/eth-multiplexer/netfs_impl.c > index 40015a8..c70701b 100644 > --- a/eth-multiplexer/netfs_impl.c > +++ b/eth-multiplexer/netfs_impl.c > @@ -64,6 +64,8 @@ new_node (struct lnode *ln, struct node **np) > struct netnode *nn = calloc (1, sizeof *nn); > struct node *node; > > + nn->flags = NODE_STAT_INVALID; > + > if (nn == 0) > return ENOMEM; > node = netfs_make_node (nn); > @@ -163,16 +165,34 @@ netfs_report_access (struct iouser *cred, struct node > *node, int *types) > error_t > netfs_validate_stat (struct node *node, struct iouser *cred) > { > - struct stat st; > + debug("node: %p", node); > + > + if (node == netfs_root_node) > + /* The stat information about the root node has already been > + initialized at startup. */ > + return 0; > + > + if (node->nn->flags & NODE_STAT_INVALID) > + { > + /* This node has just been created. */ > + > + static int ino_count = 0; > + io_statbuf_t * statp = &node->nn_stat; > + > + memset (statp, 0, sizeof (io_statbuf_t)); > + > + statp->st_ino = ++ino_count; > + statp->st_mode = S_IFCHR | (underlying_node_stat.st_mode & ~S_IFMT); > + > + fshelp_touch (statp, TOUCH_ATIME | TOUCH_MTIME | TOUCH_CTIME, > + multiplexer_maptime); > + > + node->nn->flags &= ~NODE_STAT_INVALID; > + } I'm not as familiar with netfs as you. Could you tell me why initializing node status here is perferred?
Best regards, Zheng Da