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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ocfs2/] [symlink.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* -*- mode: c; c-basic-offset: 8; -*-
2
 * vim: noexpandtab sw=8 ts=8 sts=0:
3
 *
4
 *  linux/cluster/ssi/cfs/symlink.c
5
 *
6
 *      This program is free software; you can redistribute it and/or
7
 *      modify it under the terms of the GNU General Public License as
8
 *      published by the Free Software Foundation; either version 2 of
9
 *      the License, or (at your option) any later version.
10
 *
11
 *      This program is distributed in the hope that it will be useful,
12
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *      MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE
14
 *      or NON INFRINGEMENT.  See the GNU General Public License for more
15
 *      details.
16
 *
17
 *      You should have received a copy of the GNU General Public License
18
 *      along with this program; if not, write to the Free Software
19
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
 *
21
 *      Questions/Comments/Bugfixes to ssic-linux-devel@lists.sourceforge.net
22
 *
23
 *  Copyright (C) 1992  Rick Sladkey
24
 *
25
 *  Optimization changes Copyright (C) 1994 Florian La Roche
26
 *
27
 *  Jun 7 1999, cache symlink lookups in the page cache.  -DaveM
28
 *
29
 *  Portions Copyright (C) 2001 Compaq Computer Corporation
30
 *
31
 *  ocfs2 symlink handling code.
32
 *
33
 *  Copyright (C) 2004, 2005 Oracle.
34
 *
35
 */
36
 
37
#include <linux/fs.h>
38
#include <linux/types.h>
39
#include <linux/slab.h>
40
#include <linux/pagemap.h>
41
#include <linux/utsname.h>
42
 
43
#define MLOG_MASK_PREFIX ML_NAMEI
44
#include <cluster/masklog.h>
45
 
46
#include "ocfs2.h"
47
 
48
#include "alloc.h"
49
#include "file.h"
50
#include "inode.h"
51
#include "journal.h"
52
#include "symlink.h"
53
 
54
#include "buffer_head_io.h"
55
 
56
static char *ocfs2_page_getlink(struct dentry * dentry,
57
                                struct page **ppage);
58
static char *ocfs2_fast_symlink_getlink(struct inode *inode,
59
                                        struct buffer_head **bh);
60
 
61
/* get the link contents into pagecache */
62
static char *ocfs2_page_getlink(struct dentry * dentry,
63
                                struct page **ppage)
64
{
65
        struct page * page;
66
        struct address_space *mapping = dentry->d_inode->i_mapping;
67
        page = read_mapping_page(mapping, 0, NULL);
68
        if (IS_ERR(page))
69
                goto sync_fail;
70
        *ppage = page;
71
        return kmap(page);
72
 
73
sync_fail:
74
        return (char*)page;
75
}
76
 
77
static char *ocfs2_fast_symlink_getlink(struct inode *inode,
78
                                        struct buffer_head **bh)
79
{
80
        int status;
81
        char *link = NULL;
82
        struct ocfs2_dinode *fe;
83
 
84
        mlog_entry_void();
85
 
86
        status = ocfs2_read_block(OCFS2_SB(inode->i_sb),
87
                                  OCFS2_I(inode)->ip_blkno,
88
                                  bh,
89
                                  OCFS2_BH_CACHED,
90
                                  inode);
91
        if (status < 0) {
92
                mlog_errno(status);
93
                link = ERR_PTR(status);
94
                goto bail;
95
        }
96
 
97
        fe = (struct ocfs2_dinode *) (*bh)->b_data;
98
        link = (char *) fe->id2.i_symlink;
99
bail:
100
        mlog_exit(status);
101
 
102
        return link;
103
}
104
 
105
static int ocfs2_readlink(struct dentry *dentry,
106
                          char __user *buffer,
107
                          int buflen)
108
{
109
        int ret;
110
        char *link;
111
        struct buffer_head *bh = NULL;
112
        struct inode *inode = dentry->d_inode;
113
 
114
        mlog_entry_void();
115
 
116
        link = ocfs2_fast_symlink_getlink(inode, &bh);
117
        if (IS_ERR(link)) {
118
                ret = PTR_ERR(link);
119
                goto out;
120
        }
121
 
122
        /*
123
         * Without vfsmount we can't update atime now,
124
         * but we will update atime here ultimately.
125
         */
126
        ret = vfs_readlink(dentry, buffer, buflen, link);
127
 
128
        brelse(bh);
129
out:
130
        mlog_exit(ret);
131
        return ret;
132
}
133
 
134
static void *ocfs2_follow_link(struct dentry *dentry,
135
                               struct nameidata *nd)
136
{
137
        int status;
138
        char *link;
139
        struct inode *inode = dentry->d_inode;
140
        struct page *page = NULL;
141
        struct buffer_head *bh = NULL;
142
 
143
        if (ocfs2_inode_is_fast_symlink(inode))
144
                link = ocfs2_fast_symlink_getlink(inode, &bh);
145
        else
146
                link = ocfs2_page_getlink(dentry, &page);
147
        if (IS_ERR(link)) {
148
                status = PTR_ERR(link);
149
                mlog_errno(status);
150
                goto bail;
151
        }
152
 
153
        status = vfs_follow_link(nd, link);
154
 
155
bail:
156
        if (page) {
157
                kunmap(page);
158
                page_cache_release(page);
159
        }
160
        if (bh)
161
                brelse(bh);
162
 
163
        return ERR_PTR(status);
164
}
165
 
166
const struct inode_operations ocfs2_symlink_inode_operations = {
167
        .readlink       = page_readlink,
168
        .follow_link    = ocfs2_follow_link,
169
        .getattr        = ocfs2_getattr,
170
};
171
const struct inode_operations ocfs2_fast_symlink_inode_operations = {
172
        .readlink       = ocfs2_readlink,
173
        .follow_link    = ocfs2_follow_link,
174
        .getattr        = ocfs2_getattr,
175
};

powered by: WebSVN 2.1.0

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