diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-11-17 10:20:54 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-12-08 22:41:54 -0500 |
commit | 6b2553918d8b4e6de9853fd6315bec7271a2e592 (patch) | |
tree | 85540dcb0dc0de3d67c68d0aa7b17058f4e96539 /fs/configfs | |
parent | 21fc61c73c3903c4c312d0802da01ec2b323d174 (diff) |
replace ->follow_link() with new method that could stay in RCU mode
new method: ->get_link(); replacement of ->follow_link(). The differences
are:
* inode and dentry are passed separately
* might be called both in RCU and non-RCU mode;
the former is indicated by passing it a NULL dentry.
* when called that way it isn't allowed to block
and should return ERR_PTR(-ECHILD) if it needs to be called
in non-RCU mode.
It's a flagday change - the old method is gone, all in-tree instances
converted. Conversion isn't hard; said that, so far very few instances
do not immediately bail out when called in RCU mode. That'll change
in the next commits.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/configfs')
-rw-r--r-- | fs/configfs/symlink.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/configfs/symlink.c b/fs/configfs/symlink.c index ec5c8325b503..b91c01ebb688 100644 --- a/fs/configfs/symlink.c +++ b/fs/configfs/symlink.c | |||
@@ -279,11 +279,16 @@ static int configfs_getlink(struct dentry *dentry, char * path) | |||
279 | 279 | ||
280 | } | 280 | } |
281 | 281 | ||
282 | static const char *configfs_follow_link(struct dentry *dentry, void **cookie) | 282 | static const char *configfs_get_link(struct dentry *dentry, |
283 | struct inode *inode, void **cookie) | ||
283 | { | 284 | { |
284 | unsigned long page = get_zeroed_page(GFP_KERNEL); | 285 | unsigned long page; |
285 | int error; | 286 | int error; |
286 | 287 | ||
288 | if (!dentry) | ||
289 | return ERR_PTR(-ECHILD); | ||
290 | |||
291 | page = get_zeroed_page(GFP_KERNEL); | ||
287 | if (!page) | 292 | if (!page) |
288 | return ERR_PTR(-ENOMEM); | 293 | return ERR_PTR(-ENOMEM); |
289 | 294 | ||
@@ -297,7 +302,7 @@ static const char *configfs_follow_link(struct dentry *dentry, void **cookie) | |||
297 | } | 302 | } |
298 | 303 | ||
299 | const struct inode_operations configfs_symlink_inode_operations = { | 304 | const struct inode_operations configfs_symlink_inode_operations = { |
300 | .follow_link = configfs_follow_link, | 305 | .get_link = configfs_get_link, |
301 | .readlink = generic_readlink, | 306 | .readlink = generic_readlink, |
302 | .put_link = free_page_put_link, | 307 | .put_link = free_page_put_link, |
303 | .setattr = configfs_setattr, | 308 | .setattr = configfs_setattr, |