int sl_fcmh_checkacls(struct fidc_membh *f, struct pscfs_req *pfr, const struct pscfs_creds *pcrp, int accmode) { int locked, rv; acl_t a; a = slc_acl_get_fcmh(pfr, pcrp, f); if (a == NULL) { int rc; #ifdef SLOPT_POSIX_ACLS_REVERT locked = FCMH_RLOCK(f); rc = checkcreds(&f->fcmh_sstb, pcrp, accmode); FCMH_URLOCK(f, locked); #else rc = EACCES; #endif return (rc); } locked = FCMH_RLOCK(f); rv = sl_checkacls(a, &f->fcmh_sstb, pcrp, accmode); FCMH_URLOCK(f, locked); acl_free(a); return (rv); }
int mdsio_fcmh_refreshattr(struct fidc_membh *f, struct srt_stat *out_sstb) { int locked, rc, vfsid; pthread_t pthr; pthr = pthread_self(); locked = FCMH_RLOCK(f); fcmh_wait_locked(f, (f->fcmh_flags & FCMH_BUSY) && f->fcmh_owner != pthr); rc = slfid_to_vfsid(fcmh_2_fid(f), &vfsid); psc_assert(rc == 0); rc = mdsio_getattr(vfsid, fcmh_2_mfid(f), fcmh_2_mfh(f), &rootcreds, &f->fcmh_sstb); if (out_sstb) *out_sstb = f->fcmh_sstb; FCMH_URLOCK(f, locked); return (rc); }
/* * If the generation number changes, we assume a full truncation has * happened. We need to open a new backing file and attach it to the * fcmh. */ int sli_fcmh_reopen(struct fidc_membh *f, slfgen_t fgen) { int rc = 0; FCMH_LOCK_ENSURE(f); OPSTAT_INCR("reopen"); if (fgen == FGEN_ANY) { OPSTAT_INCR("generation-bogus"); return (EBADF); } if (fgen < fcmh_2_gen(f)) { OPSTAT_INCR("generation-stale"); return (ESTALE); } /* * If our generation number is still unknown try to set it here. */ if (fcmh_2_gen(f) == FGEN_ANY && fgen != FGEN_ANY) { OPSTAT_INCR("generation-fix"); fcmh_2_gen(f) = fgen; } if (fgen > fcmh_2_gen(f)) { struct sl_fidgen oldfg; char fidfn[PATH_MAX]; DEBUG_FCMH(PLL_DIAG, f, "reopening new backing file"); OPSTAT_INCR("slvr-remove-reopen"); slvr_remove_all(f); /* * It's possible the pruning of all slivers and bmaps * ended up fcmh_op_done() our fcmh so ensure it is * locked upon finishing. */ FCMH_RLOCK(f); /* * Need to reopen the backing file and possibly remove * the old one. */ if (f->fcmh_flags & FCMH_IOD_BACKFILE) { if (close(fcmh_2_fd(f)) == -1) { OPSTAT_INCR("close-fail"); DEBUG_FCMH(PLL_ERROR, f, "reopen/close errno=%d", errno); } else { OPSTAT_INCR("close-succeed"); } fcmh_2_fd(f) = -1; psc_rlim_adj(RLIMIT_NOFILE, -1); f->fcmh_flags &= ~FCMH_IOD_BACKFILE; } oldfg.fg_fid = fcmh_2_fid(f); oldfg.fg_gen = fcmh_2_gen(f); fcmh_2_gen(f) = fgen; rc = sli_open_backing_file(f); /* Notify upper layers that open() has failed. */ if (!rc) f->fcmh_flags |= FCMH_IOD_BACKFILE; /* Do some upfront garbage collection. */ sli_fg_makepath(&oldfg, fidfn); errno = 0; unlink(fidfn); DEBUG_FCMH(PLL_INFO, f, "upfront unlink(), errno=%d", errno); } else if (!(f->fcmh_flags & FCMH_IOD_BACKFILE)) { rc = sli_open_backing_file(f); if (!rc) f->fcmh_flags |= FCMH_IOD_BACKFILE; OPSTAT_INCR("generation-same"); } return (rc); }