2 * linux/fs/ext2/symlink.c
4 * Copyright (C) 1992, 1993, 1994, 1995
5 * Remy Card (card@masi.ibp.fr)
6 * Laboratoire MASI - Institut Blaise Pascal
7 * Universite Pierre et Marie Curie (Paris VI)
11 * linux/fs/minix/symlink.c
13 * Copyright (C) 1991, 1992 Linus Torvalds
15 * ext2 symlink handling code
18 * Copyright (C) 1999 Seagate Technology Inc. (author: braam@stelias.com)
21 #include <asm/uaccess.h>
23 #include <linux/errno.h>
25 #include <linux/sched.h>
27 #include <linux/stat.h>
28 #include <linux/locks.h>
30 #include <linux/obd_support.h> /* for ENTRY and EXIT only */
31 #include <linux/obdfs.h>
33 static int obdfs_readlink (struct dentry *, char *, int);
34 static struct dentry *obdfs_follow_link(struct dentry *, struct dentry *, unsigned int);
37 * symlinks can't do much...
39 struct inode_operations obdfs_symlink_inode_operations = {
40 NULL, /* no file-operations */
50 obdfs_readlink, /* readlink */
51 obdfs_follow_link, /* follow_link */
56 NULL, /* permission */
60 static struct dentry * obdfs_follow_link(struct dentry * dentry,
64 struct inode *inode = dentry->d_inode;
65 struct page *page = NULL;
69 link = (char *) inode->u.ext2_i.i_data;
70 if (inode->i_blocks) {
72 page = obdfs_getpage(inode, 0, 0, 0);
73 PDEBUG(page, "follow_link");
79 link = (char *)page_address(page);
82 base = lookup_dentry(link, base, follow);
84 page_cache_release(page);
90 static int obdfs_readlink (struct dentry * dentry, char * buffer, int buflen)
92 struct inode *inode = dentry->d_inode;
93 struct page *page = NULL;
98 if (buflen > inode->i_sb->s_blocksize - 1)
99 buflen = inode->i_sb->s_blocksize - 1;
101 link = (char *) inode->u.ext2_i.i_data;
102 if (inode->i_blocks) {
104 page = obdfs_getpage(inode, 0, 0, 0);
105 PDEBUG(page, "readlink");
110 link = (char *)page_address(page);
114 while (i < buflen && link[i])
116 if (copy_to_user(buffer, link, i))
119 page_cache_release(page);
123 } /* obdfs_readlink */