|
@@ -7,7 +7,7 @@
|
|
|
*
|
|
|
* For licensing information, see the file 'LICENCE' in this directory.
|
|
|
*
|
|
|
- * $Id: readinode.c,v 1.126 2005/07/17 06:56:21 dedekind Exp $
|
|
|
+ * $Id: readinode.c,v 1.127 2005/07/17 11:13:46 dedekind Exp $
|
|
|
*
|
|
|
*/
|
|
|
|
|
@@ -547,11 +547,10 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
|
|
|
|
|
|
if (f->inocache->state != INO_STATE_CHECKING) {
|
|
|
/* Symlink's inode data is the target path. Read it and
|
|
|
- * keep in RAM to facilitate quick follow symlink operation.
|
|
|
- * We use f->dents field to store the target path, which
|
|
|
- * is somewhat ugly. */
|
|
|
- f->dents = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL);
|
|
|
- if (!f->dents) {
|
|
|
+ * keep in RAM to facilitate quick follow symlink
|
|
|
+ * operation. */
|
|
|
+ f->target = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL);
|
|
|
+ if (!f->target) {
|
|
|
printk(KERN_WARNING "Can't allocate %d bytes of memory "
|
|
|
"for the symlink target path cache\n",
|
|
|
je32_to_cpu(latest_node->csize));
|
|
@@ -561,21 +560,21 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
|
|
|
}
|
|
|
|
|
|
ret = jffs2_flash_read(c, ref_offset(fn->raw) + sizeof(*latest_node),
|
|
|
- je32_to_cpu(latest_node->csize), &retlen, (char *)f->dents);
|
|
|
+ je32_to_cpu(latest_node->csize), &retlen, (char *)f->target);
|
|
|
|
|
|
if (ret || retlen != je32_to_cpu(latest_node->csize)) {
|
|
|
if (retlen != je32_to_cpu(latest_node->csize))
|
|
|
ret = -EIO;
|
|
|
- kfree(f->dents);
|
|
|
- f->dents = NULL;
|
|
|
+ kfree(f->target);
|
|
|
+ f->target = NULL;
|
|
|
up(&f->sem);
|
|
|
jffs2_do_clear_inode(c, f);
|
|
|
return -ret;
|
|
|
}
|
|
|
|
|
|
- ((char *)f->dents)[je32_to_cpu(latest_node->csize)] = '\0';
|
|
|
+ f->target[je32_to_cpu(latest_node->csize)] = '\0';
|
|
|
D1(printk(KERN_DEBUG "jffs2_do_read_inode(): symlink's target '%s' cached\n",
|
|
|
- (char *)f->dents));
|
|
|
+ f->target));
|
|
|
}
|
|
|
|
|
|
/* fall through... */
|
|
@@ -638,20 +637,16 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f)
|
|
|
|
|
|
jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL);
|
|
|
|
|
|
- /* For symlink inodes we us f->dents to store the target path name */
|
|
|
- if (S_ISLNK(OFNI_EDONI_2SFFJ(f)->i_mode)) {
|
|
|
- if (f->dents) {
|
|
|
- kfree(f->dents);
|
|
|
- f->dents = NULL;
|
|
|
- }
|
|
|
- } else {
|
|
|
- fds = f->dents;
|
|
|
-
|
|
|
- while(fds) {
|
|
|
- fd = fds;
|
|
|
- fds = fd->next;
|
|
|
- jffs2_free_full_dirent(fd);
|
|
|
- }
|
|
|
+ if (f->target) {
|
|
|
+ kfree(f->target);
|
|
|
+ f->target = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ fds = f->dents;
|
|
|
+ while(fds) {
|
|
|
+ fd = fds;
|
|
|
+ fds = fd->next;
|
|
|
+ jffs2_free_full_dirent(fd);
|
|
|
}
|
|
|
|
|
|
if (f->inocache && f->inocache->state != INO_STATE_CHECKING) {
|