2 * linux/fs/affs/symlink.c
4 * 1995 Hans-Joachim Widmaier - Modified for affs.
6 * Copyright (C) 1991, 1992 Linus Torvalds
8 * affs symlink handling code
11 #include <linux/errno.h>
13 #include <linux/stat.h>
14 #include <linux/affs_fs.h>
15 #include <linux/amigaffs.h>
16 #include <linux/pagemap.h>
18 static int affs_symlink_readpage(struct dentry
*dentry
, struct page
*page
)
20 struct buffer_head
*bh
;
21 struct inode
*inode
= dentry
->d_inode
;
22 char *link
= (char*)kmap(page
);
23 struct slink_front
*lf
;
30 pr_debug("AFFS: follow_link(ino=%lu)\n",inode
->i_ino
);
33 bh
= affs_bread(inode
->i_dev
,inode
->i_ino
,AFFS_I2BSIZE(inode
));
38 lf
= (struct slink_front
*)bh
->b_data
;
40 pf
= inode
->i_sb
->u
.affs_sb
.s_prefix
? inode
->i_sb
->u
.affs_sb
.s_prefix
: "/";
42 if (strchr(lf
->symname
,':')) { /* Handle assign or volume name */
43 while (i
< 1023 && (c
= pf
[i
]))
45 while (i
< 1023 && lf
->symname
[j
] != ':')
46 link
[i
++] = lf
->symname
[j
++];
52 while (i
< 1023 && (c
= lf
->symname
[j
])) {
53 if (c
== '/' && lc
== '/' && i
< 1020) { /* parent dir */
63 SetPageUptodate(page
);
74 struct inode_operations affs_symlink_inode_operations
= {
75 readlink
: page_readlink
,
76 follow_link
: page_follow_link
,
77 readpage
: affs_symlink_readpage
,