From 58b9ac3a1d3d4c39761b354fbc00fac19c5fea33 Mon Sep 17 00:00:00 2001 From: adilger Date: Wed, 14 Apr 2004 16:33:17 +0000 Subject: [PATCH] Don't dereference negative dentry. b=3106 --- lustre/obdfilter/filter_lvb.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c index 7d9d1c4..aa08aa5 100644 --- a/lustre/obdfilter/filter_lvb.c +++ b/lustre/obdfilter/filter_lvb.c @@ -69,17 +69,20 @@ static int filter_lvbo_init(struct ldlm_resource *res) if (IS_ERR(dentry)) GOTO(out, rc = PTR_ERR(dentry)); + if (dentry->d_inode == NULL) + GOTO(out_dentry, rc = -ENOENT); lvb->lvb_size = dentry->d_inode->i_size; lvb->lvb_mtime = LTIME_S(dentry->d_inode->i_mtime); lvb->lvb_blocks = dentry->d_inode->i_blocks; - f_dput(dentry); CDEBUG(D_DLMTRACE, "res: "LPU64" initial lvb size: "LPU64", " "mtime: "LPU64", blocks: "LPU64"\n", res->lr_name.name[0], lvb->lvb_size, lvb->lvb_mtime, lvb->lvb_blocks); + out_dentry: + f_dput(dentry); out: /* Don't free lvb data on lookup error */ up(&res->lr_lvb_sem); @@ -155,6 +158,9 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, if (IS_ERR(dentry)) GOTO(out, rc = PTR_ERR(dentry)); + if (dentry->d_inode == NULL) + GOTO(out_dentry, rc = -ENOENT); + if (dentry->d_inode->i_size > lvb->lvb_size || !increase) { CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb size from disk: " LPU64" -> %llu\n", res->lr_name.name[0], @@ -173,8 +179,8 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, lvb->lvb_blocks, dentry->d_inode->i_blocks); lvb->lvb_blocks = dentry->d_inode->i_blocks; + out_dentry: f_dput(dentry); - out: up(&res->lr_lvb_sem); return rc; -- 1.8.3.1