PERFORCE change 125250 for review
Sonja Milicic
smilicic at FreeBSD.org
Thu Aug 16 17:03:36 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125250
Change 125250 by smilicic at tanarri_marilith on 2007/08/17 00:02:48
added snapshot creation, rollback to snapshot, snapshot I/O
fixed a bug with reading from disk
fixed style errors in geom_log_so.c and glog.h
Affected files ...
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/geom_log_so.c#4 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog.c#9 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog.h#4 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_alloctable.c#2 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_alloctable.h#2 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_fileops.c#4 edit
.. //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_fileops.h#4 edit
Differences ...
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/geom_log_so.c#4 (text+ko) ====
@@ -6,10 +6,10 @@
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
+ * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -51,57 +51,43 @@
/*static void log_main(struct gctl_req *req, unsigned flags);*/
struct g_command class_commands[] = {
- { "stop", G_FLAG_VERBOSE, NULL,
- {
- { 'f', "force", NULL, G_TYPE_NONE },
- G_OPT_SENTINEL
- },
- "[-fv] prov ..."
- },
- { "start", G_FLAG_VERBOSE, NULL,
- {
- G_OPT_SENTINEL
- },
- "[-v] prov file"
- },
- { "commit", G_FLAG_VERBOSE, NULL,
- {
- G_OPT_SENTINEL
- },
- "[-v] prov ..."
- },
- { "rollback", G_FLAG_VERBOSE, NULL,
- {
- G_OPT_SENTINEL
- },
- "[-v] prov ..."
- },
- { "dump", G_FLAG_VERBOSE, NULL,
- {
- { 'n', "nidx", NULL, G_TYPE_NUMBER },
- G_OPT_SENTINEL
- },
- "[-n nidx] prov ..."
- },
- G_CMD_SENTINEL
-};
-
-
-/*static void
-log_main(struct gctl_req *req, unsigned flags)
-{
- const char *name;
- int verbose = 0;
-
- if ((flags & G_FLAG_VERBOSE) != 0)
- verbose = 1;
-
- name = gctl_get_asciiparam(req, "verb");
- if (name == NULL) {
- gctl_error(req, "Verb missing.", NULL);
- return;
- }
-
-}*/
-
-
+ { "stop", G_FLAG_VERBOSE, NULL,
+ {
+ { 'f', "force", NULL, G_TYPE_NONE },
+ G_OPT_SENTINEL
+ },
+ "[-fv] provider ..."
+ },
+ { "start", G_FLAG_VERBOSE, NULL,
+ {
+ G_OPT_SENTINEL
+ },
+ "[-v] provider filename"
+ },
+ { "commit", G_FLAG_VERBOSE, NULL,
+ {
+ G_OPT_SENTINEL
+ },
+ "[-v] provider ..."
+ },
+ { "rollback", G_FLAG_VERBOSE, NULL,
+ {
+ G_OPT_SENTINEL
+ },
+ "[-v] provider filename ..."
+ },
+ { "snapshot", G_FLAG_VERBOSE, NULL,
+ {
+ G_OPT_SENTINEL
+ },
+ "[-v] provider filename ..."
+ },
+ { "dump", G_FLAG_VERBOSE, NULL,
+ {
+ { 'n', "nidx", NULL, G_TYPE_NUMBER },
+ G_OPT_SENTINEL
+ },
+ "[-n compartment] provider ..."
+ },
+ G_CMD_SENTINEL
+};
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog.c#9 (text+ko) ====
@@ -58,6 +58,7 @@
static enum gctl_verb g_log_verb_id(const char* verb);
static struct g_geom * g_log_create_geom(const char *prov, const char *file,
struct g_class *mp, int *err);
+static int g_log_load_logfile(struct g_log_softc *sc, const char *file);
static int g_log_destroy_geom(struct gctl_req *req __unused,
struct g_class *mp __unused, struct g_geom *gp);
static void g_log_start(struct bio *bp);
@@ -74,6 +75,7 @@
static void g_log_read(struct bio *bp);
static void g_log_rollback(struct g_log_softc *sc);
static void g_log_commit(struct g_log_softc *sc);
+static void g_log_snapshot(struct g_log_softc *sc);
static void g_log_dumpconf(struct sbuf *sb, const char *indent,
struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp);
static void g_log_ctl_destroy(struct gctl_req *req, struct g_class *mp);
@@ -114,7 +116,7 @@
/* gctl verb IDs */
enum gctl_verb { GCTL_INVALID, GCTL_COMMIT, GCTL_ROLLBACK, GCTL_START,
- GCTL_STOP, GCTL_DUMP};
+ GCTL_STOP, GCTL_DUMP, GCTL_SNAPSHOT};
static void
g_log_init(struct g_class *mp __unused)
@@ -156,14 +158,13 @@
struct g_provider *pp_log, *pp_disk;
struct g_consumer *cp_disk;
struct g_log_softc *sc;
- struct g_log_header head;
int max_elements;
+
/*initialize softc*/
sc = malloc(sizeof(*sc), M_GLOG, M_WAITOK | M_ZERO);
/*create geom for log*/
gp = g_new_geomf(mp, "%s.log", prov);
-
gp->start = g_log_start;
gp->spoiled = g_log_orphan;
gp->orphan = g_log_orphan;
@@ -175,7 +176,6 @@
}
/* get provider and consumer for disk*/
- G_LOG_DEBUG(0, "Getting provider and consumer for disk");
if (strncmp(prov, "/dev/", strlen("/dev/")) == 0)
prov += strlen("/dev/");
pp_disk = g_provider_by_name(prov);
@@ -189,11 +189,11 @@
return (NULL);
}
g_error_provider(pp_disk, 0);
+ g_access(cp_disk, 1, 1, 0);
sc->sc_prov_disk = pp_disk;
sc->sc_cons_disk = cp_disk;
/*create provider for log*/
- G_LOG_DEBUG(0, "Creating provider for log");
pp_log = g_new_providerf(gp, "%s.log", prov);
pp_log->mediasize = pp_disk->mediasize;
pp_log->sectorsize = pp_disk->sectorsize;
@@ -201,67 +201,71 @@
sc->sc_prov_log = pp_log;
/*initialize alloc table*/
- G_LOG_DEBUG(0, "Initializing allocation table");
sc->sc_alloctable = malloc(sizeof(*sc->sc_alloctable), M_GLOG,
M_WAITOK | M_ZERO);
g_log_alloctable_init(sc, M_GLOG);
/*initialize request sublist*/
- G_LOG_DEBUG(0, "Initializing request sublist");
max_elements = (int)(MAXPHYS / sc->sc_prov_log->sectorsize);
sc->sc_req_sublist = malloc (max_elements * sizeof(
struct g_log_data), M_GLOG, M_WAITOK | M_ZERO);
sc->sc_req_sublist_size = 0;
+ /*load log file*/
+ if (g_log_load_logfile(sc, file) == 1) {
+ *err = 5;
+ return (NULL);
+ }
+ sc->sc_file_name = strdup(file, M_GLOG);
+
+ sc->sc_geom_log = gp;
+ gp->softc = sc;
+ G_LOG_DEBUG(0, "Created geom %s", gp->name);
+
+ /*initialize worker thread*/
+ if (g_log_event_sink_init(sc, &sc->sc_events, g_log_worker, "events")
+ != 0){
+ *err=4;
+ g_log_event_sink_destroy(&sc->sc_events);
+ return (NULL);
+ }
+ return gp;
+}
+
+/*load a log file*/
+static int
+g_log_load_logfile(struct g_log_softc *sc, const char *file)
+{
+ struct g_log_header head;
+
/*open file*/
- G_LOG_DEBUG(0, "Opening log file");
sc->sc_vn = g_log_open_file(file, FWRITE | FREAD | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR);
+ if (sc->sc_vn == NULL)
+ return(1);
/*see if the file can be used as a log file (has to be either empty or
*have geom log header), add header if the file's empty, exit with an
*error if file is neither empty nor has header
- */
- G_LOG_DEBUG(0, "Checking log file");
+ */
if (g_log_get_size(sc->sc_vn) > 0) {
- G_LOG_DEBUG(0, "Reading header");
g_log_read_data(sc->sc_vn, &head, sizeof(head), 0);
if (strcmp(head.text,"GEOM_LOG")!=0) {
- *err = 1;
- return (NULL);
+ g_log_close_file(sc->sc_vn, FWRITE | FREAD);
+ return(1);
}
/*warn if the log file was made with different version of glog*/
if (head.version != G_LOG_VERSION)
G_LOG_DEBUG(0, "Header version: %d\nCurrent version: %d"
, head.version, G_LOG_VERSION);
/*restore alloc table from file*/
- G_LOG_DEBUG(0, "Restoring alloctable from file");
sc->sc_curr_offset = sizeof(head);
g_log_alloctable_restore(sc, M_GLOG);
}
- else {
- G_LOG_DEBUG(0, "Writing header");
- G_LOG_DEBUG(0, "Log file empty, writing header.");
+ else { /*log file empty, write header*/
g_log_write_header(sc->sc_vn);
sc->sc_curr_offset = sizeof(head);
}
-
- if (sc->sc_vn == NULL) {
- *err = 5;
- return (NULL);
- }
- sc->sc_file_name = strdup(file, M_GLOG);
-
- sc->sc_geom_log = gp;
- gp->softc = sc;
- G_LOG_DEBUG(0, "Created geom %s", gp->name);
- /*initialize worker thread*/
- if (g_log_event_sink_init(sc, &sc->sc_events, g_log_worker, "events")
- != 0){
- *err=4;
- g_log_event_sink_destroy(&sc->sc_events);
- return (NULL);
- }
- return gp;
+ return(0);
}
/*initialize sink thread*/
@@ -392,10 +396,6 @@
break;
case GCTL_COMMIT:
if (*num_arg == 1) {
- /*printf("Are you sure (y/n)?");
- scanf("%c", &confirm);
- if (confirm != 'y')
- break;*/
prov = gctl_get_asciiparam(req, "arg0");
sc = g_log_find(mp, prov);
if (sc == NULL) {
@@ -409,17 +409,20 @@
gctl_error(req, "Wrong number of parameters.");
break;
case GCTL_ROLLBACK:
- if (*num_arg ==1){
- /*printf("Are you sure (y/n)?");
- scanf("%c", &confirm);
- if (confirm != 'y')
- break;*/
+ if (*num_arg >= 1){
prov = gctl_get_asciiparam(req, "arg0");
sc = g_log_find(mp, prov);
if (sc == NULL) {
G_LOG_DEBUG(0, "Geom not found.");
break;
}
+ if (*num_arg == 2) {
+ file = gctl_get_asciiparam(req, "arg1");
+ sc->sc_snapshot = strdup(file, M_GLOG);
+ }
+ else
+ file = NULL;
+
g_log_post_event(&sc->sc_events, GLOG_EVROLLBACK,
GLOG_FLAG_WAKEUP_SC, sc, 0);
} else
@@ -446,6 +449,18 @@
}
g_log_dump_alloctable(sc, *icp);
break;
+ case GCTL_SNAPSHOT:
+ prov = gctl_get_asciiparam(req, "arg0");
+ file = gctl_get_asciiparam(req, "arg1");
+ sc = g_log_find(mp, prov);
+ if (sc == NULL) {
+ G_LOG_DEBUG(0, "Geom not found.");
+ break;
+ }
+ sc->sc_snapshot = strdup(file, M_GLOG);
+ g_log_post_event(&sc->sc_events, GLOG_EVSNAPSHOT,
+ GLOG_FLAG_WAKEUP_SC, sc, 0);
+ break;
default:
gctl_error(req, "Unknown verb.");
break;
@@ -499,7 +514,7 @@
pp_log = sc->sc_prov_log;
pp_disk = sc->sc_prov_disk;
cp_disk = sc->sc_cons_disk;
-
+ g_access(cp_disk, -1, -1, 0);
if (pp_log != NULL && (pp_log->acr != 0 || pp_log->acw !=0 ||
pp_log->ace != 0)){
if (force)
@@ -633,13 +648,17 @@
es->worker_thread = NULL;
kthread_exit(0);
break;
+ case GLOG_EVSNAPSHOT:
+ g_log_snapshot(sc);
+ break;
default:
G_LOG_DEBUG(0, "unhandled event %d", ev->type);
}
free(ev,M_GLOG);
-sleep: tsleep(es, PRIBIO, "glogidle", 1000);
+sleep: tsleep(es, PRIBIO, "glogidle", hz);
}
-
+ G_LOG_DEBUG(0, "Worker died.");
+
}
/* adds event to event queue */
static int
@@ -738,11 +757,11 @@
{
struct g_log_softc *sc;
struct g_log_data *gd;
- int err, i, max_elements, offset_buf;
+ int i, max_elements, offset_buf;
sc = bp->bio_to->geom->softc;
KASSERT(sc != NULL, ("%s: softc is null", __func__));
-
+
/*clean up request sublist*/
free(sc->sc_req_sublist, M_GLOG);
max_elements = (int)(MAXPHYS / sc->sc_prov_log->sectorsize);
@@ -756,7 +775,7 @@
G_LOG_DEBUG(0, "Requested %jd, %jd", bp->bio_offset, bp->bio_length);
/*retrieve request sublist*/
- err = g_log_alloctable_get(sc, bp->bio_offset, (ssize_t)bp->bio_length);
+ g_log_alloctable_get(sc, bp->bio_offset, (ssize_t)bp->bio_length);
/*read requested data*/
for (i = 0; i < sc->sc_req_sublist_size; i++) {
@@ -799,50 +818,90 @@
int i, err;
KASSERT(sc != NULL, ("%s: sc is null!", __func__));
- G_LOG_DEBUG(0, "Starting commit...");
- g_topology_assert();
- err = g_access(sc->sc_cons_disk, 0, 1, 0);
- g_topology_unlock();
- if (err != 0) {
- G_LOG_DEBUG(0, "Error accessing provider %s", sc->sc_cons_disk->provider->name);
- return;
- }
+
/*write contents of all compartments to disk*/
for (i = 0; i < sc->sc_alloctable->tablesize; i++) {
te = &sc->sc_alloctable->table[i];
SLIST_FOREACH(ae, &te->allocq, linkage) {
if (ae->offset_log != -1) {
- data = malloc(ae->data_size * sizeof(char), M_GLOG, M_WAITOK | M_ZERO);
- G_LOG_DEBUG(0, "Committing %jd, %jd, %d", ae->offset_disk, ae->offset_log, ae->data_size);
+ data = malloc(ae->data_size * sizeof(char),
+ M_GLOG, M_WAITOK | M_ZERO);
+
/*get data from log file*/
- g_log_read_data(sc->sc_vn, (void*)data, ae->data_size, ae->offset_log);
+ g_log_read_data(sc->sc_vn, (void*)data,
+ ae->data_size, ae->offset_log);
/*write it to disk*/
- err = g_write_data(sc->sc_cons_disk, ae->offset_disk, data, ae->data_size);
- g_topology_lock();
- err = g_access(sc->sc_cons_disk, 0, -1, 0);
- G_LOG_DEBUG(0, "Write error %d", err);
+ err = g_write_data(sc->sc_cons_disk,
+ ae->offset_disk, data, ae->data_size);
free(data, M_GLOG);
}
}
}
+ /*reset log file and alloc table*/
+ g_log_rollback(sc);
}
/*drop the changes*/
static void
g_log_rollback(struct g_log_softc *sc)
{
- /*reset log file*/
- sc->sc_vn = g_log_empty_file(sc->sc_vn, sc->sc_file_name);
- g_log_write_header(sc->sc_vn);
- sc->sc_curr_offset = sizeof(struct g_log_header);
/*reset alloc table*/
g_log_alloctable_free(sc->sc_alloctable, M_GLOG);
g_log_alloctable_init(sc, M_GLOG);
+
+ if (sc->sc_snapshot != NULL) { /*load snapshot*/
+ g_log_close_file(sc->sc_vn, FREAD | FWRITE);
+ g_log_load_logfile(sc, sc->sc_snapshot);
+ sc->sc_snapshot=NULL;
+
+ }
+ else { /*reset log file*/
+ sc->sc_vn = g_log_empty_file(sc->sc_vn, sc->sc_file_name);
+ g_log_write_header(sc->sc_vn);
+ sc->sc_curr_offset = sizeof(struct g_log_header);
+ }
}
-
+/*create a snapshot*/
+static void
+g_log_snapshot(struct g_log_softc *sc)
+{
+ struct vnode *ss_vn;
+ struct g_log_header *head;
+ struct g_log_data *gd;
+ char *data;
+ size_t offset, filesize;
+
+ ss_vn = g_log_open_file(sc->sc_snapshot, FWRITE | O_CREAT | O_TRUNC, S_IWUSR);
+ head = malloc(sizeof(*head), M_GLOG, M_WAITOK | M_ZERO);
+ gd = malloc(sizeof(*gd), M_GLOG, M_WAITOK | M_ZERO);
+ offset = 0;
+ filesize = g_log_get_size(sc->sc_vn);
+ /*copy the contents of current log file to snapshot file*/
+ /*first, the header*/
+ g_log_read_data(sc->sc_vn, head, sizeof(*head), 0);
+ g_log_write_file(ss_vn, head, sizeof(*head), 0);
+ offset += sizeof(*head);
+ /*then data*/
+ while (offset < filesize) {
+ /*data header*/
+ g_log_read_data(sc->sc_vn, gd, sizeof(*gd), offset);
+ g_log_write_file(ss_vn, gd, sizeof(*gd), offset);
+ offset += sizeof(*gd);
+ /*data*/
+ data = malloc(gd->data_size, M_GLOG, M_WAITOK |
+ M_ZERO);
+ g_log_read_data(sc->sc_vn, (void *)data, gd->data_size, offset);
+ g_log_write_file(ss_vn, (void *)data, gd->data_size, offset);
+ free(data, M_GLOG);
+ offset += gd->data_size;
+ }
+ free(head, M_GLOG);
+ free(gd, M_GLOG);
+ g_log_close_file(ss_vn, FWRITE);
+}
static int
g_log_destroy_geom(struct gctl_req *req __unused, struct g_class *mp __unused,
struct g_geom *gp)
@@ -914,6 +973,8 @@
return GCTL_STOP;
else if (strcmp(verb, "dump") == 0)
return GCTL_DUMP;
+ else if (strcmp(verb, "snapshot") == 0)
+ return GCTL_SNAPSHOT;
else
return GCTL_INVALID;
};
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog.h#4 (text+ko) ====
@@ -35,40 +35,41 @@
#define DBG_NOTICE 15
struct g_log_event {
- unsigned short int type;
- unsigned short int flags;
+ unsigned short int type;
+ unsigned short int flags;
#define GLOG_EVCOMMIT 1
#define GLOG_EVROLLBACK 2
#define GLOG_EVREAD 3
#define GLOG_EVWRITE 4
#define GLOG_EVSTOP 5
-#define GLOG_FLAG_WAKEUP_SC 6
-
- void* data1;
- int data2;
- TAILQ_ENTRY(g_log_event) linkage;
+#define GLOG_EVSNAPSHOT 6
+#define GLOG_FLAG_WAKEUP_SC 7
+ void* data1;
+ int data2;
+ TAILQ_ENTRY(g_log_event) linkage;
};
struct g_log_event_sink {
- struct proc *worker_thread;
- struct g_log_softc *sc;
- TAILQ_HEAD(, g_log_event) eventq;
- struct mtx eventq_mtx;
- uint32_t flags;
+ struct proc *worker_thread;
+ struct g_log_softc *sc;
+ TAILQ_HEAD(, g_log_event) eventq;
+ struct mtx eventq_mtx;
+ uint32_t flags;
};
struct g_log_softc {
- struct g_geom *sc_geom_log;
- struct g_provider *sc_prov_log;
- struct g_provider *sc_prov_disk;
- struct g_consumer *sc_cons_disk;
- struct vnode *sc_vn;
- struct g_log_event_sink sc_events;
+ struct g_geom *sc_geom_log;
+ struct g_provider *sc_prov_log;
+ struct g_provider *sc_prov_disk;
+ struct g_consumer *sc_cons_disk;
+ struct vnode *sc_vn;
+ struct g_log_event_sink sc_events;
struct g_log_alloc_table *sc_alloctable;
struct g_log_data *sc_req_sublist;
size_t sc_req_sublist_size;
off_t sc_curr_offset;
char *sc_file_name;
+ char *sc_snapshot;
};
/*this is the structure that's written to the log file*/
@@ -78,8 +79,6 @@
size_t data_size;
};
-#endif /* _KERNEL */
-
/*a header that's written at the start of log file, so that geom log can
* recognize the file later*/
struct g_log_header {
@@ -87,4 +86,6 @@
int version;
};
+#endif /* _KERNEL */
+
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_alloctable.c#2 (text+ko) ====
@@ -106,7 +106,7 @@
ae->offset_disk = gd->offset_disk;
ae->offset_log = gd->offset_log;
ae->data_size = gd->data_size;
- sc->sc_curr_offset += gd->offset_log + gd->data_size; /*skip data*/
+ sc->sc_curr_offset += gd->offset_log + gd->data_size;
G_LOG_DEBUG(0, "Found element %jd %jd %d, adding, curr offset "
"%jd", ae->offset_disk, ae->offset_log, ae->data_size,
sc->sc_curr_offset);
@@ -127,7 +127,6 @@
struct g_log_alloc_element *aePrev, *aePrevTmp, *aeNext, *aeNextTmp;
off_t key, aePrevOriginalOffsetLog;
size_t overlap_size, aePrevOriginalSize;
- G_LOG_DEBUG(0, "Adding %jd %jd %d", ae->offset_disk, ae->offset_log, ae->data_size);
/*find the key - offset range where the new element belongs*/
key = (off_t) (ae->offset_disk / OFFSET_RANGE);
te = &at->table[key];
@@ -254,58 +253,48 @@
struct g_log_alloc_table_element *te;
struct g_log_alloc_element *ae, *tmpae;
struct g_log_data gd;
- G_LOG_DEBUG(0, "Key is %jd", key);
/*find the compartment*/
te = &sc->sc_alloctable->table[key];
/*if compartment is empty, exit*/
if ((te == NULL) || SLIST_EMPTY(&te->allocq))
return(1);
- G_LOG_DEBUG(0, "Finding first");
/*find the first element of the request and add it*/
ae = SLIST_FIRST(&te->allocq);
tmpae = ae;
while (ae->offset_disk <= offset) {
tmpae = ae;
ae = SLIST_NEXT(tmpae, linkage);
- G_LOG_DEBUG(0, "tmpae %jd %jd %d", tmpae->offset_disk, tmpae->offset_log, tmpae->data_size);
if (ae == NULL)
break;
- G_LOG_DEBUG(0, "ae %jd %jd %d", ae->offset_disk, ae->offset_log, ae->data_size);
}
ae = tmpae;
- G_LOG_DEBUG(0, "Found first");
gd.offset_disk = ae->offset_disk;
gd.offset_log = ae->offset_log;
gd.data_size = ae->data_size;
sc->sc_req_sublist[pos] = gd;
sc->sc_req_sublist_size++;
size = size + offset - ae->offset_disk - ae->data_size;
- G_LOG_DEBUG(0, "Adding rest");
- /*now keep adding until the request is complete (size is 0)*/
+
+ /*now keep adding until the request is complete (size is 0 or less)*/
while (size > 0) {
- G_LOG_DEBUG(0, "Size is %d", size);
pos++;
ae = SLIST_NEXT(ae, linkage);
if (ae == NULL){
/*part of requested sublist is in next compartment?*/
- G_LOG_DEBUG(0, "Recursion");
g_log_alloctable_get_rec(sc, 0, size, key+1, pos);
- G_LOG_DEBUG(0, "Recursion over");
}
else {
- G_LOG_DEBUG(0, "Adding %jd %d", ae->offset_disk, ae->data_size);
+ G_LOG_DEBUG(0, "Adding %jd %d", ae->offset_disk,
+ ae->data_size);
size -= ae->data_size;
gd.offset_disk = ae->offset_disk;
gd.offset_log = ae->offset_log;
gd.data_size = ae->data_size;
sc->sc_req_sublist[pos] = gd;
sc->sc_req_sublist_size++;
- G_LOG_DEBUG(0, "Added %jd %d", ae->offset_disk, ae->data_size);
- }
- G_LOG_DEBUG(0, "Done %d", size);
+ }
}
- G_LOG_DEBUG(0, "Added rest");
return (0);
}
/*free an alloc table*/
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_alloctable.h#2 (text+ko) ====
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_fileops.c#4 (text+ko) ====
@@ -182,29 +182,18 @@
int err, i;
KASSERT(sc != 0, ("%s: sc is null", __func__));
- G_LOG_DEBUG(0, "Reading element %jd, %jd, %d", gd->offset_disk, gd->offset_log, gd->data_size);
+ G_LOG_DEBUG(0, "Reading element %jd, %jd, %d", gd->offset_disk,
+ gd->offset_log, gd->data_size);
if (gd->offset_log == -1) {/*read from disk*/
- G_LOG_DEBUG(0, "Reading from disk %s", sc->sc_cons_disk->provider->name);
- g_topology_lock();
- err = g_access(sc->sc_cons_disk, 1, 0, 0);
- g_topology_unlock();
- if (err != 0) {
- G_LOG_DEBUG(0, "Error accessing provider %s", sc->sc_cons_disk->provider->name);
- return (err);
- }
-
tmp_buf = g_read_data(sc->sc_cons_disk,
gd->offset_disk, gd->data_size, &err);
- g_topology_lock();
- g_access(sc->sc_cons_disk, -1, 0, 0);
if (tmp_buf == NULL) {
- G_LOG_DEBUG(0, "ENOENT");
return (ENOENT);
}
}
else { /*read from log file*/
- G_LOG_DEBUG(0, "Reading from log");
- tmp_buf = malloc(gd->data_size * sizeof(char), type, M_WAITOK | M_ZERO);
+ tmp_buf = malloc(gd->data_size * sizeof(char), type, M_WAITOK |
+ M_ZERO);
g_log_read_data(sc->sc_vn, (void*)tmp_buf, gd->data_size,
gd->offset_log);
}
==== //depot/projects/soc2007/smilicic_glog/sys/geom/log/glog_fileops.h#4 (text+ko) ====
More information about the p4-projects
mailing list