int idx;
int fd;
int rc;
+ int rc2;
if (stat(fname, &stbuf) < 0) {
fprintf(stderr, "%s: cannot stat file '%s': %s.\n",
else
fprintf(stderr,
"%s: '%s' llapi_lease_get_ext resync failed: %s.\n",
- progname, fname, strerror(errno));
+ progname, fname, strerror(-rc));
goto free_layout;
}
rc = llapi_mirror_resync_many(fd, layout, comp_array, comp_size,
start, end);
if (rc < 0)
- fprintf(stderr, "%s: '%s' llapi_mirror_resync_many: %d.\n",
- progname, fname, rc);
+ fprintf(stderr, "%s: '%s' llapi_mirror_resync_many: %s.\n",
+ progname, fname, strerror(-rc));
- /* prepare ioc for lease put */
+ /* need to do the lease unlock even resync fails */
ioc->lil_mode = LL_LEASE_UNLCK;
ioc->lil_flags = LL_LEASE_RESYNC_DONE;
ioc->lil_count = 0;
}
}
- rc = llapi_lease_set(fd, ioc);
- if (rc <= 0) {
- if (rc == 0) /* lost lease lock */
- rc = -EBUSY;
- fprintf(stderr, "%s: resync file '%s' failed: %s.\n",
- progname, fname, strerror(errno));
- goto free_layout;
- }
+ rc2 = llapi_lease_set(fd, ioc);
/**
* llapi_lease_set returns lease mode when it request to unlock
- * the lease lock
+ * the lease lock.
*/
- rc = 0;
+ if (rc2 <= 0) {
+ /* rc2 == 0 means lost lease lock */
+ if (rc2 == 0 && rc == 0)
+ rc = -EBUSY;
+ fprintf(stderr, "%s: resync file '%s' failed: %s.\n",
+ progname, fname,
+ rc2 == 0 ? "lost lease lock" : strerror(-rc2));
+ }
free_layout:
llapi_layout_free(layout);
uint64_t pos = start;
int i;
int rc;
+ int rc2 = 0;
rc = posix_memalign(&buf, page_size, buflen);
if (rc)
* meanings.
*/
comp_array[i].lrc_synced = true;
+ llapi_error(LLAPI_MSG_ERROR, written,
+ "component %u not synced\n",
+ comp_array[i].lrc_id);
+ if (rc2 == 0)
+ rc2 = (int)written;
continue;
}
assert(written == to_write2);
free(buf);
if (rc < 0) {
+ /* fatal error happens */
for (i = 0; i < comp_size; i++)
comp_array[i].lrc_synced = false;
return rc;
}
+ /**
+ * no fatal error happens, each lrc_synced tells whether the component
+ * has been resync successfully (note: we'd reverse the value to
+ * reflect its true meaning.
+ */
for (i = 0; i < comp_size; i++) {
comp_array[i].lrc_synced = !comp_array[i].lrc_synced;
if (comp_array[i].lrc_synced && pos & (page_size - 1)) {
}
}
- /* partially successful is successful */
- return 0;
+ /**
+ * returns the first error code for partially successful resync if
+ * possible.
+ */
+ return rc2;
}
enum llapi_layout_comp_sanity_error {