#define LDLM_DEFAULT_LRU_SIZE (100 * num_online_cpus())
#define LDLM_DEFAULT_MAX_ALIVE (cfs_time_seconds(36000))
+#define LDLM_CTIME_AGE_LIMIT (10)
typedef enum {
ELDLM_OK = 0,
unsigned int ns_max_unused;
unsigned int ns_max_age;
+ unsigned int ns_ctime_age_limit; /* seconds */
/* Lower limit to number of pages in lock to keep it in cache */
unsigned int ns_shrink_thumb;
lock_vars[0].read_fptr = lprocfs_rd_uint;
lock_vars[0].write_fptr = lprocfs_wr_uint;
lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+ } else {
+ snprintf(lock_name, MAX_STRING_SIZE, "%s/ctime_age_limit",
+ ns->ns_name);
+ lock_vars[0].data = &ns->ns_ctime_age_limit;
+ lock_vars[0].read_fptr = lprocfs_rd_uint;
+ lock_vars[0].write_fptr = lprocfs_wr_uint;
+ lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
}
}
#undef MAX_STRING_SIZE
ns->ns_nr_unused = 0;
ns->ns_max_unused = LDLM_DEFAULT_LRU_SIZE;
ns->ns_max_age = LDLM_DEFAULT_MAX_ALIVE;
+ ns->ns_ctime_age_limit = LDLM_CTIME_AGE_LIMIT;
spin_lock_init(&ns->ns_unused_lock);
ns->ns_orig_connect_flags = 0;
ns->ns_connect_flags = 0;
}
ll_lookup_finish_locks(&oit, dentry);
- } else if (!ll_have_md_lock(dentry->d_inode, MDS_INODELOCK_UPDATE)) {
+ } else if (!ll_have_md_lock(dentry->d_inode, MDS_INODELOCK_UPDATE |
+ MDS_INODELOCK_LOOKUP)) {
struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
obd_valid valid = OBD_MD_FLGETATTR;
struct obd_capa *oc;
LDLM_LOCK_PUT(lock);
rc = 0;
} else {
+ struct md_attr *ma = &info->mti_attr;
relock:
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
&child->mot_obj.mo_lu,
"Object doesn't exist!\n");
}
+
+ ma->ma_valid = 0;
+ ma->ma_need = MA_INODE;
+ rc = mo_attr_get(info->mti_env, next, ma);
+ if (unlikely(rc != 0))
+ GOTO(out_child, rc);
+
+ /* If the file has not been changed for some time, we return
+ * not only a LOOKUP lock, but also an UPDATE lock and this
+ * might save us RPC on later STAT. For directories, it also
+ * let negative dentry starts working for this dir. */
+ if (ma->ma_valid & MA_INODE &&
+ ma->ma_attr.la_valid & LA_CTIME &&
+ info->mti_mdt->mdt_namespace->ns_ctime_age_limit +
+ ma->ma_attr.la_ctime < cfs_time_current_sec())
+ child_bits |= MDS_INODELOCK_UPDATE;
+
rc = mdt_object_lock(info, child, lhc, child_bits,
MDT_CROSS_LOCK);