diff options
author | Sergiu Ivanov <unlimitedscolobb@gmail.com> | 2009-02-20 18:43:57 +0200 |
---|---|---|
committer | Sergiu Ivanov <unlimitedscolobb@gmail.com> | 2009-02-20 18:43:57 +0200 |
commit | 2fc7f8c49fc34cd2db65c36400200082a62138a1 (patch) | |
tree | 0ec2e55368532c8a12cfae9650cf211c63fc7e50 /nsmux.c | |
parent | 0a878aaf9fadb891a6067f8f084baa8ca5c30521 (diff) |
Dynamic translator stacks are set in series of retries
When a client wants nsmux to set several translators on a node
using a syntax like ``file,,x,,y'', nsmux sets the first
translator on a shadow node mirroring ``file'' and punts a
retry to the client. The client (commonly) does the retry and
thus control comes back to nsmux, which creates another shadow
node and sets the second translator on this node.
At the moment translator stacks do not include proxy nodes, i.e.
the structure of a dynamic translator stack is:
...---dynamic translator -- shadow node -- dynamic translator ---...
Diffstat (limited to 'nsmux.c')
-rw-r--r-- | nsmux.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -166,7 +166,8 @@ error_t /*Validates the stat data for the node*/ error_t netfs_validate_stat (struct node * np, struct iouser * cred) { - LOG_MSG ("netfs_validate_stat: '%s'", (np ? np->nn->lnode->name : "")); + LOG_MSG ("netfs_validate_stat: '%s'", + ((np && np->nn->lnode) ? np->nn->lnode->name : "")); error_t err = 0; @@ -896,8 +897,21 @@ error_t /*We have to create a shadow node and set a translator on it. */ - error = netfs_attempt_lookup_improved - (diruser->user, dnp, filename, flags, lastcomp, &np, &file, 1); + if (sep == filename + 2) + { + /*this is a retry, so no need to do lookups */ + error = 0; + np = dnp; + netfs_nref (np); + + mutex_unlock (&np->lock); + } + else + /*lookup the file in the real filesystem */ + error = netfs_attempt_lookup_improved + (diruser->user, dnp, filename, flags, + lastcomp, &np, &file, 1); + if (!error && !excl) { /*if there is at least one more separator in the @@ -921,8 +935,6 @@ error_t free (trans); /*prepare the information for the retry */ - -/* *retry_port_type = MACH_MSG_TYPE_MOVE_SEND; */ strcpy (retry_name, nextsep); if (nextname) { |