summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2013-12-07 15:57:17 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2013-12-09 15:07:59 +0100
commit2ce5406504540399ed78306198802fc4e1824de7 (patch)
treef1aa029cbe1b85b72cd8a26de07ff04c8ab33814
parentcf1cc29af12447c347a5574b4dc1568c7db61c0b (diff)
trans: improve the performance of dir_lookup in fakeroot
Previously any FS_RETRY_NORMAL requests were handed back to the client. Redo the lookup ourself instead. This saves us the burden to create a fake node for the intermediate step, hand it back to the client and handle another request from the client. With this change there is no need to fiddle with the permission bits as it was previously done. * trans/fakeroot.c (netfs_S_dir_lookup): Redo the lookup transparently for the user if FS_RETRY_NORMAL is requested. fixup_improve_perf
-rw-r--r--trans/fakeroot.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 1ab32167..6e3b5d4b 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -267,6 +267,14 @@ netfs_S_dir_lookup (struct protid *diruser,
goto redo_lookup;
case FS_RETRY_NORMAL:
+ if (retry_name[0] != '\0')
+ {
+ dir = file;
+ filename = retry_name;
+ goto redo_lookup;
+ }
+ break;
+
case FS_RETRY_MAGICAL:
default:
if (file == MACH_PORT_NULL)
@@ -305,10 +313,6 @@ netfs_S_dir_lookup (struct protid *diruser,
/* We already know about this node. */
mach_port_deallocate (mach_task_self (), idport);
pthread_mutex_lock (&np->lock);
- if (retry_name[0] != '\0')
- /* This was not the last component, remove O_WRITE to
- avoid opening directories with it. */
- flags &= ~O_WRITE;
err = check_openmodes (np->nn, (flags & (O_RDWR|O_EXEC)), file);
if (!err)
netfs_nref (np);