struct psc_memnode * psc_memnode_get(void) { struct psc_memnode *pmn, **pmnv; int memnid, rc; pmn = pthread_getspecific(psc_memnodes_key); if (pmn) return (pmn); memnid = psc_memnode_getid(); spinlock(&psc_memnodes_lock); if (psc_dynarray_ensurelen(&psc_memnodes, memnid + 1) == -1) psc_fatalx("ensurelen"); pmnv = psc_dynarray_get_mutable(&psc_memnodes); pmn = pmnv[memnid]; if (pmn == NULL) { pmn = psc_alloc(sizeof(*pmn), PAF_NOLOG); INIT_SPINLOCK(&pmn->pmn_lock); psc_dynarray_init(&pmn->pmn_keys); rc = pthread_setspecific(psc_memnodes_key, pmn); if (rc) psc_fatalx("pthread_setspecific: %s", strerror(rc)); psc_dynarray_setpos(&psc_memnodes, memnid, pmn); } freelock(&psc_memnodes_lock); return (pmn); }
/* * Release memory associated with a dynamic array. * @pda: dynamic array to access. * @pos: item index. */ void psc_dynarray_free(struct psc_dynarray *pda) { int flags = 0; if (pda->pda_flags & PDAF_NOLOG) flags |= PAF_NOLOG; psc_free(pda->pda_items, flags); psc_dynarray_init(pda); }
void parseopts(int argc, char **argv) { int c; /* initialize default option values */ psc_dynarray_init(&opts.exclude); psc_dynarray_init(&opts.files); psc_dynarray_init(&opts.filter); psc_dynarray_init(&opts.include); opts.progress = 1; opts.psync_path = "psync"; opts.rsh = "ssh " "-oControlPath=none " "-oCompression=no " "-oKbdInteractiveAuthentication=no " "-oNumberOfPasswordPrompts=1"; opts.streams = getnstreams(getnprocessors()); while ((c = getopt_long(argc, argv, "0468aB:bCcDdEEe:f:gHhIiKkLlmN:nOoPpqRrST:tuVvWxyz", longopts, NULL)) != -1) { switch (c) { case '0': opts.from0 = 1; break; case '4': opts.ipv4 = 1; break; case '6': opts.ipv6 = 1; break; case '8': opts._8_bit_output = 1; break; case 'a': opts.devices = 1; opts.group = 1; opts.links = 1; opts.owner = 1; opts.perms = 1; opts.recursive = 1; opts.specials = 1; opts.times = 1; break; case 'B': if (!parsesize(&opts.block_size, optarg, 1)) err(1, "-B %s", optarg); break; case 'b': opts.backup = 1; break; case 'C': opts.cvs_exclude = 1; break; case 'c': opts.checksum = 1; break; case 'D': opts.devices = 1; opts.specials = 1; break; case 'd': opts.dirs = 1; break; case 'E': opts.extended_attributes = 1; break; case 'e': opts.rsh = optarg; break; case 'f': push_filter(&opts.filter, optarg, FPT_INCL); break; case 'g': opts.group = 1; break; case 'H': opts.hard_links = 1; break; case 'h': opts.human_readable = 1; break; case 'I': opts.ignore_times = 1; break; case 'i': opts.itemize_changes = 1; break; case 'K': opts.keep_dirlinks = 1; break; case 'k': opts.copy_dirlinks = 1; break; case 'L': opts.copy_links = 1; break; case 'l': opts.links = 1; break; case 'm': opts.prune_empty_dirs = 1; break; case 'N': if (!parsenum(&opts.streams, optarg, 0, MAX_STREAMS)) err(1, "streams: %s", optarg); break; case 'n': opts.dry_run = 1; break; case 'O': opts.omit_dir_times = 1; break; case 'o': opts.owner = 1; break; case 'P': opts.progress = 1; opts.partial = 1; break; case 'p': opts.perms = 1; break; case 'q': opts.quiet = 1; break; case 'R': opts.relative = 1; break; case 'r': opts.recursive = 1; break; case 'S': opts.sparse = 1; break; case 'T': opts.temp_dir = optarg; break; case 't': opts.times = 1; break; case 'u': opts.update = 1; break; case 'V': fprintf(stderr, "psync version %d\n", PSYNC_VERSION); exit(0); break; case 'v': opts.verbose = 1; break; case 'W': opts.whole_file = 1; break; case 'x': opts.one_file_system = 1; break; case 'y': opts.fuzzy = 1; break; case 'z': opts.compress = 1; break; case OPT_ADDRESS: opts.address = optarg; break; case OPT_BWLIMIT: if (!parsesize(&opts.bwlimit, optarg, 1024)) err(1, "--bwlimit=%s", optarg); break; case OPT_CHMOD: opts.chmod = optarg; break; case OPT_COMPARE_DEST: opts.compare_dest = optarg; break; case OPT_COMPRESS_LEVEL: if (!parsenum(&opts.compress_level, optarg, 0, 10)) err(1, "--compress-level=%s", optarg); break; case OPT_COPY_DEST: opts.copy_dest = optarg; break; case OPT_EXCLUDE: push_filter(&opts.filter, optarg, FPT_EXCL); break; case OPT_EXCLUDE_FROM: pushfile(&opts.filter, optarg, push_filter, FPT_EXCL); break; case OPT_FILES_FROM: pushfile(&opts.files, optarg, push_files_from, FPT_INCL); break; case OPT_INCLUDE: push_filter(&opts.filter, optarg, FPT_INCL); break; case OPT_INCLUDE_FROM: pushfile(&opts.filter, optarg, push_filter, FPT_INCL); break; case OPT_LINK_DEST: opts.link_dest = optarg; break; case OPT_LOG_FILE: opts.log_file = optarg; break; case OPT_LOG_FILE_FORMAT: opts.log_file_format = optarg; break; case OPT_MAX_DELETE: if (!parsenum(&opts.max_delete, optarg, 0, INT_MAX)) err(1, "--max-delete=%s", optarg); break; case OPT_MAX_SIZE: if (!parsesize(&opts.max_size, optarg, 1)) err(1, "--max-size=%s", optarg); break; case OPT_MIN_SIZE: if (!parsesize(&opts.min_size, optarg, 1)) err(1, "--min-size=%s", optarg); break; case OPT_MODIFY_WINDOW: if (!parsenum(&opts.modify_window, optarg, 0, INT_MAX)) err(1, "--modify-window=%s", optarg); break; case OPT_ONLY_WRITE_BATCH:opts.write_batch = optarg; break; case OPT_OUT_FORMAT: opts.out_format = optarg; break; case OPT_PORT: if (!parsenum(&opts.port, optarg, 0, 65535)) err(1, "--port=%s", optarg); break; case OPT_PARTIAL_DIR: opts.partial_dir = optarg; break; case OPT_PASSWORD_FILE: opts.password_file = optarg; break; case OPT_PSYNC_PATH: opts.psync_path = optarg; break; case OPT_READ_BATCH: opts.read_batch = optarg; break; case OPT_SOCKOPTS: opts.sockopts = optarg; break; case OPT_SUFFIX: opts.suffix = optarg; break; case OPT_TIMEOUT: if (!parsenum(&opts.timeout, optarg, 0, INT_MAX)) err(1, "--timeout=%s", optarg); break; case OPT_WRITE_BATCH: opts.write_batch = optarg; break; /* psync specific options */ case OPT_DSTDIR: opts.dstdir = optarg; break; case OPT_PUPPET: if (!parsenum(&opts.puppet, optarg, 0, 1000000)) err(1, "--PUPPET=%s", optarg); break; case 0: break; default: warn("invalid option: -%c", c); usage(); } } }
int slm_fcmh_ctor(struct fidc_membh *f, __unusedx int flags) { struct fcmh_mds_info *fmi; struct mio_fh *ino_mfh; struct slm_inoh *ih; mio_fid_t ino_mfid; int rc, vfsid; DEBUG_FCMH(PLL_DIAG, f, "ctor"); rc = slfid_to_vfsid(fcmh_2_fid(f), &vfsid); if (rc) { DEBUG_FCMH(PLL_WARN, f, "invalid file system ID; " "rc=%d", rc); return (rc); } fmi = fcmh_2_fmi(f); memset(fmi, 0, sizeof(*fmi)); rc = mdsio_lookup_slfid(vfsid, fcmh_2_fid(f), &rootcreds, &f->fcmh_sstb, &fcmh_2_mfid(f)); if (rc) { fmi->fmi_ctor_rc = rc; DEBUG_FCMH(PLL_WARN, f, "mdsio_lookup_slfid failed; " "fid="SLPRI_FID" rc=%d", fcmh_2_fid(f), rc); return (rc); } ih = &fmi->fmi_inodeh; ih->inoh_flags = INOH_INO_NOTLOADED; ino_mfid = fcmh_2_mfid(f); ino_mfh = fcmh_2_mfhp(f); if (fcmh_isdir(f)) { mio_fid_t pmfid; char fn[24]; rc = mdsio_opendir(vfsid, fcmh_2_mfid(f), &rootcreds, NULL, &fcmh_2_mfh(f)); if (rc) { DEBUG_FCMH(PLL_WARN, f, "mdsio_opendir failed; " "mio_fid=%"PRIx64" rc=%d", fcmh_2_mfid(f), rc); return (rc); } snprintf(fn, sizeof(fn), "%016"PRIx64".ino", fcmh_2_fid(f)); pmfid = mdsio_getfidlinkdir(fcmh_2_fid(f)); rc = mdsio_lookup(vfsid, pmfid, fn, &fcmh_2_dino_mfid(f), &rootcreds, NULL); if (rc == ENOENT) { struct slm_inox_od inox; rc = mdsio_opencreatef(vfsid, pmfid, &rootcreds, O_CREAT | O_EXCL | O_RDWR, MDSIO_OPENCRF_NOLINK, 0644, fn, &fcmh_2_dino_mfid(f), NULL, &fcmh_2_dino_mfh(f), NULL, NULL, 0); psc_assert(rc == 0); INOH_LOCK(ih); rc = mds_inode_write(vfsid, ih, NULL, NULL); psc_assert(rc == 0); memset(&inox, 0, sizeof(inox)); ih->inoh_extras = &inox; rc = mds_inox_write(vfsid, ih, NULL, NULL); ih->inoh_extras = NULL; INOH_ULOCK(ih); psc_assert(rc == 0); mdsio_release(vfsid, &rootcreds, fcmh_2_dino_mfh(f)); } else if (rc) { fmi->fmi_ctor_rc = rc; DEBUG_FCMH(PLL_WARN, f, "mdsio_lookup failed; rc=%d", rc); return (rc); } ino_mfid = fcmh_2_dino_mfid(f); ino_mfh = fcmh_2_dino_mfhp(f); } if (fcmh_isreg(f)) psc_dynarray_init(&fmi->fmi_ptrunc_clients); if (fcmh_isdir(f) || fcmh_isreg(f)) { /* * We shouldn't need O_LARGEFILE because SLASH2 * metafiles are small. * * I created a file with size of 8070450532247928832 * using dd by seeking to a large offset and writing one * byte. Somehow, the ZFS size becomes 5119601018368. * Without O_LARGEFILE, I got EOVERFLOW (75) here. The * SLASH2 size is correct though. */ rc = mdsio_opencreate(vfsid, ino_mfid, &rootcreds, O_RDWR, 0, NULL, NULL, NULL, &ino_mfh->fh, NULL, NULL, 0); if (rc == 0) { rc = mds_inode_read(&fmi->fmi_inodeh); if (rc) DEBUG_FCMH(PLL_WARN, f, "could not load inode; " "mfid=%"PRIx64" rc=%d", ino_mfid, rc); } else { fmi->fmi_ctor_rc = rc; DEBUG_FCMH(PLL_WARN, f, "mdsio_opencreate failed; " "mfid=%"PRIx64" rc=%d", ino_mfid, rc); } } else DEBUG_FCMH(PLL_DIAG, f, "special file, no zfs obj"); return (rc); }