Whamcloud - gitweb
landing b_cmobd_merge on HEAD
[fs/lustre-release.git] / lustre / include / linux / lustre_log.h
index 56e2198..e6a5c14 100644 (file)
@@ -40,6 +40,7 @@
 
 #define LOG_NAME_LIMIT(logname, name)                   \
         snprintf(logname, sizeof(logname), "LOGS/%s", name)
+#define LLOG_EEMPTY 4711
 
 struct obd_llogs;
 
@@ -69,18 +70,49 @@ struct llog_handle {
         } u;
 };
 
-#define LLOG_EEMPTY 4711
+/* got from mds_update_record.
+ * FIXME: maybe some attribute in reint_record and update_record will be
+ * changed later. */
+/* XXX BUG 3188 -- must return to one set of structures. */
+/* XXX use fixed-sized fields (__u32) instead of dev_t and iattr->gid_t, etc */
+
+struct update_record {
+        __u32 ur_opcode;
+        __u32 ur_fsuid;
+        __u32 ur_fsgid;
+        dev_t ur_rdev;
+        struct iattr ur_iattr;
+        struct iattr ur_pattr;
+        __u32 ur_flags;
+        __u32 ur_len;
+};
+
+struct reint_record {
+       struct update_record u_rec;
+       char *rec_data1;
+       int rec1_size;
+       char *rec_data2;
+       int rec2_size;
+};
+
+struct llog_smfs_rec {
+        struct llog_rec_hdr     lsr_hdr;
+        struct update_record    lsr_rec;
+        struct llog_rec_tail    lsr_tail;
+};
 
 /* llog.c  -  general API */
 typedef int (*llog_cb_t)(struct llog_handle *, struct llog_rec_hdr *, void *);
+struct llog_handle *llog_alloc_handle(void);
+void llog_free_handle(struct llog_handle *handle);
+int llog_cancel_rec(struct llog_handle *loghandle, int index);
 int llog_init_handle(struct llog_handle *handle, int flags,
                      struct obd_uuid *uuid);
+int llog_close(struct llog_handle *cathandle);
 int llog_process(struct llog_handle *loghandle, llog_cb_t cb,
                  void *data, void *catdata);
-extern struct llog_handle *llog_alloc_handle(void);
-extern void llog_free_handle(struct llog_handle *handle);
-extern int llog_close(struct llog_handle *cathandle);
-extern int llog_cancel_rec(struct llog_handle *loghandle, int index);
+int llog_reverse_process(struct llog_handle *loghandle, llog_cb_t cb,
+                         void *data, void *catdata);
 
 /* llog_cat.c   -  catalog api */
 struct llog_process_data {
@@ -91,27 +123,37 @@ struct llog_process_data {
 struct llog_process_cat_data {
         int     first_idx;
         int     last_idx;
-        /* to process catlog across zero record */
+        /* to process catalog across zero record */
 };
 
+int llog_cat_id2handle(struct llog_handle *cathandle, struct llog_handle **res,
+                       struct llog_logid *logid);
 int llog_cat_put(struct llog_handle *cathandle);
 int llog_cat_add_rec(struct llog_handle *cathandle, struct llog_rec_hdr *rec,
                      struct llog_cookie *reccookie, void *buf);
 int llog_cat_cancel_records(struct llog_handle *cathandle, int count,
                             struct llog_cookie *cookies);
 int llog_cat_process(struct llog_handle *cat_llh, llog_cb_t cb, void *data);
+int llog_cat_reverse_process(struct llog_handle *cat_llh, llog_cb_t cb, void *data);
 int llog_cat_set_first_idx(struct llog_handle *cathandle, int index);
 
 /* llog_obd.c */
-int llog_setup(struct obd_device *, struct obd_llogs *, int, struct obd_device *,
-               int, struct llog_logid *, struct llog_operations *);
-int llog_cleanup(struct llog_ctxt *);
-int llog_sync(struct llog_ctxt *ctxt, struct obd_export *exp);
-int llog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
-             struct lov_stripe_md *lsm, struct llog_cookie *logcookies,
-             int numcookies);
-int llog_cancel(struct llog_ctxt *, struct lov_stripe_md *lsm,
-                int count, struct llog_cookie *cookies, int flags);
+int llog_catalog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
+                     void *buf, struct llog_cookie *reccookie, int, void *data);
+int llog_catalog_cancel(struct llog_ctxt *ctxt, int count, struct llog_cookie *,
+                        int flags, void *data);
+int llog_catalog_setup(struct llog_ctxt **res, char *name, struct obd_export *exp,
+                       struct lvfs_run_ctxt *, struct fsfilt_operations *fsops, 
+                       struct dentry *logs_de, struct dentry *objects_de);
+int llog_catalog_cleanup(struct llog_ctxt *ctxt);
+int llog_cat_half_bottom(struct llog_cookie *, struct llog_handle *);
+
+/* llog_lvfs.c */
+int llog_get_cat_list(struct lvfs_run_ctxt *, struct fsfilt_operations *,
+                      char *name, int count, struct llog_catid *idarray);
+int llog_put_cat_list(struct lvfs_run_ctxt *, struct fsfilt_operations *, 
+                      char *name, int count, struct llog_catid *idarray);
+extern struct llog_operations llog_lvfs_ops;
 
 int llog_obd_origin_setup(struct obd_device *, struct obd_llogs *, int,
                           struct obd_device *, int, struct llog_logid *);
