#include <linux/module.h>
#include <linux/version.h>
-#include <portals/list.h>
+#include <libcfs/list.h>
#include <linux/obd_class.h>
#include <linux/lustre_dlm.h>
#include "filter_internal.h"
+/* Called with res->lr_lvb_sem held */
static int filter_lvbo_init(struct ldlm_resource *res)
{
int rc = 0;
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);
if (oa)
obdo_free(oa);
/* Don't free lvb data on lookup error */
- up(&res->lr_lvb_sem);
return rc;
}
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 */
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);