X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fobdfilter%2Ffilter_lvb.c;h=c54b1d7d54a9718785c1aa53863a6b47b4fb2ebf;hb=f24218109154516e02e9a60df1e5a6f078c5e63f;hp=599eeab66a8aaf747835892f69595fbc9637bd57;hpb=2dc9c16e770415d56839e1996015fec5fab93f29;p=fs%2Flustre-release.git diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c index 599eeab..c54b1d7 100644 --- a/lustre/obdfilter/filter_lvb.c +++ b/lustre/obdfilter/filter_lvb.c @@ -30,12 +30,13 @@ #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; @@ -46,13 +47,13 @@ static int filter_lvbo_init(struct ldlm_resource *res) 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); @@ -96,7 +97,6 @@ static int filter_lvbo_init(struct ldlm_resource *res) if (oa) obdo_free(oa); /* Don't free lvb data on lookup error */ - up(&res->lr_lvb_sem); return rc; } @@ -153,13 +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; } - if (new->lvb_blocks > lvb->lvb_blocks || !increase) { - CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb blocks: " + 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_blocks, new->lvb_blocks); - lvb->lvb_blocks = new->lvb_blocks; + 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; } - GOTO(out, rc = 0); } /* Update the LVB from the disk inode */ @@ -194,6 +199,18 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m, lvb->lvb_mtime, LTIME_S(dentry->d_inode->i_mtime)); lvb->lvb_mtime = LTIME_S(dentry->d_inode->i_mtime); } + 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);