Wrapfs: use new get_link operation
authorErez Zadok <ezk@cs.sunysb.edu>
Sun, 3 Apr 2016 21:22:07 +0000 (17:22 -0400)
committerRohit Kumar <rokkumar@cs.stonybrook.edu>
Fri, 12 Oct 2018 16:28:43 +0000 (12:28 -0400)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/inode.c

index 07c6aa9fc8d21a7ff7e1fd815700a8b10ae9cd79..4c43ce7227e85620175695681a57d539193fcca5 100644 (file)
@@ -311,12 +311,16 @@ out:
        return err;
 }
 
-static const char *wrapfs_follow_link(struct dentry *dentry, void **cookie)
+static const char *wrapfs_get_link(struct dentry *dentry, struct inode *inode,
+                                  struct delayed_call *done)
 {
        char *buf;
        int len = PAGE_SIZE, err;
        mm_segment_t old_fs;
 
+       if (!dentry)
+               return ERR_PTR(-ECHILD);
+
        /* This is freed by the put_link method assuming a successful call. */
        buf = kmalloc(len, GFP_KERNEL);
        if (!buf) {
@@ -335,7 +339,8 @@ static const char *wrapfs_follow_link(struct dentry *dentry, void **cookie)
        } else {
                buf[err] = '\0';
        }
-       return *cookie = buf;
+       set_delayed_call(done, kfree_link, buf);
+       return buf;
 }
 
 static int wrapfs_permission(struct inode *inode, int mask)
@@ -542,10 +547,9 @@ out:
 const struct inode_operations wrapfs_symlink_iops = {
        .readlink       = wrapfs_readlink,
        .permission     = wrapfs_permission,
-       .follow_link    = wrapfs_follow_link,
        .setattr        = wrapfs_setattr,
        .getattr        = wrapfs_getattr,
-       .put_link       = kfree_put_link,
+       .get_link       = wrapfs_get_link,
        .setxattr       = wrapfs_setxattr,
        .getxattr       = wrapfs_getxattr,
        .listxattr      = wrapfs_listxattr,