#include <linux/module.h>
#include <linux/version.h>
-#include <portals/list.h>
+#include <libcfs/list.h>
#include <linux/obd_class.h>
#include <linux/lustre_fsfilt.h>
#include <linux/lustre_commit_confd.h>
static int mds_llog_origin_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
void *buf, struct llog_cookie *logcookies,
- int numcookies, void *data)
+ int numcookies, void *data,
+ struct rw_semaphore **lock, int *lock_count)
{
struct obd_device *obd = ctxt->loc_obd;
- struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
+ struct obd_device *lov_obd = obd->u.mds.mds_dt_obd;
struct llog_ctxt *lctxt;
int rc;
ENTRY;
lctxt = llog_get_context(&lov_obd->obd_llogs, ctxt->loc_idx);
- rc = llog_add(lctxt, rec, buf, logcookies, numcookies, data);
+ rc = llog_add(lctxt, rec, buf, logcookies, numcookies, data,
+ lock, lock_count);
RETURN(rc);
}
struct llog_gen *gen, struct obd_uuid *uuid)
{
struct obd_device *obd = ctxt->loc_obd;
- struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
+ struct obd_device *lov_obd = obd->u.mds.mds_dt_obd;
struct llog_ctxt *lctxt;
int rc;
ENTRY;
void *data)
{
struct obd_device *obd = ctxt->loc_obd;
- struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
+ struct obd_device *lov_obd = obd->u.mds.mds_dt_obd;
struct llog_ctxt *lctxt;
int rc;
ENTRY;
int mds_log_op_unlink(struct obd_device *obd, struct inode *inode,
struct lov_mds_md *lmm, int lmm_size,
- struct llog_cookie *logcookies, int cookies_size)
+ struct llog_cookie *logcookies, int cookies_size,
+ struct llog_create_locks **res)
{
struct mds_obd *mds = &obd->u.mds;
struct lov_stripe_md *lsm = NULL;
struct llog_ctxt *ctxt;
- int rc;
+ struct llog_create_locks *lcl = NULL;
+ int rc, size = 0,offset = offsetof(struct llog_create_locks, lcl_locks);
+ int lock_count = 0;
ENTRY;
- if (IS_ERR(mds->mds_osc_obd))
- RETURN(PTR_ERR(mds->mds_osc_obd));
+ if (IS_ERR(mds->mds_dt_obd))
+ RETURN(PTR_ERR(mds->mds_dt_obd));
+
+ RETURN(0);
- rc = obd_unpackmd(mds->mds_osc_exp, &lsm,
- lmm, lmm_size);
+ rc = obd_unpackmd(mds->mds_dt_exp, &lsm, lmm, lmm_size);
if (rc < 0)
RETURN(rc);
+ if (res != NULL) {
+ size = offset +
+ sizeof(struct rw_semaphore *) * lsm->lsm_stripe_count;
+ OBD_ALLOC(lcl, size);
+ if (lcl == NULL)
+ RETURN(-ENOMEM);
+
+ lcl->lcl_count = lsm->lsm_stripe_count;
+ *res = lcl;
+ }
+
ctxt = llog_get_context(&obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT);
rc = llog_add(ctxt, NULL, lsm, logcookies,
- cookies_size / sizeof(struct llog_cookie), NULL);
+ cookies_size / sizeof(struct llog_cookie), NULL,
+ res ? &lcl->lcl_locks[0] : NULL, &lock_count);
+
+ obd_free_memmd(mds->mds_dt_exp, &lsm);
- obd_free_memmd(mds->mds_osc_exp, &lsm);
+ if (res && (rc <= 0 || lock_count == 0)) {
+ OBD_FREE(lcl, size);
+ *res = NULL;
+ }
RETURN(rc);
}
int mds_llog_init(struct obd_device *obd, struct obd_llogs *llogs,
struct obd_device *tgt, int count, struct llog_catid *logid)
{
- struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
+ struct obd_device *lov_obd = obd->u.mds.mds_dt_obd;
int rc;
ENTRY;
int mds_llog_finish(struct obd_device *obd, struct obd_llogs *llogs, int count)
{
- struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
+ struct obd_device *lov_obd = obd->u.mds.mds_dt_obd;
int rc;
ENTRY;