Whamcloud - gitweb
LU-1302 llog: pass lu_env as parametr in llog functions
[fs/lustre-release.git] / lustre / obdclass / llog_lvfs.c
index cb83ed2..a01582b 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -26,7 +24,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
 
 #define DEBUG_SUBSYSTEM S_LOG
 
-#ifndef EXPORT_SYMTAB
-#define EXPORT_SYMTAB
-#endif
-
 #ifndef __KERNEL__
 #include <liblustre.h>
 #endif
@@ -165,7 +159,8 @@ static int llog_lvfs_read_blob(struct obd_device *obd, struct l_file *file,
         RETURN(0);
 }
 
-static int llog_lvfs_read_header(struct llog_handle *handle)
+static int llog_lvfs_read_header(const struct lu_env *env,
+                                struct llog_handle *handle)
 {
         struct obd_device *obd;
         int rc;
@@ -217,10 +212,11 @@ static int llog_lvfs_read_header(struct llog_handle *handle)
 
 /* returns negative in on error; 0 if success && reccookie == 0; 1 otherwise */
 /* appends if idx == -1, otherwise overwrites record idx. */
-static int llog_lvfs_write_rec(struct llog_handle *loghandle,
-                               struct llog_rec_hdr *rec,
-                               struct llog_cookie *reccookie, int cookiecount,
-                               void *buf, int idx)
+static int llog_lvfs_write_rec(const struct lu_env *env,
+                              struct llog_handle *loghandle,
+                              struct llog_rec_hdr *rec,
+                              struct llog_cookie *reccookie, int cookiecount,
+                              void *buf, int idx)
 {
         struct llog_log_hdr *llh;
         int reclen = rec->lrh_len, index, rc;
@@ -367,13 +363,10 @@ static int llog_lvfs_write_rec(struct llog_handle *loghandle,
                 reccookie->lgc_lgl = loghandle->lgh_id;
                 reccookie->lgc_index = index;
                 if ((rec->lrh_type == MDS_UNLINK_REC) ||
-                    (rec->lrh_type == MDS_SETATTR_REC) ||
                     (rec->lrh_type == MDS_SETATTR64_REC))
                         reccookie->lgc_subsys = LLOG_MDS_OST_ORIG_CTXT;
                 else if (rec->lrh_type == OST_SZ_REC)
                         reccookie->lgc_subsys = LLOG_SIZE_ORIG_CTXT;
-                else if (rec->lrh_type == OST_RAID1_REC)
-                        reccookie->lgc_subsys = LLOG_RD1_ORIG_CTXT;
                 else
                         reccookie->lgc_subsys = -1;
                 rc = 1;
@@ -404,9 +397,10 @@ static void llog_skip_over(__u64 *off, int curr, int goal)
  *  - cur_idx to the log index preceeding cur_offset
  * returns -EIO/-EINVAL on error
  */
-static int llog_lvfs_next_block(struct llog_handle *loghandle, int *cur_idx,
-                                int next_idx, __u64 *cur_offset, void *buf,
-                                int len)
+static int llog_lvfs_next_block(const struct lu_env *env,
+                               struct llog_handle *loghandle, int *cur_idx,
+                               int next_idx, __u64 *cur_offset, void *buf,
+                               int len)
 {
         int rc;
         ENTRY;
@@ -460,9 +454,8 @@ static int llog_lvfs_next_block(struct llog_handle *loghandle, int *cur_idx,
                 tail = (struct llog_rec_tail *)((char *)buf + rc -
                                                 sizeof(struct llog_rec_tail));
 
-                if (LLOG_REC_HDR_NEEDS_SWABBING(rec)) {
-                        lustre_swab_llog_rec(rec, tail);
-                }
+               if (LLOG_REC_HDR_NEEDS_SWABBING(rec))
+                       lustre_swab_llog_rec(rec);
 
                 *cur_idx = tail->lrt_index;
 
@@ -488,8 +481,9 @@ static int llog_lvfs_next_block(struct llog_handle *loghandle, int *cur_idx,
         RETURN(-EIO);
 }
 
-static int llog_lvfs_prev_block(struct llog_handle *loghandle,
-                                int prev_idx, void *buf, int len)
+static int llog_lvfs_prev_block(const struct lu_env *env,
+                               struct llog_handle *loghandle,
+                               int prev_idx, void *buf, int len)
 {
         __u64 cur_offset;
         int rc;
@@ -586,8 +580,9 @@ static struct file *llog_filp_open(char *dir, char *name, int flags, int mode)
 
 /* This is a callback from the llog_* functions.
  * Assumes caller has already pushed us into the kernel context. */
-static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
-                            struct llog_logid *logid, char *name)
+static int llog_lvfs_create(const struct lu_env *env,
+                           struct llog_ctxt *ctxt, struct llog_handle **res,
+                           struct llog_logid *logid, char *name)
 {
         struct llog_handle *handle;
         struct obd_device *obd;
@@ -608,7 +603,7 @@ static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
 
         if (logid != NULL) {
                 dchild = obd_lvfs_fid2dentry(ctxt->loc_exp, logid->lgl_oid,
-                                             logid->lgl_ogen, logid->lgl_ogr);
+                                             logid->lgl_ogen, logid->lgl_oseq);
 
                 if (IS_ERR(dchild)) {
                         rc = PTR_ERR(dchild);
@@ -621,7 +616,7 @@ static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
                         l_dput(dchild);
                         rc = -ENOENT;
                         CERROR("nonexistent log file "LPX64":"LPX64": rc %d\n",
-                               logid->lgl_oid, logid->lgl_ogr, rc);
+                               logid->lgl_oid, logid->lgl_oseq, rc);
                         GOTO(out, rc);
                 }
 
@@ -644,7 +639,7 @@ static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
                 if (IS_ERR(handle->lgh_file))
                         GOTO(out, rc = PTR_ERR(handle->lgh_file));
 
-                handle->lgh_id.lgl_ogr = 1;
+                handle->lgh_id.lgl_oseq = 1;
                 handle->lgh_id.lgl_oid =
                         handle->lgh_file->f_dentry->d_inode->i_ino;
                 handle->lgh_id.lgl_ogen =
@@ -654,15 +649,19 @@ static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
                 if (oa == NULL)
                         GOTO(out, rc = -ENOMEM);
 
-                oa->o_gr = FILTER_GROUP_LLOG;
+                oa->o_seq = FID_SEQ_LLOG;
                 oa->o_valid = OBD_MD_FLGENER | OBD_MD_FLGROUP;
 
-                rc = obd_create(ctxt->loc_exp, oa, NULL, NULL);
+                rc = obd_create(NULL, ctxt->loc_exp, oa, NULL, NULL);
                 if (rc)
                         GOTO(out, rc);
 
+                /* FIXME: rationalize the misuse of o_generation in
+                 *        this API along with mds_obd_{create,destroy}.
+                 *        Hopefully it is only an internal API issue. */
+#define o_generation o_parent_oid
                 dchild = obd_lvfs_fid2dentry(ctxt->loc_exp, oa->o_id,
-                                             oa->o_generation, oa->o_gr);
+                                             oa->o_generation, oa->o_seq);
 
                 if (IS_ERR(dchild))
                         GOTO(out, rc = PTR_ERR(dchild));
@@ -672,7 +671,7 @@ static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
                 if (IS_ERR(handle->lgh_file))
                         GOTO(out, rc = PTR_ERR(handle->lgh_file));
 
-                handle->lgh_id.lgl_ogr = oa->o_gr;
+                handle->lgh_id.lgl_oseq = oa->o_seq;
                 handle->lgh_id.lgl_oid = oa->o_id;
                 handle->lgh_id.lgl_ogen = oa->o_generation;
         }
@@ -687,7 +686,8 @@ out:
         RETURN(rc);
 }
 
-static int llog_lvfs_close(struct llog_handle *handle)
+static int llog_lvfs_close(const struct lu_env *env,
+                          struct llog_handle *handle)
 {
         int rc;
         ENTRY;
@@ -698,33 +698,35 @@ static int llog_lvfs_close(struct llog_handle *handle)
         RETURN(rc);
 }
 
-static int llog_lvfs_destroy(struct llog_handle *handle)
+static int llog_lvfs_destroy(const struct lu_env *env,
+                            struct llog_handle *handle)
 {
         struct dentry *fdentry;
         struct obdo *oa;
         struct obd_device *obd = handle->lgh_ctxt->loc_exp->exp_obd;
         char *dir;
-        int rc;
+        void *th;
+        struct inode *inode;
+        int rc, rc1;
         ENTRY;
 
         dir = MOUNT_CONFIGS_DIR;
 
         fdentry = handle->lgh_file->f_dentry;
+        inode = fdentry->d_parent->d_inode;
         if (strcmp(fdentry->d_parent->d_name.name, dir) == 0) {
-                struct inode *inode = fdentry->d_parent->d_inode;
                 struct lvfs_run_ctxt saved;
                 struct vfsmount *mnt = mntget(handle->lgh_file->f_vfsmnt);
 
                 push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 dget(fdentry);
-                rc = llog_lvfs_close(handle);
-
-                if (rc == 0) {
-                        LOCK_INODE_MUTEX_PARENT(inode);
-                        rc = ll_vfs_unlink(inode, fdentry, mnt);
-                        UNLOCK_INODE_MUTEX(inode);
-                }
-                mntput(mnt);
+               rc = llog_lvfs_close(env, handle);
+               if (rc == 0) {
+                       mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+                       rc = ll_vfs_unlink(inode, fdentry, mnt);
+                       mutex_unlock(&inode->i_mutex);
+               }
+               mntput(mnt);
 
                 dput(fdentry);
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
@@ -736,15 +738,27 @@ static int llog_lvfs_destroy(struct llog_handle *handle)
                 RETURN(-ENOMEM);
 
         oa->o_id = handle->lgh_id.lgl_oid;
-        oa->o_gr = handle->lgh_id.lgl_ogr;
+        oa->o_seq = handle->lgh_id.lgl_oseq;
         oa->o_generation = handle->lgh_id.lgl_ogen;
+#undef o_generation
         oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP | OBD_MD_FLGENER;
 
-        rc = llog_lvfs_close(handle);
+       rc = llog_lvfs_close(env, handle);
         if (rc)
                 GOTO(out, rc);
 
-        rc = obd_destroy(handle->lgh_ctxt->loc_exp, oa, NULL, NULL, NULL, NULL);
+        th = fsfilt_start_log(obd, inode, FSFILT_OP_UNLINK, NULL, 1);
+        if (IS_ERR(th)) {
+                CERROR("fsfilt_start failed: %ld\n", PTR_ERR(th));
+                GOTO(out, rc = PTR_ERR(th));
+        }
+
+        rc = obd_destroy(NULL, handle->lgh_ctxt->loc_exp, oa,
+                         NULL, NULL, NULL, NULL);
+
+        rc1 = fsfilt_commit(obd, inode, th, 0);
+        if (rc == 0 && rc1 != 0)
+                rc = rc1;
  out:
         OBDO_FREE(oa);
         RETURN(rc);
@@ -866,50 +880,57 @@ EXPORT_SYMBOL(llog_lvfs_ops);
 
 #else /* !__KERNEL__ */
 
-static int llog_lvfs_read_header(struct llog_handle *handle)
+static int llog_lvfs_read_header(const struct lu_env *env,
+                                struct llog_handle *handle)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_write_rec(struct llog_handle *loghandle,
-                               struct llog_rec_hdr *rec,
-                               struct llog_cookie *reccookie, int cookiecount,
-                               void *buf, int idx)
+static int llog_lvfs_write_rec(const struct lu_env *env,
+                              struct llog_handle *loghandle,
+                              struct llog_rec_hdr *rec,
+                              struct llog_cookie *reccookie, int cookiecount,
+                              void *buf, int idx)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_next_block(struct llog_handle *loghandle, int *cur_idx,
-                                int next_idx, __u64 *cur_offset, void *buf,
-                                int len)
+static int llog_lvfs_next_block(const struct lu_env *env,
+                               struct llog_handle *loghandle, int *cur_idx,
+                               int next_idx, __u64 *cur_offset, void *buf,
+                               int len)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_prev_block(struct llog_handle *loghandle,
-                                int prev_idx, void *buf, int len)
+static int llog_lvfs_prev_block(const struct lu_env *env,
+                               struct llog_handle *loghandle,
+                               int prev_idx, void *buf, int len)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
-                            struct llog_logid *logid, char *name)
+static int llog_lvfs_create(const struct lu_env *env,
+                           struct llog_ctxt *ctxt, struct llog_handle **res,
+                           struct llog_logid *logid, char *name)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_close(struct llog_handle *handle)
+static int llog_lvfs_close(const struct lu_env *env,
+                          struct llog_handle *handle)
 {
         LBUG();
         return 0;
 }
 
-static int llog_lvfs_destroy(struct llog_handle *handle)
+static int llog_lvfs_destroy(const struct lu_env *env,
+                            struct llog_handle *handle)
 {
         LBUG();
         return 0;