@@ -120,15 +162,21 @@ int llog_obd_origin_add(struct llog_ctxt *ctxt,
                         struct llog_rec_hdr *rec, struct lov_stripe_md *lsm,
                         struct llog_cookie *logcookies, int numcookies);
 
-int llog_cat_initialize(struct obd_device *, struct obd_llogs *, int);
+int obd_llog_cat_initialize(struct obd_device *, struct obd_llogs *, int, char *);
+
+/* llog_obd.c - obd llog api */
+int obd_llog_setup(struct obd_device *obd, struct obd_llogs *, int index, 
+                   struct obd_device *disk_obd, int count, struct llog_logid *logid,
+                   struct llog_operations *op);
 int obd_llog_init(struct obd_device *, struct obd_llogs *, struct obd_device *,
                   int, struct llog_catid *);
+int obd_llog_cleanup(struct llog_ctxt *);
 
 int obd_llog_finish(struct obd_device *, struct obd_llogs *, int);
 
 /* llog_ioctl.c */
 int llog_ioctl(struct llog_ctxt *ctxt, int cmd, struct obd_ioctl_data *data);
-int llog_catlog_list(struct obd_device *obd, int count,
+int llog_catalog_list(struct obd_device *obd, int count,
                      struct obd_ioctl_data *data);
 
 /* llog_net.c */
@@ -140,58 +188,64 @@ int llog_origin_connect(struct llog_ctxt *ctxt, int count,
 int llog_handle_connect(struct ptlrpc_request *req);
 
 /* recov_thread.c */
-int llog_obd_repl_cancel(struct llog_ctxt *ctxt,
-                         struct lov_stripe_md *lsm, int count,
-                         struct llog_cookie *cookies, int flags);
+int llog_obd_repl_cancel(struct llog_ctxt *ctxt, int count,
+                         struct llog_cookie *cookies, int flags, void *data);
+                         
 int llog_obd_repl_sync(struct llog_ctxt *ctxt, struct obd_export *exp);
 int llog_repl_connect(struct llog_ctxt *ctxt, int count,
                       struct llog_logid *logid, struct llog_gen *gen,
                       struct obd_uuid *uuid);
 
 struct llog_operations {
+        int (*lop_setup)(struct obd_device *, struct obd_llogs *, int,
+                         struct obd_device *, int, struct llog_logid *);
+
+        int (*lop_cleanup)(struct llog_ctxt *ctxt);
+        int (*lop_create)(struct llog_ctxt *ctxt, struct llog_handle **,
+                          struct llog_logid *logid, char *name);
+        int (*lop_destroy)(struct llog_handle *handle);
+        int (*lop_close)(struct llog_handle *handle);
+
+        int (*lop_read_header)(struct llog_handle *handle);
+        int (*lop_add)(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
+                       void *buf, struct llog_cookie *logcookies,
+                       int numcookies, void *data);
+        int (*lop_cancel)(struct llog_ctxt *ctxt, int count,
+                          struct llog_cookie *cookies, int flags, void *data);
         int (*lop_write_rec)(struct llog_handle *loghandle,
                              struct llog_rec_hdr *rec,
                              struct llog_cookie *logcookies, int numcookies,
                              void *, int idx);
-        int (*lop_destroy)(struct llog_handle *handle);
         int (*lop_next_block)(struct llog_handle *h, int *curr_idx,
                               int next_idx, __u64 *offset, void *buf, int len);
-        int (*lop_create)(struct llog_ctxt *ctxt, struct llog_handle **,
-                          struct llog_logid *logid, char *name);
-        int (*lop_close)(struct llog_handle *handle);
-        int (*lop_read_header)(struct llog_handle *handle);
+        int (*lop_prev_block)(struct llog_handle *h,
+                              int prev_idx, void *buf, int len);
 
-        int (*lop_setup)(struct obd_device *, struct obd_llogs *, int,
-                         struct obd_device *, int, struct llog_logid *);
         int (*lop_sync)(struct llog_ctxt *ctxt, struct obd_export *exp);
-        int (*lop_cleanup)(struct llog_ctxt *ctxt);
-        int (*lop_add)(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
-                       struct lov_stripe_md *lsm,
-                       struct llog_cookie *logcookies, int numcookies);
-        int (*lop_cancel)(struct llog_ctxt *ctxt, struct lov_stripe_md *lsm,
-                          int count, struct llog_cookie *cookies, int flags);
         int (*lop_connect)(struct llog_ctxt *ctxt, int count,
                            struct llog_logid *logid, struct llog_gen *gen,
                            struct obd_uuid *uuid);
-        /* XXX add 2 more: commit callbacks and llog recovery functions */
 };
 
-/* llog_lvfs.c */
-extern struct llog_operations llog_lvfs_ops;
-int llog_get_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
-                      char *name, int count, struct llog_catid *idarray);
-
 struct llog_ctxt {
-        int                      loc_idx; /* my index the obd array of ctxt's */
+        /* needed for lvfs based log */
+        struct llog_handle      *loc_handle;
+        struct llog_operations  *loc_logops;
+        struct fsfilt_operations *loc_fsops;
+        struct dentry           *loc_logs_dir;
+        struct dentry           *loc_objects_dir;
+        struct lvfs_run_ctxt    *loc_lvfs_ctxt;
+
+        struct obd_device       *loc_obd;   /* points back to the containing obd */
         struct llog_gen          loc_gen;
-        struct obd_device       *loc_obd; /* points back to the containing obd*/
+        int                      loc_idx;   /* my index the obd array of ctxt's */
+        int                      loc_alone; /* is this llog ctxt has an obd? */
+
         struct obd_export       *loc_exp;
-        struct obd_import       *loc_imp; /* to use in RPC's: can be backward
-                                             pointing import */
-        struct llog_operations  *loc_logops;
-        struct llog_handle      *loc_handle;
+        struct obd_import       *loc_imp;   /* to use in RPC's: can be backward
+                                               pointing import */
         struct llog_canceld_ctxt *loc_llcd;
-        struct semaphore         loc_sem; /* protects loc_llcd */
+        struct semaphore         loc_sem;   /* protects loc_llcd */
         void                    *llog_proc_cb;
         struct obd_llogs        *loc_llogs;
 };
@@ -219,11 +273,12 @@ static inline int llog_gen_lt(struct llog_gen a, struct llog_gen b)
 
 #define LLOG_GEN_INC(gen)  ((gen).conn_cnt) ++
 #define LLOG_PROC_BREAK 0x0001
+#define LLOG_DEL_RECORD 0x0002
 
-static inline int llog_obd2ops(struct llog_ctxt *ctxt,
+static inline int llog_ctxt2ops(struct llog_ctxt *ctxt,
                                struct llog_operations **lop)
 {
-       if (ctxt == NULL)
+        if (ctxt == NULL)
                 return -ENOTCONN;
 
         *lop = ctxt->loc_logops;
@@ -239,7 +294,7 @@ static inline int llog_handle2ops(struct llog_handle *loghandle,
         if (loghandle == NULL)
                 return -EINVAL;
 
-        return llog_obd2ops(loghandle->lgh_ctxt, lop);
+        return llog_ctxt2ops(loghandle->lgh_ctxt, lop);
 }
 
 static inline int llog_data_len(int len)
@@ -256,29 +311,36 @@ static inline struct llog_ctxt *llog_get_context(struct obd_llogs *llogs,
         return llogs->llog_ctxt[index];
 }
 
-static inline int llog_write_rec(struct llog_handle *handle,
-                                 struct llog_rec_hdr *rec,
-                                 struct llog_cookie *logcookies,
-                                 int numcookies, void *buf, int idx)
+static inline int llog_create(struct llog_ctxt *ctxt, struct llog_handle **res,
+                              struct llog_logid *logid, char *name)
 {
         struct llog_operations *lop;
-        int rc, buflen;
+        int rc;
         ENTRY;
 
-        rc = llog_handle2ops(handle, &lop);
+        rc = llog_ctxt2ops(ctxt, &lop);
         if (rc)
                 RETURN(rc);
-        if (lop->lop_write_rec == NULL)
+        if (lop->lop_create == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        if (buf)
-                buflen = rec->lrh_len + sizeof(struct llog_rec_hdr)
-                                + sizeof(struct llog_rec_tail);
-        else
-                buflen = rec->lrh_len;
-        LASSERT(size_round(buflen) == buflen);
+        rc = lop->lop_create(ctxt, res, logid, name);
+        RETURN(rc);
+}
 
-        rc = lop->lop_write_rec(handle, rec, logcookies, numcookies, buf, idx);
+static inline int llog_destroy(struct llog_handle *handle)
+{
+        struct llog_operations *lop;
+        int rc;
+        ENTRY;
+
+        rc = llog_handle2ops(handle, &lop);
+        if (rc)
+                RETURN(rc);
+        if (lop->lop_destroy == NULL)
+                RETURN(-EOPNOTSUPP);
+
+        rc = lop->lop_destroy(handle);
         RETURN(rc);
 }
 
@@ -298,44 +360,69 @@ static inline int llog_read_header(struct llog_handle *handle)
         RETURN(rc);
 }
 
-static inline int llog_destroy(struct llog_handle *handle)
+static inline int llog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
+                           void *buf, struct llog_cookie *logcookies,
+                           int numcookies, void *data)
 {
         struct llog_operations *lop;
         int rc;
         ENTRY;
 
-        rc = llog_handle2ops(handle, &lop);
+        rc = llog_ctxt2ops(ctxt, &lop);
         if (rc)
                 RETURN(rc);
-        if (lop->lop_destroy == NULL)
+        if (lop->lop_add == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        rc = lop->lop_destroy(handle);
+        rc = lop->lop_add(ctxt, rec, buf, logcookies, numcookies, data);
         RETURN(rc);
 }
 
-#if 0
-static inline int llog_cancel(struct obd_export *exp,
-                              struct lov_stripe_md *lsm, int count,
-                              struct llog_cookie *cookies, int flags)
+static inline int llog_cancel(struct llog_ctxt *ctxt, int count,
+                              struct llog_cookie *cookies, int flags, void *data)
 {
         struct llog_operations *lop;
         int rc;
         ENTRY;
 
-        rc = llog_handle2ops(loghandle, &lop);
+        rc = llog_ctxt2ops(ctxt, &lop);
         if (rc)
                 RETURN(rc);
         if (lop->lop_cancel == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        rc = lop->lop_cancel(exp, lsm, count, cookies, flags);
+        rc = lop->lop_cancel(ctxt, count, cookies, flags, data);
         RETURN(rc);
 }
-#endif
 
-static inline int llog_next_block(struct llog_handle *loghandle, int *cur_idx,
-                                  int next_idx, __u64 *cur_offset, void *buf,
+static inline int llog_write_rec(struct llog_handle *handle,
+                                 struct llog_rec_hdr *rec,
+                                 struct llog_cookie *logcookies,
+                                 int numcookies, void *buf, int idx)
+{
+        struct llog_operations *lop;
+        int rc, buflen;
+        ENTRY;
+
+        rc = llog_handle2ops(handle, &lop);
+        if (rc)
+                RETURN(rc);
+        if (lop->lop_write_rec == NULL)
+                RETURN(-EOPNOTSUPP);
+
+        if (buf)
+                buflen = le32_to_cpu(rec->lrh_len) + sizeof(struct llog_rec_hdr)
+                                + sizeof(struct llog_rec_tail);
+        else
+                buflen = le32_to_cpu(rec->lrh_len);
+        LASSERT(size_round(buflen) == buflen);
+
+        rc = lop->lop_write_rec(handle, rec, logcookies, numcookies, buf, idx);
+        RETURN(rc);
+}
+
+static inline int llog_next_block(struct llog_handle *loghandle, int *curr_idx,
+                                  int next_idx, __u64 *curr_offset, void *buf,
                                   int len)
 {
         struct llog_operations *lop;
@@ -348,25 +435,25 @@ static inline int llog_next_block(struct llog_handle *loghandle, int *cur_idx,
         if (lop->lop_next_block == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        rc = lop->lop_next_block(loghandle, cur_idx, next_idx, cur_offset, buf,
+        rc = lop->lop_next_block(loghandle, curr_idx, next_idx, curr_offset, buf,
                                  len);
         RETURN(rc);
 }
 
-static inline int llog_create(struct llog_ctxt *ctxt, struct llog_handle **res,
-                              struct llog_logid *logid, char *name)
+static inline int llog_prev_block(struct llog_handle *loghandle,
+                                  int prev_idx, void *buf, int len)
 {
         struct llog_operations *lop;
         int rc;
         ENTRY;
 
-        rc = llog_obd2ops(ctxt, &lop);
+        rc = llog_handle2ops(loghandle, &lop);
         if (rc)
                 RETURN(rc);
-        if (lop->lop_create == NULL)
+        if (lop->lop_prev_block == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        rc = lop->lop_create(ctxt, res, logid, name);
+        rc = lop->lop_prev_block(loghandle, prev_idx, buf, len);
         RETURN(rc);
 }
 
@@ -378,7 +465,7 @@ static inline int llog_connect(struct llog_ctxt *ctxt, int count,
         int rc;
         ENTRY;
 
-        rc = llog_obd2ops(ctxt, &lop);
+        rc = llog_ctxt2ops(ctxt, &lop);
         if (rc)
                 RETURN(rc);
         if (lop->lop_connect == NULL)
@@ -388,4 +475,20 @@ static inline int llog_connect(struct llog_ctxt *ctxt, int count,
         RETURN(rc);
 }
 
+static inline int llog_sync(struct llog_ctxt *ctxt, struct obd_export *exp)
+{
+        struct llog_operations *lop;
+        int rc;
+        ENTRY;
+
+        rc = llog_ctxt2ops(ctxt, &lop);
+        if (rc)
+                RETURN(rc);
+        if (lop->lop_sync == NULL)
+                RETURN(-EOPNOTSUPP);
+
+        rc = lop->lop_sync(ctxt, exp);
+        RETURN(rc);
+}
+
 #endif