mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 15:42:32 +00:00
VFS: delay the dentry name generation on sockets and pipes
1) Introduces a new method in 'struct dentry_operations'. This method called d_dname() might be called from d_path() to build a pathname for special filesystems. It is called without locks. Future patches (if we succeed in having one common dentry for all pipes/sockets) may need to change prototype of this method, but we now use : char *d_dname(struct dentry *dentry, char *buffer, int buflen); 2) Adds a dynamic_dname() helper function that eases d_dname() implementations 3) Defines d_dname method for sockets : No more sprintf() at socket creation. This is delayed up to the moment someone does an access to /proc/pid/fd/... 4) Defines d_dname method for pipes : No more sprintf() at pipe creation. This is delayed up to the moment someone does an access to /proc/pid/fd/... A benchmark consisting of 1.000.000 calls to pipe()/close()/close() gives a *nice* speedup on my Pentium(M) 1.6 Ghz : 3.090 s instead of 3.450 s Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Acked-by: Christoph Hellwig <hch@infradead.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2793274298
commit
c23fbb6bcb
6 changed files with 86 additions and 14 deletions
31
fs/dcache.c
31
fs/dcache.c
|
@ -1853,6 +1853,16 @@ char * d_path(struct dentry *dentry, struct vfsmount *vfsmnt,
|
|||
struct vfsmount *rootmnt;
|
||||
struct dentry *root;
|
||||
|
||||
/*
|
||||
* We have various synthetic filesystems that never get mounted. On
|
||||
* these filesystems dentries are never used for lookup purposes, and
|
||||
* thus don't need to be hashed. They also don't need a name until a
|
||||
* user wants to identify the object in /proc/pid/fd/. The little hack
|
||||
* below allows us to generate a name for these objects on demand:
|
||||
*/
|
||||
if (dentry->d_op && dentry->d_op->d_dname)
|
||||
return dentry->d_op->d_dname(dentry, buf, buflen);
|
||||
|
||||
read_lock(¤t->fs->lock);
|
||||
rootmnt = mntget(current->fs->rootmnt);
|
||||
root = dget(current->fs->root);
|
||||
|
@ -1865,6 +1875,27 @@ char * d_path(struct dentry *dentry, struct vfsmount *vfsmnt,
|
|||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for dentry_operations.d_dname() members
|
||||
*/
|
||||
char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char temp[64];
|
||||
int sz;
|
||||
|
||||
va_start(args, fmt);
|
||||
sz = vsnprintf(temp, sizeof(temp), fmt, args) + 1;
|
||||
va_end(args);
|
||||
|
||||
if (sz > sizeof(temp) || sz > buflen)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
|
||||
buffer += buflen - sz;
|
||||
return memcpy(buffer, temp, sz);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE! The user-level library version returns a
|
||||
* character pointer. The kernel system call just
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue