#include <linux/obd_support.h> /* for ENTRY and EXIT only */
#include <linux/lustre_lite.h>
-static int ll_fast_readlink(struct dentry *dentry, char *buffer, int buflen)
+static int ll_readlink(struct dentry *dentry, char *buffer, int buflen)
{
- char *s = ll_i2info(dentry->d_inode)->lli_inline;
- return vfs_readlink(dentry, buffer, buflen, s);
-}
+ struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
+ struct ptlrpc_request *request;
+ char *tmp;
+ int rc, size;
+ ENTRY;
-static int ll_fast_follow_link(struct dentry *dentry, struct nameidata *nd)
-{
- char *s = ll_i2info(dentry->d_inode)->lli_inline;
- return vfs_follow_link(nd, s);
+ rc = mdc_getattr(&sbi->ll_mdc_conn,
+ dentry->d_inode->i_ino, S_IFLNK,
+ OBD_MD_LINKNAME, dentry->d_inode->i_size, &request);
+ if (rc) {
+ CERROR("failure %d inode %ld\n", rc,
+ (long)dentry->d_inode->i_ino);
+ ptlrpc_free_req(request);
+ RETURN(rc);
+ }
+
+ tmp = lustre_msg_buf(request->rq_repmsg, 1);
+ size = MIN(request->rq_repmsg->buflens[1], buflen);
+ rc = copy_to_user(buffer, tmp, size);
+ if (rc == 0)
+ rc = size;
+
+ ptlrpc_free_req(request);
+ RETURN(rc);
}
extern int ll_setattr(struct dentry *de, struct iattr *attr);
struct inode_operations ll_fast_symlink_inode_operations = {
- readlink: ll_fast_readlink,
- follow_link: ll_fast_follow_link,
+ readlink: ll_readlink,
setattr: ll_setattr
};
-