symlink.c (cd3417c8fc9504cc1afe944515f338aff9ec286b) symlink.c (fceef393a538134f03b778c5d2519e670269342f)
1/*
2 * fs/kernfs/symlink.c - kernfs symlink implementation
3 *
4 * Copyright (c) 2001-3 Patrick Mochel
5 * Copyright (c) 2007 SUSE Linux Products GmbH
6 * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
7 *
8 * This file is released under the GPLv2.

--- 99 unchanged lines hidden (view full) ---

108 mutex_lock(&kernfs_mutex);
109 error = kernfs_get_target_path(parent, target, path);
110 mutex_unlock(&kernfs_mutex);
111
112 return error;
113}
114
115static const char *kernfs_iop_get_link(struct dentry *dentry,
1/*
2 * fs/kernfs/symlink.c - kernfs symlink implementation
3 *
4 * Copyright (c) 2001-3 Patrick Mochel
5 * Copyright (c) 2007 SUSE Linux Products GmbH
6 * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
7 *
8 * This file is released under the GPLv2.

--- 99 unchanged lines hidden (view full) ---

108 mutex_lock(&kernfs_mutex);
109 error = kernfs_get_target_path(parent, target, path);
110 mutex_unlock(&kernfs_mutex);
111
112 return error;
113}
114
115static const char *kernfs_iop_get_link(struct dentry *dentry,
116 struct inode *inode, void **cookie)
116 struct inode *inode,
117 struct delayed_call *done)
117{
118{
118 int error = -ENOMEM;
119 char *page;
119 char *body;
120 int error;
120
121 if (!dentry)
122 return ERR_PTR(-ECHILD);
121
122 if (!dentry)
123 return ERR_PTR(-ECHILD);
123 page = kzalloc(PAGE_SIZE, GFP_KERNEL);
124 if (!page)
124 body = kzalloc(PAGE_SIZE, GFP_KERNEL);
125 if (!body)
125 return ERR_PTR(-ENOMEM);
126 return ERR_PTR(-ENOMEM);
126 error = kernfs_getlink(dentry, page);
127 error = kernfs_getlink(dentry, body);
127 if (unlikely(error < 0)) {
128 if (unlikely(error < 0)) {
128 kfree(page);
129 kfree(body);
129 return ERR_PTR(error);
130 }
130 return ERR_PTR(error);
131 }
131 return *cookie = page;
132 set_delayed_call(done, kfree_link, body);
133 return body;
132}
133
134const struct inode_operations kernfs_symlink_iops = {
135 .setxattr = kernfs_iop_setxattr,
136 .removexattr = kernfs_iop_removexattr,
137 .getxattr = kernfs_iop_getxattr,
138 .listxattr = kernfs_iop_listxattr,
139 .readlink = generic_readlink,
140 .get_link = kernfs_iop_get_link,
134}
135
136const struct inode_operations kernfs_symlink_iops = {
137 .setxattr = kernfs_iop_setxattr,
138 .removexattr = kernfs_iop_removexattr,
139 .getxattr = kernfs_iop_getxattr,
140 .listxattr = kernfs_iop_listxattr,
141 .readlink = generic_readlink,
142 .get_link = kernfs_iop_get_link,
141 .put_link = kfree_put_link,
142 .setattr = kernfs_iop_setattr,
143 .getattr = kernfs_iop_getattr,
144 .permission = kernfs_iop_permission,
145};
143 .setattr = kernfs_iop_setattr,
144 .getattr = kernfs_iop_getattr,
145 .permission = kernfs_iop_permission,
146};