}
-static void *configfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static const char *configfs_follow_link(struct dentry *dentry, void **cookie, struct nameidata *nd)
{
- int error = -ENOMEM;
unsigned long page = get_zeroed_page(GFP_KERNEL);
+ int error;
- if (page) {
- error = configfs_getlink(dentry, (char *)page);
- if (!error) {
- nd_set_link(nd, (char *)page);
- return (void *)page;
- }
+ if (!page)
+ return ERR_PTR(-ENOMEM);
+
+ error = configfs_getlink(dentry, (char *)page);
+ if (!error) {
+ return *cookie = (void *)page;
}
- nd_set_link(nd, ERR_PTR(error));
- return NULL;
+ free_page(page);
+ return ERR_PTR(error);
}
-static void configfs_put_link(struct dentry *dentry, struct nameidata *nd,
- void *cookie)
+static void configfs_put_link(struct dentry *dentry, void *cookie)
{
- if (cookie) {
- unsigned long page = (unsigned long)cookie;
- free_page(page);
- }
+ free_page((unsigned long)cookie);
}
const struct inode_operations configfs_symlink_inode_operations = {