11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (c) 2000-2001 Christoph Hellwig. 31da177e4SLinus Torvalds * All rights reserved. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Redistribution and use in source and binary forms, with or without 61da177e4SLinus Torvalds * modification, are permitted provided that the following conditions 71da177e4SLinus Torvalds * are met: 81da177e4SLinus Torvalds * 1. Redistributions of source code must retain the above copyright 91da177e4SLinus Torvalds * notice, this list of conditions, and the following disclaimer, 101da177e4SLinus Torvalds * without modification. 111da177e4SLinus Torvalds * 2. The name of the author may not be used to endorse or promote products 121da177e4SLinus Torvalds * derived from this software without specific prior written permission. 131da177e4SLinus Torvalds * 141da177e4SLinus Torvalds * Alternatively, this software may be distributed under the terms of the 151da177e4SLinus Torvalds * GNU General Public License ("GPL"). 161da177e4SLinus Torvalds * 171da177e4SLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 181da177e4SLinus Torvalds * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191da177e4SLinus Torvalds * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201da177e4SLinus Torvalds * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 211da177e4SLinus Torvalds * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221da177e4SLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231da177e4SLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241da177e4SLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251da177e4SLinus Torvalds * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261da177e4SLinus Torvalds * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271da177e4SLinus Torvalds * SUCH DAMAGE. 281da177e4SLinus Torvalds */ 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds /* 311da177e4SLinus Torvalds * Veritas filesystem driver - support for 'immed' inodes. 321da177e4SLinus Torvalds */ 331da177e4SLinus Torvalds #include <linux/fs.h> 341da177e4SLinus Torvalds #include <linux/pagemap.h> 351da177e4SLinus Torvalds #include <linux/namei.h> 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds #include "vxfs.h" 38*8b1919a1SAdrian Bunk #include "vxfs_extern.h" 391da177e4SLinus Torvalds #include "vxfs_inode.h" 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds 42008b150aSAl Viro static void * vxfs_immed_follow_link(struct dentry *, struct nameidata *); 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds static int vxfs_immed_readpage(struct file *, struct page *); 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds /* 471da177e4SLinus Torvalds * Inode operations for immed symlinks. 481da177e4SLinus Torvalds * 491da177e4SLinus Torvalds * Unliked all other operations we do not go through the pagecache, 501da177e4SLinus Torvalds * but do all work directly on the inode. 511da177e4SLinus Torvalds */ 52754661f1SArjan van de Ven const struct inode_operations vxfs_immed_symlink_iops = { 531da177e4SLinus Torvalds .readlink = generic_readlink, 541da177e4SLinus Torvalds .follow_link = vxfs_immed_follow_link, 551da177e4SLinus Torvalds }; 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds /* 58c78bad11SJoe Perches * Address space operations for immed files and directories. 591da177e4SLinus Torvalds */ 60f5e54d6eSChristoph Hellwig const struct address_space_operations vxfs_immed_aops = { 611da177e4SLinus Torvalds .readpage = vxfs_immed_readpage, 621da177e4SLinus Torvalds }; 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds /** 651da177e4SLinus Torvalds * vxfs_immed_follow_link - follow immed symlink 661da177e4SLinus Torvalds * @dp: dentry for the link 671da177e4SLinus Torvalds * @np: pathname lookup data for the current path walk 681da177e4SLinus Torvalds * 691da177e4SLinus Torvalds * Description: 701da177e4SLinus Torvalds * vxfs_immed_follow_link restarts the pathname lookup with 711da177e4SLinus Torvalds * the data obtained from @dp. 721da177e4SLinus Torvalds * 731da177e4SLinus Torvalds * Returns: 741da177e4SLinus Torvalds * Zero on success, else a negative error code. 751da177e4SLinus Torvalds */ 76a5ea169cSAlexey Dobriyan static void * 771da177e4SLinus Torvalds vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np) 781da177e4SLinus Torvalds { 791da177e4SLinus Torvalds struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode); 801da177e4SLinus Torvalds nd_set_link(np, vip->vii_immed.vi_immed); 81008b150aSAl Viro return NULL; 821da177e4SLinus Torvalds } 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds /** 851da177e4SLinus Torvalds * vxfs_immed_readpage - read part of an immed inode into pagecache 861da177e4SLinus Torvalds * @file: file context (unused) 871da177e4SLinus Torvalds * @page: page frame to fill in. 881da177e4SLinus Torvalds * 891da177e4SLinus Torvalds * Description: 901da177e4SLinus Torvalds * vxfs_immed_readpage reads a part of the immed area of the 911da177e4SLinus Torvalds * file that hosts @pp into the pagecache. 921da177e4SLinus Torvalds * 931da177e4SLinus Torvalds * Returns: 941da177e4SLinus Torvalds * Zero on success, else a negative error code. 951da177e4SLinus Torvalds * 961da177e4SLinus Torvalds * Locking status: 971da177e4SLinus Torvalds * @page is locked and will be unlocked. 981da177e4SLinus Torvalds */ 991da177e4SLinus Torvalds static int 1001da177e4SLinus Torvalds vxfs_immed_readpage(struct file *fp, struct page *pp) 1011da177e4SLinus Torvalds { 1021da177e4SLinus Torvalds struct vxfs_inode_info *vip = VXFS_INO(pp->mapping->host); 10354b21a79SAndrew Morton u_int64_t offset = (u_int64_t)pp->index << PAGE_CACHE_SHIFT; 1041da177e4SLinus Torvalds caddr_t kaddr; 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds kaddr = kmap(pp); 1071da177e4SLinus Torvalds memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_CACHE_SIZE); 1081da177e4SLinus Torvalds kunmap(pp); 1091da177e4SLinus Torvalds 1101da177e4SLinus Torvalds flush_dcache_page(pp); 1111da177e4SLinus Torvalds SetPageUptodate(pp); 1121da177e4SLinus Torvalds unlock_page(pp); 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds return 0; 1151da177e4SLinus Torvalds } 116