Example #1
0
static int nfs_follow_link(struct inode *dir, struct inode *inode,
			   int flag, int mode, struct inode **res_inode)
{
	int error, *mem;
	unsigned int len;
	char *res, *res2;

	*res_inode = NULL;
	if (!dir) {
		dir = current->fs->root;
		dir->i_count++;
	}
	if (!inode) {
		iput(dir);
		return -ENOENT;
	}
	if (!S_ISLNK(inode->i_mode)) {
		iput(dir);
		*res_inode = inode;
		return 0;
	}
	if (current->link_count > 5) {
		iput(inode);
		iput(dir);
		return -ELOOP;
	}
	error = nfs_proc_readlink(NFS_SERVER(inode), NFS_FH(inode), &mem,
		&res, &len, NFS_MAXPATHLEN);
	if (error) {
		iput(inode);
		iput(dir);
		kfree(mem);
		return error;
	}
	while ((res2 = (char *) kmalloc(NFS_MAXPATHLEN + 1, GFP_NFS)) == NULL) {
		schedule();
	}
	memcpy(res2, res, len);
	res2[len] = '\0';
	kfree(mem);
	iput(inode);
	current->link_count++;
	error = open_namei(res2, flag, mode, res_inode, dir);
	current->link_count--;
	kfree_s(res2, NFS_MAXPATHLEN + 1);
	return error;
}
Example #2
0
int 
nfs_readlink(struct file *filp, char *buf, int bufsize) {
    struct nfs_fh *fhandle;

    int status;

    DPRINTF(CLU_LEVEL,("nfs_readlink:\n"));
    demand(filp, bogus filp);
    if (buf == (char *) 0) {errno = EFAULT; return -1;}
    
    fhandle = GETFHANDLE(filp);
    
    status = nfs_proc_readlink(fhandle,buf);
    
    if (status != 0) {
	errno = status;
	return -1;
    } else {
	return strlen(buf);
    }
}
Example #3
0
static int nfs_readlink(struct inode *inode, char *buffer, int buflen)
{
	int error, *mem;
	unsigned int len;
	char *res;

	if (!S_ISLNK(inode->i_mode)) {
		iput(inode);
		return -EINVAL;
	}
	if (buflen > NFS_MAXPATHLEN)
		buflen = NFS_MAXPATHLEN;
	error = nfs_proc_readlink(NFS_SERVER(inode), NFS_FH(inode), &mem,
		&res, &len, buflen);
	iput(inode);
	if (! error) {
		memcpy_tofs(buffer, res, len);
		put_fs_byte('\0', buffer + len);
		error = len;
	}
	kfree(mem);
	return error;
}