Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

jffs2: switch to simple_follow_link()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro a8db149f 75e7566b

+3 -44
+1
fs/jffs2/dir.c
··· 354 354 ret = -ENOMEM; 355 355 goto fail; 356 356 } 357 + inode->i_link = f->target; 357 358 358 359 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n", 359 360 __func__, (char *)f->target);
+1
fs/jffs2/fs.c
··· 294 294 295 295 case S_IFLNK: 296 296 inode->i_op = &jffs2_symlink_inode_operations; 297 + inode->i_link = f->target; 297 298 break; 298 299 299 300 case S_IFDIR:
+1 -44
fs/jffs2/symlink.c
··· 9 9 * 10 10 */ 11 11 12 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 - 14 - #include <linux/kernel.h> 15 - #include <linux/fs.h> 16 - #include <linux/namei.h> 17 12 #include "nodelist.h" 18 - 19 - static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd); 20 13 21 14 const struct inode_operations jffs2_symlink_inode_operations = 22 15 { 23 16 .readlink = generic_readlink, 24 - .follow_link = jffs2_follow_link, 17 + .follow_link = simple_follow_link, 25 18 .setattr = jffs2_setattr, 26 19 .setxattr = jffs2_setxattr, 27 20 .getxattr = jffs2_getxattr, 28 21 .listxattr = jffs2_listxattr, 29 22 .removexattr = jffs2_removexattr 30 23 }; 31 - 32 - static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd) 33 - { 34 - struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(dentry)); 35 - char *p = (char *)f->target; 36 - 37 - /* 38 - * We don't acquire the f->sem mutex here since the only data we 39 - * use is f->target. 40 - * 41 - * 1. If we are here the inode has already built and f->target has 42 - * to point to the target path. 43 - * 2. Nobody uses f->target (if the inode is symlink's inode). The 44 - * exception is inode freeing function which frees f->target. But 45 - * it can't be called while we are here and before VFS has 46 - * stopped using our f->target string which we provide by means of 47 - * nd_set_link() call. 48 - */ 49 - 50 - if (!p) { 51 - pr_err("%s(): can't find symlink target\n", __func__); 52 - p = ERR_PTR(-EIO); 53 - } 54 - jffs2_dbg(1, "%s(): target path is '%s'\n", 55 - __func__, (char *)f->target); 56 - 57 - nd_set_link(nd, p); 58 - 59 - /* 60 - * We will unlock the f->sem mutex but VFS will use the f->target string. This is safe 61 - * since the only way that may cause f->target to be changed is iput() operation. 62 - * But VFS will not use f->target after iput() has been called. 63 - */ 64 - return NULL; 65 - } 66 -