Whamcloud - gitweb
Introduce .gitignore files.
[fs/lustre-release.git] / lustre / mdd / mdd_device.c
index 302b1d5..7dc67d1 100644 (file)
@@ -95,6 +95,8 @@ static int mdd_device_init(const struct lu_env *env, struct lu_device *d,
         mdd->mdd_txn_cb.dtc_tag = LCT_MD_THREAD;
         CFS_INIT_LIST_HEAD(&mdd->mdd_txn_cb.dtc_linkage);
         mdd->mdd_atime_diff = MAX_ATIME_DIFF;
+        /* sync permission changes */
+        mdd->mdd_sync_permission = 1;
 
         rc = mdd_procfs_init(mdd, name);
         RETURN(rc);
@@ -148,11 +150,11 @@ static int changelog_init_cb(struct llog_handle *llh, struct llog_rec_hdr *hdr,
 
         CDEBUG(D_INFO,
                "seeing record at index %d/%d/"LPU64" t=%x %.*s in log "LPX64"\n",
-               hdr->lrh_index, rec->cr_hdr.lrh_index, rec->cr_index,
-               rec->cr_type, rec->cr_namelen, rec->cr_name,
+               hdr->lrh_index, rec->cr_hdr.lrh_index, rec->cr.cr_index,
+               rec->cr.cr_type, rec->cr.cr_namelen, rec->cr.cr_name,
                llh->lgh_id.lgl_oid);
 
-        mdd->mdd_cl.mc_index = rec->cr_index;
+        mdd->mdd_cl.mc_index = rec->cr.cr_index;
         RETURN(LLOG_PROC_BREAK);
 }
 
@@ -288,6 +290,13 @@ int mdd_changelog_on(struct mdd_device *mdd, int on)
         return rc;
 }
 
+static __u64 cl_time(void) {
+        cfs_fs_time_t time;
+
+        cfs_fs_time_current(&time);
+        return (((__u64)time.tv_sec) << 30) + time.tv_nsec;
+}
+
 /** Add a changelog entry \a rec to the changelog llog
  * \param mdd
  * \param rec
@@ -303,18 +312,18 @@ int mdd_changelog_llog_write(struct mdd_device         *mdd,
         struct llog_ctxt *ctxt;
         int rc;
 
-        if ((mdd->mdd_cl.mc_mask & (1 << rec->cr_type)) == 0)
+        if ((mdd->mdd_cl.mc_mask & (1 << rec->cr.cr_type)) == 0)
                 return 0;
 
-        rec->cr_hdr.lrh_len = llog_data_len(sizeof(*rec) + rec->cr_namelen);
+        rec->cr_hdr.lrh_len = llog_data_len(sizeof(*rec) + rec->cr.cr_namelen);
         /* llog_lvfs_write_rec sets the llog tail len */
         rec->cr_hdr.lrh_type = CHANGELOG_REC;
-        rec->cr_time = cfs_time_current_64();
+        rec->cr.cr_time = cl_time();
         spin_lock(&mdd->mdd_cl.mc_lock);
         /* NB: I suppose it's possible llog_add adds out of order wrt cr_index,
            but as long as the MDD transactions are ordered correctly for e.g.
            rename conflicts, I don't think this should matter. */
-        rec->cr_index = ++mdd->mdd_cl.mc_index;
+        rec->cr.cr_index = ++mdd->mdd_cl.mc_index;
         spin_unlock(&mdd->mdd_cl.mc_lock);
         ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
         if (ctxt == NULL)
@@ -396,17 +405,17 @@ int mdd_changelog_write_header(struct mdd_device *mdd, int markerflags)
         if (rec == NULL)
                 RETURN(-ENOMEM);
 
-        rec->cr_flags = CLF_VERSION;
-        rec->cr_type = CL_MARK;
-        rec->cr_namelen = len;
-        memcpy(rec->cr_name, obd->obd_name, rec->cr_namelen);
+        rec->cr.cr_flags = CLF_VERSION;
+        rec->cr.cr_type = CL_MARK;
+        rec->cr.cr_namelen = len;
+        memcpy(rec->cr.cr_name, obd->obd_name, rec->cr.cr_namelen);
         /* Status and action flags */
-        rec->cr_markerflags = mdd->mdd_cl.mc_flags | markerflags;
+        rec->cr.cr_markerflags = mdd->mdd_cl.mc_flags | markerflags;
 
         rc = mdd_changelog_llog_write(mdd, rec, NULL);
 
         /* assume on or off event; reset repeat-access time */
-        mdd->mdd_cl.mc_starttime = rec->cr_time;
+        mdd->mdd_cl.mc_starttime = rec->cr.cr_time;
 
         OBD_FREE(rec, reclen);
         RETURN(rc);
@@ -1261,6 +1270,25 @@ struct md_capainfo *md_capainfo(const struct lu_env *env)
 }
 EXPORT_SYMBOL(md_capainfo);
 
+/*
+ * context key constructor/destructor:
+ * mdd_quota_key_init, mdd_quota_key_fini
+ */
+LU_KEY_INIT_FINI(mdd_quota, struct md_quota);
+
+struct lu_context_key mdd_quota_key = {
+        .lct_tags = LCT_SESSION,
+        .lct_init = mdd_quota_key_init,
+        .lct_fini = mdd_quota_key_fini
+};
+
+struct md_quota *md_quota(const struct lu_env *env)
+{
+        LASSERT(env->le_ses != NULL);
+        return lu_context_key_get(env->le_ses, &mdd_quota_key);
+}
+EXPORT_SYMBOL(md_quota);
+
 static int mdd_changelog_user_register(struct mdd_device *mdd, int *id)
 {
         struct llog_ctxt *ctxt;
@@ -1482,7 +1510,8 @@ static int mdd_iocontrol(const struct lu_env *env, struct md_device *m,
 }
 
 /* type constructor/destructor: mdd_type_init, mdd_type_fini */
-LU_TYPE_INIT_FINI(mdd, &mdd_thread_key, &mdd_ucred_key, &mdd_capainfo_key);
+LU_TYPE_INIT_FINI(mdd, &mdd_thread_key, &mdd_ucred_key, &mdd_capainfo_key,
+                  &mdd_quota_key);
 
 const struct md_device_operations mdd_ops = {
         .mdo_statfs         = mdd_statfs,