1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/affs/symlink.c
5 * 1995 Hans-Joachim Widmaier - Modified for affs.
7 * Copyright (C) 1991, 1992 Linus Torvalds
9 * affs symlink handling code
14 static int affs_symlink_read_folio(struct file
*file
, struct folio
*folio
)
16 struct page
*page
= &folio
->page
;
17 struct buffer_head
*bh
;
18 struct inode
*inode
= page
->mapping
->host
;
19 char *link
= page_address(page
);
20 struct slink_front
*lf
;
25 pr_debug("get_link(ino=%lu)\n", inode
->i_ino
);
27 bh
= affs_bread(inode
->i_sb
, inode
->i_ino
);
32 lf
= (struct slink_front
*)bh
->b_data
;
35 if (strchr(lf
->symname
,':')) { /* Handle assign or volume name */
36 struct affs_sb_info
*sbi
= AFFS_SB(inode
->i_sb
);
38 spin_lock(&sbi
->symlink_lock
);
39 pf
= sbi
->s_prefix
? sbi
->s_prefix
: "/";
40 while (i
< 1023 && (c
= pf
[i
]))
42 spin_unlock(&sbi
->symlink_lock
);
43 while (i
< 1023 && lf
->symname
[j
] != ':')
44 link
[i
++] = lf
->symname
[j
++];
50 while (i
< 1023 && (c
= lf
->symname
[j
])) {
51 if (c
== '/' && lc
== '/' && i
< 1020) { /* parent dir */
61 SetPageUptodate(page
);
70 const struct address_space_operations affs_symlink_aops
= {
71 .read_folio
= affs_symlink_read_folio
,
74 const struct inode_operations affs_symlink_inode_operations
= {
75 .get_link
= page_get_link
,
76 .setattr
= affs_notify_change
,