X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdfilter%2Ffilter_lvb.c;h=c54b1d7d54a9718785c1aa53863a6b47b4fb2ebf;hb=f24218109154516e02e9a60df1e5a6f078c5e63f;hp=854b5f7cd85c272ce8acd3751874b4750acf7728;hpb=a9315be6f8301767852d8f17be2759851db1b6d5;p=fs%2Flustre-release.git diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c index 854b5f7..c54b1d7 100644 --- a/lustre/obdfilter/filter_lvb.c +++ b/lustre/obdfilter/filter_lvb.c @@ -30,29 +30,30 @@ #include #include -#include +#include #include #include #include "filter_internal.h" +/* Called with res->lr_lvb_sem held */ static int filter_lvbo_init(struct ldlm_resource *res) { int rc = 0; + struct obdo *oa = NULL; struct ost_lvb *lvb = NULL; struct obd_device *obd; - struct obdo *oa = NULL; struct dentry *dentry; ENTRY; LASSERT(res); + LASSERT(down_trylock(&res->lr_lvb_sem) != 0); /* we only want lvb's for object resources */ /* check for internal locks: these have name[1] != 0 */ if (res->lr_name.name[1]) RETURN(0); - down(&res->lr_lvb_sem); if (res->lr_lvb_data) GOTO(out, rc = 0); @@ -71,30 +72,31 @@ static int filter_lvbo_init(struct ldlm_resource *res) GOTO(out, rc = -ENOMEM); oa->o_id = res->lr_name.name[0]; - oa->o_gr = 0; + oa->o_gr = res->lr_name.name[2]; + oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; + dentry = filter_oa2dentry(obd, oa); 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; + oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS); f_dput(dentry); 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: if (oa) obdo_free(oa); - if (rc && lvb != NULL) { - OBD_FREE(lvb, sizeof(*lvb)); - res->lr_lvb_data = NULL; - res->lr_lvb_len = 0; - } - up(&res->lr_lvb_sem); + /* Don't free lvb data on lookup error */ return rc; } @@ -109,9 +111,9 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, int buf_idx, int increase) { int rc = 0; + struct obdo *oa = NULL; struct ost_lvb *lvb = res->lr_lvb_data; struct obd_device *obd; - struct obdo *oa = NULL; struct dentry *dentry; ENTRY; @@ -151,7 +153,18 @@ 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; } - GOTO(out, rc = 0); + if (new->lvb_atime > lvb->lvb_atime || !increase) { + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb atime: " + LPU64" -> "LPU64"\n", res->lr_name.name[0], + lvb->lvb_atime, new->lvb_atime); + lvb->lvb_atime = new->lvb_atime; + } + if (new->lvb_ctime > lvb->lvb_ctime || !increase) { + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb ctime: " + LPU64" -> "LPU64"\n", res->lr_name.name[0], + lvb->lvb_ctime, new->lvb_ctime); + lvb->lvb_ctime = new->lvb_ctime; + } } /* Update the LVB from the disk inode */ @@ -163,13 +176,14 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, GOTO(out, rc = -ENOMEM); oa->o_id = res->lr_name.name[0]; - oa->o_gr = 0; + oa->o_gr = res->lr_name.name[2]; + oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; dentry = filter_oa2dentry(obd, oa); 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; + oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS); if (dentry->d_inode->i_size > lvb->lvb_size || !increase) { @@ -178,23 +192,38 @@ 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 (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); } - f_dput(dentry); + if (LTIME_S(dentry->d_inode->i_atime) > lvb->lvb_atime || !increase) { + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb atime from disk: " + LPU64" -> %lu\n", res->lr_name.name[0], + lvb->lvb_atime, LTIME_S(dentry->d_inode->i_atime)); + lvb->lvb_atime = LTIME_S(dentry->d_inode->i_atime); + } + if (LTIME_S(dentry->d_inode->i_ctime) > lvb->lvb_ctime || !increase) { + CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb ctime from disk: " + LPU64" -> %lu\n", res->lr_name.name[0], + lvb->lvb_ctime, LTIME_S(dentry->d_inode->i_ctime)); + lvb->lvb_ctime = LTIME_S(dentry->d_inode->i_ctime); + } + 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: - if (oa != NULL) + f_dput(dentry); +out: + if (oa) obdo_free(oa); up(&res->lr_lvb_sem); return rc; } - - struct ldlm_valblock_ops filter_lvbo = { lvbo_init: filter_lvbo_init, lvbo_update: filter_lvbo_update