Linux Audio

Check our new training course

Loading...
  1/* -*- 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/namei.h>
 42
 43#include <cluster/masklog.h>
 44
 45#include "ocfs2.h"
 46
 47#include "alloc.h"
 48#include "file.h"
 49#include "inode.h"
 50#include "journal.h"
 51#include "symlink.h"
 52#include "xattr.h"
 53
 54#include "buffer_head_io.h"
 55
 56
 57static int ocfs2_fast_symlink_readpage(struct file *unused, struct page *page)
 58{
 59	struct inode *inode = page->mapping->host;
 60	struct buffer_head *bh;
 61	int status = ocfs2_read_inode_block(inode, &bh);
 62	struct ocfs2_dinode *fe;
 63	const char *link;
 64	void *kaddr;
 65	size_t len;
 66
 67	if (status < 0) {
 68		mlog_errno(status);
 69		return status;
 70	}
 71
 72	fe = (struct ocfs2_dinode *) bh->b_data;
 73	link = (char *) fe->id2.i_symlink;
 74	/* will be less than a page size */
 75	len = strnlen(link, ocfs2_fast_symlink_chars(inode->i_sb));
 76	kaddr = kmap_atomic(page);
 77	memcpy(kaddr, link, len + 1);
 78	kunmap_atomic(kaddr);
 79	SetPageUptodate(page);
 80	unlock_page(page);
 81	brelse(bh);
 82	return 0;
 83}
 84
 85const struct address_space_operations ocfs2_fast_symlink_aops = {
 86	.readpage		= ocfs2_fast_symlink_readpage,
 87};
 88
 89const struct inode_operations ocfs2_symlink_inode_operations = {
 90	.readlink	= generic_readlink,
 91	.follow_link	= page_follow_link_light,
 92	.put_link	= page_put_link,
 93	.getattr	= ocfs2_getattr,
 94	.setattr	= ocfs2_setattr,
 95	.setxattr	= generic_setxattr,
 96	.getxattr	= generic_getxattr,
 97	.listxattr	= ocfs2_listxattr,
 98	.removexattr	= generic_removexattr,
 99	.fiemap		= ocfs2_fiemap,
100};