1 /* 2 * linux/cluster/ssi/cfs/symlink.c 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation; either version 2 of 7 * the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE 12 * or NON INFRINGEMENT. See the GNU General Public License for more 13 * details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 * 19 * Questions/Comments/Bugfixes to ssic-linux-devel@lists.sourceforge.net 20 * 21 * Copyright (C) 1992 Rick Sladkey 22 * 23 * Optimization changes Copyright (C) 1994 Florian La Roche 24 * 25 * Jun 7 1999, cache symlink lookups in the page cache. -DaveM 26 * 27 * Portions Copyright (C) 2001 Compaq Computer Corporation 28 * 29 * ocfs2 symlink handling code. 30 * 31 * Copyright (C) 2004, 2005 Oracle. 32 * 33 */ 34 35 #include <linux/fs.h> 36 #include <linux/types.h> 37 #include <linux/slab.h> 38 #include <linux/pagemap.h> 39 #include <linux/namei.h> 40 41 #include <cluster/masklog.h> 42 43 #include "ocfs2.h" 44 45 #include "alloc.h" 46 #include "file.h" 47 #include "inode.h" 48 #include "journal.h" 49 #include "symlink.h" 50 #include "xattr.h" 51 52 #include "buffer_head_io.h" 53 54 55 static int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio) 56 { 57 struct page *page = &folio->page; 58 struct inode *inode = page->mapping->host; 59 struct buffer_head *bh = NULL; 60 int status = ocfs2_read_inode_block(inode, &bh); 61 struct ocfs2_dinode *fe; 62 const char *link; 63 void *kaddr; 64 size_t len; 65 66 if (status < 0) { 67 mlog_errno(status); 68 return status; 69 } 70 71 fe = (struct ocfs2_dinode *) bh->b_data; 72 link = (char *) fe->id2.i_symlink; 73 /* will be less than a page size */ 74 len = strnlen(link, ocfs2_fast_symlink_chars(inode->i_sb)); 75 kaddr = kmap_atomic(page); 76 memcpy(kaddr, link, len + 1); 77 kunmap_atomic(kaddr); 78 SetPageUptodate(page); 79 unlock_page(page); 80 brelse(bh); 81 return 0; 82 } 83 84 const struct address_space_operations ocfs2_fast_symlink_aops = { 85 .read_folio = ocfs2_fast_symlink_read_folio, 86 }; 87 88 const struct inode_operations ocfs2_symlink_inode_operations = { 89 .get_link = page_get_link, 90 .getattr = ocfs2_getattr, 91 .setattr = ocfs2_setattr, 92 .listxattr = ocfs2_listxattr, 93 .fiemap = ocfs2_fiemap, 94 }; 95