"orangefs_getattr: called on %s\n",
dentry->d_name.name);
- /*
- * Similar to the above comment, a getattr also expects that all
- * fields/attributes of the inode would be refreshed. So again, we
- * dont have too much of a choice but refresh all the attributes.
- */
ret = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, 0);
if (ret == 0) {
generic_fillattr(inode, kstat);
+
/* override block size reported to stat */
orangefs_inode = ORANGEFS_I(inode);
kstat->blksize = orangefs_inode->blksize;
+
+ inode->i_link = ORANGEFS_I(dentry->d_inode)->link_target;
} else {
/* assume an I/O error and flag inode as bad */
gossip_debug(GOSSIP_INODE_DEBUG,
#include "orangefs-kernel.h"
#include "orangefs-bufmap.h"
-static const char *orangefs_follow_link(struct dentry *dentry, void **cookie)
-{
- char *target = ORANGEFS_I(dentry->d_inode)->link_target;
-
- gossip_debug(GOSSIP_INODE_DEBUG,
- "%s: called on %s (target is %p)\n",
- __func__, (char *)dentry->d_name.name, target);
-
- *cookie = target;
-
- return target;
-}
-
struct inode_operations orangefs_symlink_inode_operations = {
.readlink = generic_readlink,
- .follow_link = orangefs_follow_link,
+ .get_link = simple_get_link,
.setattr = orangefs_setattr,
.getattr = orangefs_getattr,
.listxattr = orangefs_listxattr,