X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdfilter%2Ffilter_lvb.c;h=3ca1fad73296461d4b1f32c40ac837c463aa4161;hp=f664e70fde49361be35625bd7065fbca8bf69560;hb=7a7e17d4db28fac1ca4bc333d60cbeb8dbc530d6;hpb=a888a27ac14736d3df8e730a3909d026d6f40f49 diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c index f664e70..3ca1fad 100644 --- a/lustre/obdfilter/filter_lvb.c +++ b/lustre/obdfilter/filter_lvb.c @@ -41,7 +41,6 @@ static int filter_lvbo_init(struct ldlm_resource *res) int rc = 0; struct ost_lvb *lvb = NULL; struct obd_device *obd; - struct obdo *oa = NULL; struct dentry *dentry; ENTRY; @@ -66,34 +65,26 @@ static int filter_lvbo_init(struct ldlm_resource *res) obd = res->lr_namespace->ns_lvbp; LASSERT(obd != NULL); - oa = obdo_alloc(); - if (oa == NULL) - GOTO(out, rc = -ENOMEM); - - oa->o_id = res->lr_name.name[0]; - oa->o_gr = 0; - dentry = filter_oa2dentry(obd, oa); + dentry = filter_fid2dentry(obd, NULL, 0, res->lr_name.name[0]); if (IS_ERR(dentry)) GOTO(out, rc = PTR_ERR(dentry)); - /* Limit the valid bits in the return data to what we actually use */ - oa->o_valid = OBD_MD_FLID; - obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS); - f_dput(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); - CDEBUG(D_DLMTRACE, "res: "LPU64" initial lvb size: "LPU64", mtime: " - LPU64"\n", res->lr_name.name[0], lvb->lvb_size, lvb->lvb_mtime); + lvb->lvb_blocks = dentry->d_inode->i_blocks; + + 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: - if (oa) - obdo_free(oa); - if (rc && lvb != NULL) { - OBD_FREE(lvb, sizeof(*lvb)); - res->lr_lvb_data = NULL; - res->lr_lvb_len = 0; - } + /* Don't free lvb data on lookup error */ up(&res->lr_lvb_sem); return rc; } @@ -111,7 +102,6 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, int rc = 0; struct ost_lvb *lvb = res->lr_lvb_data; struct obd_device *obd; - struct obdo *oa = NULL; struct dentry *dentry; ENTRY; @@ -151,6 +141,12 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, lvb->lvb_mtime, new->lvb_mtime); lvb->lvb_mtime = new->lvb_mtime; } + if (new->lvb_blocks > lvb->lvb_blocks || !increase) { + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb blocks: " + LPU64" -> "LPU64"\n", res->lr_name.name[0], + lvb->lvb_blocks, new->lvb_blocks); + lvb->lvb_blocks = new->lvb_blocks; + } GOTO(out, rc = 0); } @@ -158,19 +154,12 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, obd = res->lr_namespace->ns_lvbp; LASSERT(obd); - oa = obdo_alloc(); - if (oa == NULL) - GOTO(out, rc = -ENOMEM); - - oa->o_id = res->lr_name.name[0]; - oa->o_gr = 0; - dentry = filter_oa2dentry(obd, oa); + dentry = filter_fid2dentry(obd, NULL, 0, res->lr_name.name[0]); if (IS_ERR(dentry)) GOTO(out, rc = PTR_ERR(dentry)); - /* Limit the valid bits in the return data to what we actually use */ - oa->o_valid = OBD_MD_FLID; - obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS); + 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: " @@ -178,23 +167,26 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, lvb->lvb_size, dentry->d_inode->i_size); lvb->lvb_size = dentry->d_inode->i_size; } - if (dentry->d_inode->i_mtime > lvb->lvb_mtime || !increase) { + + if (LTIME_S(dentry->d_inode->i_mtime) > lvb->lvb_mtime || !increase) { CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb mtime from disk: " LPU64" -> %lu\n", res->lr_name.name[0], lvb->lvb_mtime, LTIME_S(dentry->d_inode->i_mtime)); lvb->lvb_mtime = LTIME_S(dentry->d_inode->i_mtime); } + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb blocks from disk: " + LPU64" -> %lu\n", res->lr_name.name[0], + lvb->lvb_blocks, dentry->d_inode->i_blocks); + lvb->lvb_blocks = dentry->d_inode->i_blocks; + +out_dentry: f_dput(dentry); - out: - if (oa != NULL) - obdo_free(oa); +out: up(&res->lr_lvb_sem); return rc; } - - struct ldlm_valblock_ops filter_lvbo = { lvbo_init: filter_lvbo_init, lvbo_update: filter_lvbo_update