@ -48,16 +48,26 @@ static const char *nfs_get_link(struct dentry *dentry,
struct page * page ;
void * err ;
if ( ! dentry )
return ERR_PTR ( - ECHILD ) ;
err = ERR_PTR ( nfs_revalidate_mapping ( inode , inode - > i_mapping ) ) ;
if ( err )
return err ;
page = read_cache_page ( & inode - > i_data , 0 ,
( filler_t * ) nfs_symlink_filler , inode ) ;
if ( IS_ERR ( page ) )
return ERR_CAST ( page ) ;
if ( ! dentry ) {
err = ERR_PTR ( nfs_revalidate_mapping_rcu ( inode ) ) ;
if ( err )
return err ;
page = find_get_page ( inode - > i_mapping , 0 ) ;
if ( ! page )
return ERR_PTR ( - ECHILD ) ;
if ( ! PageUptodate ( page ) ) {
put_page ( page ) ;
return ERR_PTR ( - ECHILD ) ;
}
} else {
err = ERR_PTR ( nfs_revalidate_mapping ( inode , inode - > i_mapping ) ) ;
if ( err )
return err ;
page = read_cache_page ( & inode - > i_data , 0 ,
( filler_t * ) nfs_symlink_filler , inode ) ;
if ( IS_ERR ( page ) )
return ERR_CAST ( page ) ;
}
* cookie = page ;
return page_address ( page ) ;
}