OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [fs/] [smbfs/] [symlink.c] - Blame information for rev 1779

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  symlink.c
3
 *
4
 *  Copyright (C) 2002 by John Newbigin
5
 *
6
 *  Please add a note about your changes to smbfs in the ChangeLog file.
7
 */
8
 
9
#include <linux/sched.h>
10
#include <linux/kernel.h>
11
#include <linux/errno.h>
12
#include <linux/fcntl.h>
13
#include <linux/stat.h>
14
#include <linux/mm.h>
15
#include <linux/slab.h>
16
#include <linux/pagemap.h>
17
#include <linux/smp_lock.h>
18
#include <linux/net.h>
19
 
20
#include <asm/uaccess.h>
21
#include <asm/system.h>
22
 
23
#include <linux/smbno.h>
24
#include <linux/smb_fs.h>
25
 
26
#include "smb_debug.h"
27
#include "proto.h"
28
 
29
int smb_read_link(struct dentry *dentry, char *buffer, int len)
30
{
31
        char *link;
32
        int result;
33
        DEBUG1("read link buffer len = %d\n", len);
34
 
35
        result = -ENOMEM;
36
        link = kmalloc(SMB_MAXNAMELEN + 1, GFP_KERNEL);
37
        if (!link)
38
                goto out;
39
 
40
        result = smb_proc_read_link(server_from_dentry(dentry), dentry, link,
41
                                    SMB_MAXNAMELEN);
42
        if (result < 0)
43
                goto out_free;
44
        result = vfs_readlink(dentry, buffer, len, link);
45
 
46
out_free:
47
        kfree(link);
48
out:
49
        return result;
50
}
51
 
52
int smb_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
53
{
54
        DEBUG1("create symlink %s -> %s/%s\n", oldname, DENTRY_PATH(dentry));
55
 
56
        smb_invalid_dir_cache(dir);
57
        return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname);
58
}
59
 
60
int smb_follow_link(struct dentry *dentry, struct nameidata *nd)
61
{
62
        char *link;
63
        int result;
64
 
65
        DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry));
66
 
67
        result = -ENOMEM;
68
        link = kmalloc(SMB_MAXNAMELEN + 1, GFP_KERNEL);
69
        if (!link)
70
                goto out;
71
 
72
        result = smb_proc_read_link(server_from_dentry(dentry), dentry, link,
73
                                    SMB_MAXNAMELEN);
74
        if (result < 0 || result >= SMB_MAXNAMELEN)
75
                goto out_free;
76
        link[result] = 0;
77
 
78
        result = vfs_follow_link(nd, link);
79
 
80
out_free:
81
        kfree(link);
82
out:
83
        return result;
84
}
85
 
86
struct inode_operations smb_link_inode_operations =
87
{
88
        .readlink       = smb_read_link,
89
        .follow_link    = smb_follow_link,
90
};

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.