bool kill_sguid = false;
int inode_drop = 0;
size_t auxsize = 0;
+ filepath path;
+ MetaRequest *req;
if (aux)
auxsize = aux->size();
mask |= CEPH_SETATTR_CTIME;
}
+ bool do_sync = true;
+ int res;
+ {
+ std::string path;
+ res = in->make_path_string(path);
+ if (res) {
+ ldout(cct, 20) << " absolute path: " << path << dendl;
+ if (path.length())
+ path = path.substr(1); // drop leading /
+ res = mds_check_access(path, perms, MAY_WRITE);
+ if (res) {
+ goto out;
+ }
+ do_sync = false;
+ }
+ }
+
if (!mask) {
// caller just needs us to bump the ctime
in->ctime = ceph_clock_now();
if (mask & CEPH_SETATTR_UID) {
ldout(cct,10) << "changing uid to " << stx->stx_uid << dendl;
- if (in->caps_issued_mask(CEPH_CAP_AUTH_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();
if (mask & CEPH_SETATTR_GID) {
ldout(cct,10) << "changing gid to " << stx->stx_gid << dendl;
- if (in->caps_issued_mask(CEPH_CAP_AUTH_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();
if (mask & CEPH_SETATTR_MODE) {
ldout(cct,10) << "changing mode to " << stx->stx_mode << dendl;
- if (in->caps_issued_mask(CEPH_CAP_AUTH_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();
} else {
mask &= ~CEPH_SETATTR_MODE;
}
- } else if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL) && S_ISREG(in->mode)) {
+ } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL) && S_ISREG(in->mode)) {
if (kill_sguid && (in->mode & (S_IXUSR|S_IXGRP|S_IXOTH))) {
in->mode &= ~(S_ISUID|S_ISGID);
} else {
if (mask & CEPH_SETATTR_BTIME) {
ldout(cct,10) << "changing btime to " << in->btime << dendl;
- if (in->caps_issued_mask(CEPH_CAP_AUTH_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();
ldout(cct,10) << "resetting cached fscrypt_auth field. size now "
<< in->fscrypt_auth.size() << dendl;
- if (in->caps_issued_mask(CEPH_CAP_AUTH_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();
}
ldout(cct,10) << "changing size to " << stx->stx_size << dendl;
- if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL) &&
+ if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL) &&
!(mask & CEPH_SETATTR_KILL_SGUID) &&
stx->stx_size >= in->size) {
if (stx->stx_size > in->size) {
ldout(cct,10) << "resetting cached fscrypt_file field. size now "
<< in->fscrypt_file.size() << dendl;
- if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
+ 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();
}
if (mask & CEPH_SETATTR_MTIME) {
- if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
+ 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->time_warp_seq++;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~CEPH_SETATTR_MTIME;
- } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
+ } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
utime_t(stx->stx_mtime) > in->mtime) {
in->mtime = utime_t(stx->stx_mtime);
in->ctime = ceph_clock_now();
}
if (mask & CEPH_SETATTR_ATIME) {
- if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
+ 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->time_warp_seq++;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
mask &= ~CEPH_SETATTR_ATIME;
- } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
+ } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
utime_t(stx->stx_atime) > in->atime) {
in->atime = utime_t(stx->stx_atime);
in->ctime = ceph_clock_now();
return 0;
}
- MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SETATTR);
-
- filepath path;
+ req = new MetaRequest(CEPH_MDS_OP_SETATTR);
in->make_nosnap_relative_path(path);
req->set_filepath(path);
req->head.args.setattr.mask = mask;
req->regetattr_mask = mask;
- int res = make_request(req, perms, inp);
+ res = make_request(req, perms, inp);
+
+out:
ldout(cct, 10) << "_setattr result=" << res << dendl;
return res;
}