1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#include <linux/fs.h>
38#include <linux/types.h>
39#include <linux/slab.h>
40#include <linux/pagemap.h>
41#include <linux/namei.h>
42
43#include <cluster/masklog.h>
44
45#include "ocfs2.h"
46
47#include "alloc.h"
48#include "file.h"
49#include "inode.h"
50#include "journal.h"
51#include "symlink.h"
52#include "xattr.h"
53
54#include "buffer_head_io.h"
55
56
57static int ocfs2_fast_symlink_readpage(struct file *unused, struct page *page)
58{
59 struct inode *inode = page->mapping->host;
60 struct buffer_head *bh = NULL;
61 int status = ocfs2_read_inode_block(inode, &bh);
62 struct ocfs2_dinode *fe;
63 const char *link;
64 void *kaddr;
65 size_t len;
66
67 if (status < 0) {
68 mlog_errno(status);
69 return status;
70 }
71
72 fe = (struct ocfs2_dinode *) bh->b_data;
73 link = (char *) fe->id2.i_symlink;
74
75 len = strnlen(link, ocfs2_fast_symlink_chars(inode->i_sb));
76 kaddr = kmap_atomic(page);
77 memcpy(kaddr, link, len + 1);
78 kunmap_atomic(kaddr);
79 SetPageUptodate(page);
80 unlock_page(page);
81 brelse(bh);
82 return 0;
83}
84
85const struct address_space_operations ocfs2_fast_symlink_aops = {
86 .readpage = ocfs2_fast_symlink_readpage,
87};
88
89const struct inode_operations ocfs2_symlink_inode_operations = {
90 .get_link = page_get_link,
91 .getattr = ocfs2_getattr,
92 .setattr = ocfs2_setattr,
93 .listxattr = ocfs2_listxattr,
94 .fiemap = ocfs2_fiemap,
95};
96