static int sysfs_follow_link(struct dentry *dentry, struct nameidata *nd) { int error = -ENOMEM; unsigned long page = get_zeroed_page(GFP_KERNEL); if (page) error = sysfs_getlink(dentry, (char *) page); nd_set_link(nd, error ? ERR_PTR(error) : (char *)page); return 0; }
static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd) { int error = -ENOMEM; unsigned long page = get_zeroed_page(GFP_KERNEL); if (page) { error = sysfs_getlink(dentry, (char *) page); if (error < 0) free_page((unsigned long)page); } nd_set_link(nd, error ? ERR_PTR(error) : (char *)page); return NULL; }
int sysfs_follow_link(struct dentry *dentry, struct nameidata *nd) { int error = 0; unsigned long page = get_zeroed_page(GFP_KERNEL); if (!page) return -ENOMEM; error = sysfs_getlink(dentry, (char *) page); if (!error) error = vfs_follow_link(nd, (char *) page); free_page(page); return error; }
int sysfs_readlink(struct dentry *dentry, char __user *buffer, int buflen) { int error = 0; unsigned long page = get_zeroed_page(GFP_KERNEL); if (!page) return -ENOMEM; error = sysfs_getlink(dentry, (char *) page); if (!error) error = vfs_readlink(dentry, buffer, buflen, (char *) page); free_page(page); return error; }