Fixes problem caused by change in follow link semantics.
Signed-off-by: Charles Manning <cdhmanning@gmail.com>
#define YAFFS_COMPILE_EXPORTFS
#endif
#define YAFFS_COMPILE_EXPORTFS
#endif
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
+#define YAFFS_NEW_FOLLOW_LINK 1
+#else
+#define YAFFS_NEW_FOLLOW_LINK 0
+#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
#include <linux/config.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
#include <linux/config.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/string.h>
#include <linux/ctype.h>
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
+#include <linux/namei.h>
+#endif
+
#ifdef YAFFS_COMPILE_EXPORTFS
#include <linux/exportfs.h>
#endif
#ifdef YAFFS_COMPILE_EXPORTFS
#include <linux/exportfs.h>
#endif
static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
int buflen);
static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
int buflen);
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
+void yaffs_put_link(struct dentry *dentry, struct nameidata *nd, void *alias);
static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
#else
static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
#endif
static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
#else
static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
#endif
static loff_t yaffs_dir_llseek(struct file *file, loff_t offset, int origin);
static struct address_space_operations yaffs_file_address_operations = {
static loff_t yaffs_dir_llseek(struct file *file, loff_t offset, int origin);
static struct address_space_operations yaffs_file_address_operations = {
static const struct inode_operations yaffs_symlink_inode_operations = {
.readlink = yaffs_readlink,
.follow_link = yaffs_follow_link,
static const struct inode_operations yaffs_symlink_inode_operations = {
.readlink = yaffs_readlink,
.follow_link = yaffs_follow_link,
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
+ .put_link = yaffs_put_link,
+#endif
.setattr = yaffs_setattr,
#ifdef CONFIG_YAFFS_XATTR
.setxattr = yaffs_setxattr,
.setattr = yaffs_setattr,
#ifdef CONFIG_YAFFS_XATTR
.setxattr = yaffs_setxattr,
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
#else
static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
#else
static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
yaffs_GrossLock(dev);
alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry));
yaffs_GrossLock(dev);
alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry));
yaffs_GrossUnlock(dev);
if (!alias) {
yaffs_GrossUnlock(dev);
if (!alias) {
- ret = vfs_follow_link(nd, alias);
- kfree(alias);
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
+ nd_set_link(nd, alias);
+ ret = (int)alias;
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
return ERR_PTR(ret);
#else
return ERR_PTR(ret);
#else
+ ret = vfs_follow_link(nd, alias);
+ kfree(alias);
+out:
+#if (YAFFS_NEW_FOLLOW_LINK == 1)
+void yaffs_put_link(struct dentry *dentry, struct nameidata *nd, void *alias) {
+ kfree(alias);
+}
+#endif
+
struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
yaffs_Object *obj);
struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
yaffs_Object *obj);