static const char *ecryptfs_follow_link(struct dentry *dentry, void **cookie) { size_t len; char *buf = ecryptfs_readlink_lower(dentry, &len); if (IS_ERR(buf)) return buf; fsstack_copy_attr_atime(d_inode(dentry), d_inode(ecryptfs_dentry_to_lower(dentry))); buf[len] = '\0'; return *cookie = buf; }
static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd) { size_t len; char *buf = ecryptfs_readlink_lower(dentry, &len); if (IS_ERR(buf)) goto out; fsstack_copy_attr_atime(dentry->d_inode, ecryptfs_dentry_to_lower(dentry)->d_inode); buf[len] = '\0'; out: nd_set_link(nd, buf); return NULL; }
static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd) { char *buf; size_t len = PATH_MAX; int rc; rc = ecryptfs_readlink_lower(dentry, &buf, &len); if (rc) goto out; fsstack_copy_attr_atime(dentry->d_inode, ecryptfs_dentry_to_lower(dentry)->d_inode); buf[len] = '\0'; out: nd_set_link(nd, buf); return NULL; }
static int ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) { char *kbuf; size_t kbufsiz, copied; int rc; rc = ecryptfs_readlink_lower(dentry, &kbuf, &kbufsiz); if (rc) goto out; copied = min_t(size_t, bufsiz, kbufsiz); rc = copy_to_user(buf, kbuf, copied) ? -EFAULT : copied; kfree(kbuf); fsstack_copy_attr_atime(dentry->d_inode, ecryptfs_dentry_to_lower(dentry)->d_inode); out: return rc; }
static const char *ecryptfs_get_link(struct dentry *dentry, struct inode *inode, struct delayed_call *done) { size_t len; char *buf; if (!dentry) return ERR_PTR(-ECHILD); buf = ecryptfs_readlink_lower(dentry, &len); if (IS_ERR(buf)) return buf; fsstack_copy_attr_atime(d_inode(dentry), d_inode(ecryptfs_dentry_to_lower(dentry))); buf[len] = '\0'; set_delayed_call(done, kfree_link, buf); return buf; }