2 * linux/ufs/ufs/symlink.c
5 * Daniel Pirkl <daniel.pirkl@emai.cz>
6 * Charles University, Faculty of Mathematics and Physics
10 * linux/fs/ext2/symlink.c
12 * Copyright (C) 1992, 1993, 1994, 1995
13 * Remy Card (card@masi.ibp.fr)
14 * Laboratoire MASI - Institut Blaise Pascal
15 * Universite Pierre et Marie Curie (Paris VI)
19 * linux/fs/minix/symlink.c
21 * Copyright (C) 1991, 1992 Linus Torvalds
23 * ext2 symlink handling code
26 #include <asm/uaccess.h>
28 #include <linux/errno.h>
30 #include <linux/ext2_fs.h>
31 #include <linux/sched.h>
33 #include <linux/stat.h>
36 #undef UFS_SYMLINK_DEBUG
38 #ifdef UFS_SYMLINK_DEBUG
39 #define UFSD(x) printk("(%s, %d), %s:", __FILE__, __LINE__, __FUNCTION__); printk x;
45 static struct dentry
* ufs_follow_link(struct dentry
* dentry
,
49 struct buffer_head
* bh
;
55 inode
= dentry
->d_inode
;
58 if (inode
->i_blocks
) {
59 if (!(bh
= ufs_bread (inode
, 0, 0, &error
))) {
67 link
= (char *) inode
->u
.ufs_i
.i_u1
.i_symlink
;
70 base
= lookup_dentry(link
, base
, 1);
77 static int ufs_readlink (struct dentry
* dentry
, char * buffer
, int buflen
)
79 struct super_block
* sb
;
81 struct buffer_head
* bh
;
87 inode
= dentry
->d_inode
;
90 if (buflen
> sb
->s_blocksize
- 1)
91 buflen
= sb
->s_blocksize
- 1;
93 if (inode
->i_blocks
) {
95 bh
= ufs_bread (inode
, 0, 0, &err
);
97 if(err
< 0) /* indicate type of error */
105 link
= (char *) inode
->u
.ufs_i
.i_u1
.i_symlink
;
108 while (i
< buflen
&& link
[i
])
110 if (copy_to_user(buffer
, link
, i
))
119 struct inode_operations ufs_symlink_inode_operations
= {
120 NULL
, /* no file-operations */
130 ufs_readlink
, /* readlink */
131 ufs_follow_link
, /* follow_link */
133 NULL
, /* writepage */
136 NULL
, /* permission */