Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at c9a28fa7b9ac19b676deefa0a171ce7df8755c08 115 lines 2.5 kB view raw
1/* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ 9 10#include <linux/slab.h> 11#include <linux/spinlock.h> 12#include <linux/completion.h> 13#include <linux/buffer_head.h> 14#include <linux/gfs2_ondisk.h> 15#include <linux/crc32.h> 16#include <linux/lm_interface.h> 17 18#include "gfs2.h" 19#include "incore.h" 20#include "dir.h" 21#include "glock.h" 22#include "ops_dentry.h" 23#include "util.h" 24#include "inode.h" 25 26/** 27 * gfs2_drevalidate - Check directory lookup consistency 28 * @dentry: the mapping to check 29 * @nd: 30 * 31 * Check to make sure the lookup necessary to arrive at this inode from its 32 * parent is still good. 33 * 34 * Returns: 1 if the dentry is ok, 0 if it isn't 35 */ 36 37static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) 38{ 39 struct dentry *parent = dget_parent(dentry); 40 struct gfs2_sbd *sdp = GFS2_SB(parent->d_inode); 41 struct gfs2_inode *dip = GFS2_I(parent->d_inode); 42 struct inode *inode = dentry->d_inode; 43 struct gfs2_holder d_gh; 44 struct gfs2_inode *ip = NULL; 45 int error; 46 int had_lock=0; 47 48 if (inode) { 49 if (is_bad_inode(inode)) 50 goto invalid; 51 ip = GFS2_I(inode); 52 } 53 54 if (sdp->sd_args.ar_localcaching) 55 goto valid; 56 57 had_lock = gfs2_glock_is_locked_by_me(dip->i_gl); 58 if (!had_lock) { 59 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh); 60 if (error) 61 goto fail; 62 } 63 64 error = gfs2_dir_check(parent->d_inode, &dentry->d_name, ip); 65 switch (error) { 66 case 0: 67 if (!inode) 68 goto invalid_gunlock; 69 break; 70 case -ENOENT: 71 if (!inode) 72 goto valid_gunlock; 73 goto invalid_gunlock; 74 default: 75 goto fail_gunlock; 76 } 77 78valid_gunlock: 79 if (!had_lock) 80 gfs2_glock_dq_uninit(&d_gh); 81valid: 82 dput(parent); 83 return 1; 84 85invalid_gunlock: 86 if (!had_lock) 87 gfs2_glock_dq_uninit(&d_gh); 88invalid: 89 if (inode && S_ISDIR(inode->i_mode)) { 90 if (have_submounts(dentry)) 91 goto valid; 92 shrink_dcache_parent(dentry); 93 } 94 d_drop(dentry); 95 dput(parent); 96 return 0; 97 98fail_gunlock: 99 gfs2_glock_dq_uninit(&d_gh); 100fail: 101 dput(parent); 102 return 0; 103} 104 105static int gfs2_dhash(struct dentry *dentry, struct qstr *str) 106{ 107 str->hash = gfs2_disk_hash(str->name, str->len); 108 return 0; 109} 110 111struct dentry_operations gfs2_dops = { 112 .d_revalidate = gfs2_drevalidate, 113 .d_hash = gfs2_dhash, 114}; 115