diff options
Diffstat (limited to 'fs/gfs2/ops_dentry.c')
-rw-r--r-- | fs/gfs2/ops_dentry.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/fs/gfs2/ops_dentry.c b/fs/gfs2/ops_dentry.c index 7f6139288519..b54608f9df50 100644 --- a/fs/gfs2/ops_dentry.c +++ b/fs/gfs2/ops_dentry.c | |||
@@ -38,25 +38,26 @@ | |||
38 | static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) | 38 | static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) |
39 | { | 39 | { |
40 | struct dentry *parent = dget_parent(dentry); | 40 | struct dentry *parent = dget_parent(dentry); |
41 | struct gfs2_sbd *sdp = parent->d_inode->i_sb->s_fs_info; | ||
41 | struct gfs2_inode *dip = parent->d_inode->u.generic_ip; | 42 | struct gfs2_inode *dip = parent->d_inode->u.generic_ip; |
42 | struct inode *inode; | 43 | struct inode *inode = dentry->d_inode; |
43 | struct gfs2_holder d_gh; | 44 | struct gfs2_holder d_gh; |
44 | struct gfs2_inode *ip; | 45 | struct gfs2_inode *ip; |
45 | struct gfs2_inum inum; | 46 | struct gfs2_inum inum; |
46 | unsigned int type; | 47 | unsigned int type; |
47 | int error; | 48 | int error; |
48 | 49 | ||
49 | lock_kernel(); | ||
50 | |||
51 | inode = dentry->d_inode; | ||
52 | if (inode && is_bad_inode(inode)) | 50 | if (inode && is_bad_inode(inode)) |
53 | goto invalid; | 51 | goto invalid; |
54 | 52 | ||
53 | if (sdp->sd_args.ar_localcaching) | ||
54 | goto valid; | ||
55 | |||
55 | error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh); | 56 | error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh); |
56 | if (error) | 57 | if (error) |
57 | goto fail; | 58 | goto fail; |
58 | 59 | ||
59 | error = gfs2_dir_search(dip, &dentry->d_name, &inum, &type); | 60 | error = gfs2_dir_search(parent->d_inode, &dentry->d_name, &inum, &type); |
60 | switch (error) { | 61 | switch (error) { |
61 | case 0: | 62 | case 0: |
62 | if (!inode) | 63 | if (!inode) |
@@ -84,7 +85,6 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) | |||
84 | gfs2_glock_dq_uninit(&d_gh); | 85 | gfs2_glock_dq_uninit(&d_gh); |
85 | 86 | ||
86 | valid: | 87 | valid: |
87 | unlock_kernel(); | ||
88 | dput(parent); | 88 | dput(parent); |
89 | return 1; | 89 | return 1; |
90 | 90 | ||
@@ -99,7 +99,6 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) | |||
99 | } | 99 | } |
100 | d_drop(dentry); | 100 | d_drop(dentry); |
101 | 101 | ||
102 | unlock_kernel(); | ||
103 | dput(parent); | 102 | dput(parent); |
104 | return 0; | 103 | return 0; |
105 | 104 | ||
@@ -107,12 +106,18 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) | |||
107 | gfs2_glock_dq_uninit(&d_gh); | 106 | gfs2_glock_dq_uninit(&d_gh); |
108 | 107 | ||
109 | fail: | 108 | fail: |
110 | unlock_kernel(); | ||
111 | dput(parent); | 109 | dput(parent); |
112 | return 0; | 110 | return 0; |
113 | } | 111 | } |
114 | 112 | ||
113 | static int gfs2_dhash(struct dentry *dentry, struct qstr *str) | ||
114 | { | ||
115 | str->hash = gfs2_disk_hash(str->name, str->len); | ||
116 | return 0; | ||
117 | } | ||
118 | |||
115 | struct dentry_operations gfs2_dops = { | 119 | struct dentry_operations gfs2_dops = { |
116 | .d_revalidate = gfs2_drevalidate, | 120 | .d_revalidate = gfs2_drevalidate, |
121 | .d_hash = gfs2_dhash, | ||
117 | }; | 122 | }; |
118 | 123 | ||