[JFFS2] Use f->target instead of f->dents for symlink target

JFFS2 uses f->dents to store the pointer to the symlink target string (in case
the inode is symlink). This is somewhat ugly to use the same field for
different reasons. Introduce distinct field f->target for this purpose.
Note, f->fragtree, f->dents, f->target may probably be put in a union.

Signed-off-by: Artem B. Bityutskiy <dedekind@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Artem B. Bityutskiy
2005-07-17 12:13:51 +01:00
committed by Thomas Gleixner
parent 730554d946
commit 2b79adcca1
5 changed files with 44 additions and 47 deletions

View File

@ -7,7 +7,7 @@
*
* For licensing information, see the file 'LICENCE' in this directory.
*
* $Id: symlink.c,v 1.16 2005/03/01 10:50:48 dedekind Exp $
* $Id: symlink.c,v 1.18 2005/11/06 11:03:27 gleixner Exp $
*
*/
@ -30,35 +30,33 @@ struct inode_operations jffs2_symlink_inode_operations =
static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
{
struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
char *p = (char *)f->dents;
char *p = (char *)f->target;
/*
* We don't acquire the f->sem mutex here since the only data we
* use is f->dents which in case of the symlink inode points to the
* symlink's target path.
* use is f->target.
*
* 1. If we are here the inode has already built and f->dents has
* 1. If we are here the inode has already built and f->target has
* to point to the target path.
* 2. Nobody uses f->dents (if the inode is symlink's inode). The
* exception is inode freeing function which frees f->dents. But
* 2. Nobody uses f->target (if the inode is symlink's inode). The
* exception is inode freeing function which frees f->target. But
* it can't be called while we are here and before VFS has
* stopped using our f->dents string which we provide by means of
* stopped using our f->target string which we provide by means of
* nd_set_link() call.
*/
if (!p) {
printk(KERN_ERR "jffs2_follow_link(): can't find symlink taerget\n");
p = ERR_PTR(-EIO);
} else {
D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->dents));
}
D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->target));
nd_set_link(nd, p);
/*
* We unlock the f->sem mutex but VFS will use the f->dents string. This is safe
* since the only way that may cause f->dents to be changed is iput() operation.
* But VFS will not use f->dents after iput() has been called.
* We will unlock the f->sem mutex but VFS will use the f->target string. This is safe
* since the only way that may cause f->target to be changed is iput() operation.
* But VFS will not use f->target after iput() has been called.
*/
return NULL;
}