VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / fs / jffs2 / symlink.c
index 46d306c..958cafb 100644 (file)
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: symlink.c,v 1.12 2003/10/04 08:33:07 dwmw2 Exp $
+ * $Id: symlink.c,v 1.13 2004/07/13 08:59:04 dwmw2 Exp $
  *
  */
 
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
+#include <linux/namei.h>
 #include "nodelist.h"
 
-int jffs2_readlink(struct dentry *dentry, char *buffer, int buflen);
-int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
+static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
+static void jffs2_put_link(struct dentry *dentry, struct nameidata *nd);
 
 struct inode_operations jffs2_symlink_inode_operations =
 {      
-       .readlink =     jffs2_readlink,
+       .readlink =     generic_readlink,
        .follow_link =  jffs2_follow_link,
+       .put_link =     jffs2_put_link,
        .setattr =      jffs2_setattr
 };
 
-int jffs2_readlink(struct dentry *dentry, char *buffer, int buflen)
-{
-       unsigned char *kbuf;
-       int ret;
-
-       kbuf = jffs2_getlink(JFFS2_SB_INFO(dentry->d_inode->i_sb), JFFS2_INODE_INFO(dentry->d_inode));
-       if (IS_ERR(kbuf))
-               return PTR_ERR(kbuf);
-
-       ret = vfs_readlink(dentry, buffer, buflen, kbuf);
-       kfree(kbuf);
-       return ret;
-}
-
-int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
+static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
        unsigned char *buf;
-       int ret;
-
        buf = jffs2_getlink(JFFS2_SB_INFO(dentry->d_inode->i_sb), JFFS2_INODE_INFO(dentry->d_inode));
+       nd_set_link(nd, buf);
+       return 0;
+}
 
-       if (IS_ERR(buf))
-               return PTR_ERR(buf);
-
-       ret = vfs_follow_link(nd, buf);
-       kfree(buf);
-       return ret;
+static void jffs2_put_link(struct dentry *dentry, struct nameidata *nd)
+{
+       char *s = nd_get_link(nd);
+       if (!IS_ERR(s))
+               kfree(s);
 }