flush,
cap->mseq,
cap_epoch_barrier);
- m->caller_uid = in->cap_dirtier_uid;
- m->caller_gid = in->cap_dirtier_gid;
+ /*
+ * Since the setattr will check the cephx mds auth access before
+ * buffering the changes, so it makes no sense any more to let
+ * the cap update to check the access in MDS again.
+ *
+ * For new clients with old MDSs that doesn't support
+ * CEPHFS_FEATURE_MDS_AUTH_CAPS_CHECK we will force the session
+ * to be readonly if root_squash is enabled as a workaround.
+ */
+ m->caller_uid = -1;
+ m->caller_gid = -1;
m->head.issue_seq = cap->issue_seq;
m->set_tid(flush_tid);
capsnap.btime = in->btime;
capsnap.xattrs = in->xattrs;
capsnap.xattr_version = in->xattr_version;
- capsnap.cap_dirtier_uid = in->cap_dirtier_uid;
- capsnap.cap_dirtier_gid = in->cap_dirtier_gid;
if (used & CEPH_CAP_FILE_WR) {
ldout(cct, 10) << __func__ << " WR used on " << *in << dendl;
capsnap.change_attr = in->change_attr;
capsnap.dirty |= in->caps_dirty();
- /* Only reset it if it wasn't set before */
- if (capsnap.cap_dirtier_uid == -1) {
- capsnap.cap_dirtier_uid = in->cap_dirtier_uid;
- capsnap.cap_dirtier_gid = in->cap_dirtier_gid;
- }
-
if (capsnap.dirty & CEPH_CAP_FILE_WR) {
capsnap.inline_data = in->inline_data;
capsnap.inline_version = in->inline_version;
auto m = make_message<MClientCaps>(CEPH_CAP_OP_FLUSHSNAP,
in->ino, in->snaprealm->ino, 0,
in->auth_cap->mseq, cap_epoch_barrier);
- m->caller_uid = capsnap.cap_dirtier_uid;
- m->caller_gid = capsnap.cap_dirtier_gid;
+ /*
+ * Since the setattr will check the cephx mds auth access before
+ * buffering the changes, so it makes no sense any more to let
+ * the cap update to check the access in MDS again.
+ */
+ m->caller_uid = -1;
+ m->caller_gid = -1;
m->set_client_tid(capsnap.flush_tid);
m->head.snap_follows = follows;
sync_cond.notify_all();
}
- if (!dirty) {
- in->cap_dirtier_uid = -1;
- in->cap_dirtier_gid = -1;
- }
-
if (!cleaned) {
ldout(cct, 10) << " tid " << m->get_client_tid() << " != any cap bit tids" << dendl;
} else {
memset(&args, 0, sizeof(args));
- // make the change locally?
- if ((in->cap_dirtier_uid >= 0 && perms.uid() != in->cap_dirtier_uid) ||
- (in->cap_dirtier_gid >= 0 && perms.gid() != in->cap_dirtier_gid)) {
- ldout(cct, 10) << __func__ << " caller " << perms.uid() << ":" << perms.gid()
- << " != cap dirtier " << in->cap_dirtier_uid << ":"
- << in->cap_dirtier_gid << ", forcing sync setattr"
- << dendl;
- /*
- * This works because we implicitly flush the caps as part of the
- * request, so the cap update check will happen with the writeback
- * cap context, and then the setattr check will happen with the
- * caller's context.
- *
- * In reality this pattern is likely pretty rare (different users
- * setattr'ing the same file). If that turns out not to be the
- * case later, we can build a more complex pipelined cap writeback
- * infrastructure...
- */
- mask |= CEPH_SETATTR_CTIME;
- }
-
bool do_sync = true;
int res;
{
if (!mask) {
// caller just needs us to bump the ctime
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
if (issued & CEPH_CAP_AUTH_EXCL)
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
else if (issued & CEPH_CAP_FILE_EXCL)
if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->uid = stx->stx_uid;
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_UID;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->gid = stx->stx_gid;
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_GID;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->mode = (in->mode & ~07777) | (stx->stx_mode & 07777);
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_MODE;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->btime = utime_t(stx->stx_btime);
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_BTIME;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->fscrypt_auth = *aux;
in->mark_caps_dirty(CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_FSCRYPT_AUTH;
stx->stx_size >= in->size) {
if (stx->stx_size > in->size) {
in->size = in->reported_size = stx->stx_size;
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~(CEPH_SETATTR_SIZE);
mask |= CEPH_SETATTR_MTIME;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->fscrypt_file = *aux;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~CEPH_SETATTR_FSCRYPT_FILE;
if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
in->mtime = utime_t(stx->stx_mtime);
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->time_warp_seq++;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~CEPH_SETATTR_MTIME;
utime_t(stx->stx_mtime) > in->mtime) {
in->mtime = utime_t(stx->stx_mtime);
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->mark_caps_dirty(CEPH_CAP_FILE_WR);
mask &= ~CEPH_SETATTR_MTIME;
} else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) ||
if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
in->atime = utime_t(stx->stx_atime);
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->time_warp_seq++;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~CEPH_SETATTR_ATIME;
utime_t(stx->stx_atime) > in->atime) {
in->atime = utime_t(stx->stx_atime);
in->ctime = ceph_clock_now();
- in->cap_dirtier_uid = perms.uid();
- in->cap_dirtier_gid = perms.gid();
in->mark_caps_dirty(CEPH_CAP_FILE_WR);
mask &= ~CEPH_SETATTR_ATIME;
} else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) ||