Whamcloud - gitweb
Landing the mds_lock_devel branch on the trunk. Notables:
[fs/lustre-release.git] / lustre / llite / symlink.c
index 5f54913..1b307d6 100644 (file)
 #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
 };
-