summaryrefslogtreecommitdiffstats
path: root/fs/gfs2/inode.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-05-02 13:32:22 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-05-10 22:19:45 -0400
commit680baacbca69d18a6d7315374ad83d05ac9c0977 (patch)
treea69822ef5234d4a308b780ff51c5d9b77bd3a89b /fs/gfs2/inode.c
parent46afd6f61cc33ae4b3a2aed4bb454d11d4114c27 (diff)
new ->follow_link() and ->put_link() calling conventions
a) instead of storing the symlink body (via nd_set_link()) and returning an opaque pointer later passed to ->put_link(), ->follow_link() _stores_ that opaque pointer (into void * passed by address by caller) and returns the symlink body. Returning ERR_PTR() on error, NULL on jump (procfs magic symlinks) and pointer to symlink body for normal symlinks. Stored pointer is ignored in all cases except the last one. Storing NULL for opaque pointer (or not storing it at all) means no call of ->put_link(). b) the body used to be passed to ->put_link() implicitly (via nameidata). Now only the opaque pointer is. In the cases when we used the symlink body to free stuff, ->follow_link() now should store it as opaque pointer in addition to returning it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r--fs/gfs2/inode.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 1b3ca7a2e3fc..f59390aebffb 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1548,7 +1548,7 @@ out:
1548 * Returns: 0 on success or error code 1548 * Returns: 0 on success or error code
1549 */ 1549 */
1550 1550
1551static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd) 1551static const char *gfs2_follow_link(struct dentry *dentry, void **cookie, struct nameidata *nd)
1552{ 1552{
1553 struct gfs2_inode *ip = GFS2_I(d_inode(dentry)); 1553 struct gfs2_inode *ip = GFS2_I(d_inode(dentry));
1554 struct gfs2_holder i_gh; 1554 struct gfs2_holder i_gh;
@@ -1561,8 +1561,7 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
1561 error = gfs2_glock_nq(&i_gh); 1561 error = gfs2_glock_nq(&i_gh);
1562 if (error) { 1562 if (error) {
1563 gfs2_holder_uninit(&i_gh); 1563 gfs2_holder_uninit(&i_gh);
1564 nd_set_link(nd, ERR_PTR(error)); 1564 return ERR_PTR(error);
1565 return NULL;
1566 } 1565 }
1567 1566
1568 size = (unsigned int)i_size_read(&ip->i_inode); 1567 size = (unsigned int)i_size_read(&ip->i_inode);
@@ -1586,8 +1585,9 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
1586 brelse(dibh); 1585 brelse(dibh);
1587out: 1586out:
1588 gfs2_glock_dq_uninit(&i_gh); 1587 gfs2_glock_dq_uninit(&i_gh);
1589 nd_set_link(nd, buf); 1588 if (!IS_ERR(buf))
1590 return NULL; 1589 *cookie = buf;
1590 return buf;
1591} 1591}
1592 1592
1593/** 1593/**