struct mgs_obd *mgs = &obd->u.mgs;
struct mgs_open_llog *mol, *tmp;
char *p;
- int rc;
OBD_ALLOC(mol, sizeof(*mol));
if (!mol) {
CERROR("logname need to include fsname.\n");
goto cleanup;
}
-
+#if 0
rc = mgs_load_system_db(obd, name, &mol->mol_system_db);
if (rc)
goto cleanup;
-
+#endif
mol->mol_refs = 1;
spin_lock_init(&mol->mol_lock);
RETURN(0);
}
-
-#ifdef __KERNEL__
-
-static int mgs_llog_lvfs_pad(struct obd_device *obd, struct l_file *file,
- int len, int index)
-{
- struct llog_rec_hdr rec = { 0 };
- struct llog_rec_tail tail;
- int rc;
- ENTRY;
-
- LASSERT(len >= LLOG_MIN_REC_SIZE && (len & 0x7) == 0);
-
- tail.lrt_len = rec.lrh_len = len;
- tail.lrt_index = rec.lrh_index = index;
- rec.lrh_type = LLOG_PAD_MAGIC;
-
- rc = fsfilt_write_record(obd, file, &rec, sizeof(rec), &file->f_pos, 0);
- if (rc) {
- CERROR("error writing padding record: rc %d\n", rc);
- goto out;
- }
-
- file->f_pos += len - sizeof(rec) - sizeof(tail);
- rc = fsfilt_write_record(obd, file, &tail, sizeof(tail),&file->f_pos,0);
- if (rc) {
- CERROR("error writing padding record: rc %d\n", rc);
- goto out;
- }
-
- out:
- RETURN(rc);
-}
-
-static int mgs_llog_lvfs_read_header(struct llog_handle *handle)
-{
- struct obd_device *obd;
- int rc;
- ENTRY;
-
- LASSERT(sizeof(*handle->lgh_hdr) == LLOG_CHUNK_SIZE);
-
- obd = handle->lgh_ctxt->loc_exp->exp_obd;
-
- if (handle->lgh_file->f_dentry->d_inode->i_size == 0) {
- CDEBUG(D_HA, "not reading header from 0-byte log\n");
- RETURN(LLOG_EEMPTY);
- }
-
- rc = llog_lvfs_read_blob(obd, handle->lgh_file, handle->lgh_hdr,
- LLOG_CHUNK_SIZE, 0);
- if (rc) {
- CERROR("error reading log header from %.*s\n",
- handle->lgh_file->f_dentry->d_name.len,
- handle->lgh_file->f_dentry->d_name.name);
- } else {
- struct llog_rec_hdr *llh_hdr = &handle->lgh_hdr->llh_hdr;
-
- if (LLOG_REC_HDR_NEEDS_SWABBING(llh_hdr))
- lustre_swab_llog_hdr(handle->lgh_hdr);
-
- if (llh_hdr->lrh_type != LLOG_HDR_MAGIC) {
- CERROR("bad log %.*s header magic: %#x (expected %#x)\n",
- handle->lgh_file->f_dentry->d_name.len,
- handle->lgh_file->f_dentry->d_name.name,
- llh_hdr->lrh_type, LLOG_HDR_MAGIC);
- rc = -EIO;
- } else if (llh_hdr->lrh_len != LLOG_CHUNK_SIZE) {
- CERROR("incorrectly sized log %.*s header: %#x "
- "(expected %#x)\n",
- handle->lgh_file->f_dentry->d_name.len,
- handle->lgh_file->f_dentry->d_name.name,
- llh_hdr->lrh_len, LLOG_CHUNK_SIZE);
- CERROR("you may need to re-run lconf --write_conf.\n");
- rc = -EIO;
- }
- }
-
- handle->lgh_last_idx = handle->lgh_hdr->llh_tail.lrt_index;
- handle->lgh_file->f_pos = handle->lgh_file->f_dentry->d_inode->i_size;
-
- RETURN(rc);
-}
-
-static int mgs_llog_lvfs_write_blob(struct obd_device *obd, struct l_file *file,
- struct llog_rec_hdr *rec, void *buf, loff_t off)
-{
- int rc;
- struct llog_rec_tail end;
- loff_t saved_off = file->f_pos;
- int buflen = rec->lrh_len;
-
- ENTRY;
- file->f_pos = off;
-
- if (!buf) {
- rc = fsfilt_write_record(obd, file, rec, buflen,&file->f_pos,0);
- if (rc) {
- CERROR("error writing log record: rc %d\n", rc);
- goto out;
- }
- GOTO(out, rc = 0);
- }
-
- /* the buf case */
- rec->lrh_len = sizeof(*rec) + buflen + sizeof(end);
- rc = fsfilt_write_record(obd, file, rec, sizeof(*rec), &file->f_pos, 0);
- if (rc) {
- CERROR("error writing log hdr: rc %d\n", rc);
- goto out;
- }
-
- rc = fsfilt_write_record(obd, file, buf, buflen, &file->f_pos, 0);
- if (rc) {
- CERROR("error writing log buffer: rc %d\n", rc);
- goto out;
- }
-
- end.lrt_len = rec->lrh_len;
- end.lrt_index = rec->lrh_index;
- rc = fsfilt_write_record(obd, file, &end, sizeof(end), &file->f_pos, 0);
- if (rc) {
- CERROR("error writing log tail: rc %d\n", rc);
- goto out;
- }
-
- rc = 0;
- out:
- if (saved_off > file->f_pos)
- file->f_pos = saved_off;
- LASSERT(rc <= 0);
- RETURN(rc);
-}
-
-static int mgs_llog_lvfs_read_blob(struct obd_device *obd, struct l_file *file,
- void *buf, int size, loff_t off)
-{
- loff_t offset = off;
- int rc;
- ENTRY;
-
- rc = fsfilt_read_record(obd, file, buf, size, &offset);
- if (rc) {
- CERROR("error reading log record: rc %d\n", rc);
- RETURN(rc);
- }
- RETURN(0);
-}
-
-/* We can skip reading at least as many log blocks as the number of
-* minimum sized log records we are skipping. If it turns out
-* that we are not far enough along the log (because the
-* actual records are larger than minimum size) we just skip
-* some more records. */
-
-static void llog_skip_over(__u64 *off, int curr, int goal)
-{
- if (goal <= curr)
- return;
- *off = (*off + (goal-curr-1) * LLOG_MIN_REC_SIZE) &
- ~(LLOG_CHUNK_SIZE - 1);
-}
-
-static struct dentry *
-mgs_lvfs_logid2dentry(struct obd_device *obd, struct dentry *parent,
- struct llog_logid *logid)
-{
- struct mgs_obd *mgs = &obd->u.mgs;
- struct ll_fid fid;
- fid.id = logid->lgl_oid;
- fid.generation = logid->lgl_ogen;
-
- CDEBUG(D_DENTRY, "--> mgs_logid2dentry: ino/gen %lu/%u, sb %p\n",
- fid.id, fid.generation, mgs->mgs_sb);
-
- return ll_fid2dentry(parent, fid.id, fid.generation);
-}
-
-static struct file *llog_filp_open(char *name, int flags, int mode)
-{
- char *logname;
- struct file *filp;
- int len;
-
- OBD_ALLOC(logname, PATH_MAX);
- if (logname == NULL)
- return ERR_PTR(-ENOMEM);
-
- len = snprintf(logname, PATH_MAX, "%s/%s",
- MOUNT_CONFIGS_DIR, name);
-
- if (len >= PATH_MAX - 1) {
- filp = ERR_PTR(-ENAMETOOLONG);
- } else {
- CERROR("logname = %s\n", logname);
- filp = l_filp_open(logname, flags, mode);
- if (IS_ERR(filp))
- CERROR("logfile creation %s: %ld\n", logname,
- PTR_ERR(filp));
- }
-
- OBD_FREE(logname, PATH_MAX);
- return filp;
-}
-
-/* This is a callback from the llog_* functions.
- * Assumes caller has already pushed us into the kernel context. */
-static int mgs_llog_lvfs_create(struct llog_ctxt *ctxt,
- struct llog_handle **res,
- struct llog_logid *logid, char *name)
-{
- struct llog_handle *handle;
- struct obd_device *obd;
- struct l_dentry *dchild = NULL;
- int rc = 0, cleanup_phase = 1;
- int open_flags = O_RDWR | O_CREAT | O_LARGEFILE;
- ENTRY;
-
- handle = llog_alloc_handle();
- if (handle == NULL)
- RETURN(-ENOMEM);
- *res = handle;
-
- LASSERT(ctxt);
- LASSERT(ctxt->loc_exp);
- obd = ctxt->loc_exp->exp_obd;
-
- if (logid != NULL) {
- struct mgs_open_llog *mol = find_mgs_open_llog(obd, name);
- if (!mol) {
- CERROR("can not find mgs_open_llog: %s\n", name);
- GOTO(cleanup, -EINVAL);
- }
-
- dchild = mgs_logid2dentry(obd, mol->mol_dentry, logid);
-
- if (IS_ERR(dchild)) {
- rc = PTR_ERR(dchild);
- CERROR("error looking up logfile "LPX64":0x%x: rc %d\n",
- logid->lgl_oid, logid->lgl_ogen, rc);
- GOTO(cleanup, rc);
- }
-
- cleanup_phase = 2;
- if (dchild->d_inode == NULL) {
- rc = -ENOENT;
- CERROR("nonexistent log file "LPX64":"LPX64": rc %d\n",
- logid->lgl_oid, logid->lgl_ogr, rc);
- GOTO(cleanup, rc);
- }
-
- handle->lgh_file = l_dentry_open(&obd->obd_lvfs_ctxt, dchild,
- O_RDWR | O_LARGEFILE);
- if (IS_ERR(handle->lgh_file)) {
- rc = PTR_ERR(handle->lgh_file);
- CERROR("error opening logfile "LPX64"0x%x: rc %d\n",
- logid->lgl_oid, logid->lgl_ogen, rc);
- GOTO(cleanup, rc);
- }
-
- /* assign the value of lgh_id for handle directly */
- handle->lgh_id = *logid;
-
- } else if (name) {
- handle->lgh_file = llog_filp_open(name, open_flags, 0644);
-
- if (IS_ERR(handle->lgh_file))
- GOTO(cleanup, rc = PTR_ERR(handle->lgh_file));
-
- handle->lgh_id.lgl_ogr = 1;
- handle->lgh_id.lgl_oid =
- handle->lgh_file->f_dentry->d_inode->i_ino;
- handle->lgh_id.lgl_ogen =
- handle->lgh_file->f_dentry->d_inode->i_generation;
-
- rc = open_mgs_open_llog(obd, name);
- if (rc) {
- CERROR("can not open mgs_open_llog (%s): rc %d\n",
- name, rc);
- GOTO(cleanup, rc);
- }
- } else {
- CERROR("No llog id and llog name be specified.\n");
- GOTO(cleanup, rc = -EINVAL);
- }
-
- handle->lgh_ctxt = ctxt;
-
-finish:
- RETURN(rc);
-cleanup:
- switch (cleanup_phase) {
- case 2:
- l_dput(dchild);
- case 1:
- llog_free_handle(handle);
- }
- goto finish;
-}
-
-
-static int mgs_llog_lvfs_destroy(struct llog_handle *handle)
-{
- struct dentry *fdentry;
- struct obdo *oa;
- int rc;
- ENTRY;
-
- fdentry = handle->lgh_file->f_dentry;
- if (strcmp(fdentry->d_parent->d_name.name, MOUNT_CONFIGS_DIR) == 0) {
- /* CONFIGS files aren't really "lustre" objects - special case*/
- struct obd_device *obd = handle->lgh_ctxt->loc_exp->exp_obd;
- struct inode *inode = fdentry->d_parent->d_inode;
- struct lvfs_run_ctxt saved;
-
- push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- dget(fdentry);
- rc = mgs_llog_lvfs_close(handle);
-
- if (rc == 0) {
- down(&inode->i_sem);
- rc = vfs_unlink(inode, fdentry);
- up(&inode->i_sem);
- }
-
- dput(fdentry);
- pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- RETURN(rc);
- }
-
- oa = obdo_alloc();
- if (oa == NULL)
- RETURN(-ENOMEM);
-
- oa->o_id = handle->lgh_id.lgl_oid;
- oa->o_gr = handle->lgh_id.lgl_ogr;
- oa->o_generation = handle->lgh_id.lgl_ogen;
- oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP | OBD_MD_FLGENER;
-
- rc = mgs_llog_lvfs_close(handle);
- if (rc)
- GOTO(out, rc);
-
- rc = obd_destroy(handle->lgh_ctxt->loc_exp, oa, NULL, NULL);
- out:
- obdo_free(oa);
- RETURN(rc);
-}
-
-/* reads the catalog list */
-int llog_get_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
- char *name, int count, struct llog_catid *idarray)
-{
- struct lvfs_run_ctxt saved;
- struct l_file *file;
- int rc;
- int size = sizeof(*idarray) * count;
- loff_t off = 0;
-
- if (!count) {
- CERROR("Empty catalog?\n");
- RETURN(0);
- }
-
- push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- file = filp_open(name, O_RDWR | O_CREAT | O_LARGEFILE, 0700);
- if (!file || IS_ERR(file)) {
- rc = PTR_ERR(file);
- CERROR("OBD filter: cannot open/create %s: rc = %d\n",
- name, rc);
- GOTO(out, rc);
- }
-
- if (!S_ISREG(file->f_dentry->d_inode->i_mode)) {
- CERROR("%s is not a regular file!: mode = %o\n", name,
- file->f_dentry->d_inode->i_mode);
- GOTO(out, rc = -ENOENT);
- }
-
- rc = fsfilt_read_record(disk_obd, file, idarray, size, &off);
- if (rc) {
- CDEBUG(D_INODE,"OBD filter: error reading %s: rc %d\n",
- name, rc);
- GOTO(out, rc);
- }
-
- out:
- pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- if (file && !IS_ERR(file))
- rc = filp_close(file, 0);
- RETURN(rc);
-}
-EXPORT_SYMBOL(llog_get_cat_list);
-
-/* writes the cat list */
-int llog_put_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
- char *name, int count, struct llog_catid *idarray)
-{
- struct lvfs_run_ctxt saved;
- struct l_file *file;
- int rc;
- int size = sizeof(*idarray) * count;
- loff_t off = 0;
-
- if (!count) {
- CERROR("Empty catalog?\n");
- RETURN(0);
- }
-
- push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- file = filp_open(name, O_RDWR | O_CREAT | O_LARGEFILE, 0700);
- if (!file || IS_ERR(file)) {
- rc = PTR_ERR(file);
- CERROR("OBD filter: cannot open/create %s: rc = %d\n",
- name, rc);
- GOTO(out, rc);
- }
-
- if (!S_ISREG(file->f_dentry->d_inode->i_mode)) {
- CERROR("%s is not a regular file!: mode = %o\n", name,
- file->f_dentry->d_inode->i_mode);
- GOTO(out, rc = -ENOENT);
- }
-
- rc = fsfilt_write_record(disk_obd, file, idarray, size, &off, 1);
- if (rc) {
- CDEBUG(D_INODE,"OBD filter: error reading %s: rc %d\n",
- name, rc);
- GOTO(out, rc);
- }
-
- out:
- pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- if (file && !IS_ERR(file))
- rc = filp_close(file, 0);
- RETURN(rc);
-}
-
-struct llog_operations mgs_llog_lvfs_ops = {
- lop_create: mgs_llog_lvfs_create,
- lop_read_header: mgs_llog_lvfs_read_header,
- lop_write_rec: llog_lvfs_write_rec,
- lop_next_block: llog_lvfs_next_block,
- lop_destroy: llog_lvfs_destroy,
- lop_close: llog_lvfs_close,
- // lop_cancel: llog_lvfs_cancel,
-};
-
-EXPORT_SYMBOL(mgs_llog_lvfs_ops);
-
-#else /* !__KERNEL__ */
-
-static int mgs_llog_lvfs_read_header(struct llog_handle *handle)
-{
- LBUG();
- return 0;
-}
-
-static int mgs_llog_lvfs_write_rec(struct llog_handle *loghandle,
- struct llog_rec_hdr *rec,
- struct llog_cookie *reccookie, int cookiecount,
- void *buf, int idx)
-{
- LBUG();
- return 0;
-}
-
-static int mgs_llog_lvfs_next_block(struct llog_handle *loghandle, int *cur_idx,
- int next_idx, __u64 *cur_offset, void *buf,
- int len)
-{
- LBUG();
- return 0;
-}
-
-static int mgs_llog_lvfs_create(struct llog_ctxt *ctxt, struct llog_handle **res,
- struct llog_logid *logid, char *fsname, char *name)
-{
- LBUG();
- return 0;
-}
-
-static int mgs_llog_lvfs_close(struct llog_handle *handle)
-{
- LBUG();
- return 0;
-}
-
-static int mgs_llog_lvfs_destroy(struct llog_handle *handle)
-{
- LBUG();
- return 0;
-}
-
-int mgs_llog_get_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
- char *name, int count, struct llog_catid *idarray)
-{
- LBUG();
- return 0;
-}
-
-int mgs_llog_put_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
- char *name, int count, struct llog_catid *idarray)
-{
- LBUG();
- return 0;
-}
-
-struct llog_operations mgs_llog_lvfs_ops = {
- lop_write_rec: llog_lvfs_ops.lop_write_rec,
- lop_next_block: llog_lvfs_ops.lop_next_block,
- lop_read_header: llog_lvfs_ops.lop_read_header,
- lop_create: mgs_llog_lvfs_create,
- lop_destroy: mgs_llog_lvfs_destroy,
- lop_close: mgs_llog_lvfs_close,
-// lop_cancel: mgs_llog_lvfs_cancel,
-};
-#endif