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}; |