162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * linux/cluster/ssi/cfs/symlink.c 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or 562306a36Sopenharmony_ci * modify it under the terms of the GNU General Public License as 662306a36Sopenharmony_ci * published by the Free Software Foundation; either version 2 of 762306a36Sopenharmony_ci * the License, or (at your option) any later version. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful, 1062306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1162306a36Sopenharmony_ci * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE 1262306a36Sopenharmony_ci * or NON INFRINGEMENT. See the GNU General Public License for more 1362306a36Sopenharmony_ci * details. 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License 1662306a36Sopenharmony_ci * along with this program; if not, write to the Free Software 1762306a36Sopenharmony_ci * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * Questions/Comments/Bugfixes to ssic-linux-devel@lists.sourceforge.net 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Copyright (C) 1992 Rick Sladkey 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Optimization changes Copyright (C) 1994 Florian La Roche 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * Jun 7 1999, cache symlink lookups in the page cache. -DaveM 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * Portions Copyright (C) 2001 Compaq Computer Corporation 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * ocfs2 symlink handling code. 3062306a36Sopenharmony_ci * 3162306a36Sopenharmony_ci * Copyright (C) 2004, 2005 Oracle. 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#include <linux/fs.h> 3662306a36Sopenharmony_ci#include <linux/types.h> 3762306a36Sopenharmony_ci#include <linux/slab.h> 3862306a36Sopenharmony_ci#include <linux/pagemap.h> 3962306a36Sopenharmony_ci#include <linux/namei.h> 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#include <cluster/masklog.h> 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#include "ocfs2.h" 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#include "alloc.h" 4662306a36Sopenharmony_ci#include "file.h" 4762306a36Sopenharmony_ci#include "inode.h" 4862306a36Sopenharmony_ci#include "journal.h" 4962306a36Sopenharmony_ci#include "symlink.h" 5062306a36Sopenharmony_ci#include "xattr.h" 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#include "buffer_head_io.h" 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci struct page *page = &folio->page; 5862306a36Sopenharmony_ci struct inode *inode = page->mapping->host; 5962306a36Sopenharmony_ci struct buffer_head *bh = NULL; 6062306a36Sopenharmony_ci int status = ocfs2_read_inode_block(inode, &bh); 6162306a36Sopenharmony_ci struct ocfs2_dinode *fe; 6262306a36Sopenharmony_ci const char *link; 6362306a36Sopenharmony_ci void *kaddr; 6462306a36Sopenharmony_ci size_t len; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (status < 0) { 6762306a36Sopenharmony_ci mlog_errno(status); 6862306a36Sopenharmony_ci return status; 6962306a36Sopenharmony_ci } 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci fe = (struct ocfs2_dinode *) bh->b_data; 7262306a36Sopenharmony_ci link = (char *) fe->id2.i_symlink; 7362306a36Sopenharmony_ci /* will be less than a page size */ 7462306a36Sopenharmony_ci len = strnlen(link, ocfs2_fast_symlink_chars(inode->i_sb)); 7562306a36Sopenharmony_ci kaddr = kmap_atomic(page); 7662306a36Sopenharmony_ci memcpy(kaddr, link, len + 1); 7762306a36Sopenharmony_ci kunmap_atomic(kaddr); 7862306a36Sopenharmony_ci SetPageUptodate(page); 7962306a36Sopenharmony_ci unlock_page(page); 8062306a36Sopenharmony_ci brelse(bh); 8162306a36Sopenharmony_ci return 0; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciconst struct address_space_operations ocfs2_fast_symlink_aops = { 8562306a36Sopenharmony_ci .read_folio = ocfs2_fast_symlink_read_folio, 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciconst struct inode_operations ocfs2_symlink_inode_operations = { 8962306a36Sopenharmony_ci .get_link = page_get_link, 9062306a36Sopenharmony_ci .getattr = ocfs2_getattr, 9162306a36Sopenharmony_ci .setattr = ocfs2_setattr, 9262306a36Sopenharmony_ci .listxattr = ocfs2_listxattr, 9362306a36Sopenharmony_ci .fiemap = ocfs2_fiemap, 9462306a36Sopenharmony_ci}; 95