From: Jeff Layton Date: Mon, 29 Aug 2016 11:16:40 +0000 (-0400) Subject: mds/client: bump the change_attr at the appropriate time for files X-Git-Tag: v11.0.1~326^2~17 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b77605f9d0b4ab7de92523cefeefae91c971baea;p=ceph.git mds/client: bump the change_attr at the appropriate time for files The semantics for a change_attr are that it should be incremented whenever there is a change to the ctime in the inode. Add those increments for the simple case of regular files. Directories however can be fragmented so we'll need to do something more elaborate there. Signed-off-by: Jeff Layton --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 13c11a835be..95abf60db92 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6524,13 +6524,16 @@ int Client::_do_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); } } - if (!mask) + if (!mask) { + in->change_attr++; return 0; + } force_request: MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SETATTR); filepath path; + in->make_nosnap_relative_path(path); req->set_filepath(path); req->set_inode(in); @@ -8796,6 +8799,7 @@ success: // mtime in->mtime = ceph_clock_now(cct); + in->change_attr++; mark_caps_dirty(in, CEPH_CAP_FILE_WR); done: @@ -11829,6 +11833,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) in->inline_version++; } in->mtime = ceph_clock_now(cct); + in->change_attr++; mark_caps_dirty(in, CEPH_CAP_FILE_WR); } else { if (in->inline_version < CEPH_INLINE_NONE) { @@ -11856,6 +11861,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) 0, true, onfinish, new C_OnFinisher(onsafe, &objecter_finisher)); in->mtime = ceph_clock_now(cct); + in->change_attr++; mark_caps_dirty(in, CEPH_CAP_FILE_WR); client_lock.Unlock(); @@ -11870,6 +11876,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) if (size > in->size) { in->size = size; in->mtime = ceph_clock_now(cct); + in->change_attr++; mark_caps_dirty(in, CEPH_CAP_FILE_WR); if (is_quota_bytes_approaching(in)) { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e9ddbf3a443..3ad1654b524 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3835,6 +3835,7 @@ void Server::handle_client_setattr(MDRequestRef& mdr) pi->version = cur->pre_dirty(); pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; // log + wait le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid()); @@ -3869,6 +3870,7 @@ void Server::do_open_truncate(MDRequestRef& mdr, int cmode) inode_t *pi = in->project_inode(); pi->version = in->pre_dirty(); pi->mtime = pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; uint64_t old_size = MAX(pi->size, mdr->client_request->head.args.open.old_size); if (old_size > 0) { @@ -3984,6 +3986,7 @@ void Server::handle_client_setlayout(MDRequestRef& mdr) pi->add_old_pool(old_pool); pi->version = cur->pre_dirty(); pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; // log + wait mdr->ls = mdlog->get_current_segment(); @@ -4503,6 +4506,7 @@ void Server::handle_client_setxattr(MDRequestRef& mdr) inode_t *pi = cur->project_inode(px); pi->version = cur->pre_dirty(); pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; pi->xattr_version++; px->erase(name); if (!(flags & CEPH_XATTR_REMOVE)) { @@ -4564,6 +4568,7 @@ void Server::handle_client_removexattr(MDRequestRef& mdr) inode_t *pi = cur->project_inode(px); pi->version = cur->pre_dirty(); pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; pi->xattr_version++; px->erase(name); @@ -4955,6 +4960,7 @@ void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) inode_t *pi = targeti->project_inode(); pi->nlink++; pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; pi->version = tipv; // log + wait @@ -5604,6 +5610,7 @@ void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn) mdr->add_projected_inode(in); // do this _after_ my dn->pre_dirty().. we apply that one manually. pi->version = in->pre_dirty(); pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; pi->nlink--; if (pi->nlink == 0) in->state_set(CInode::STATE_ORPHAN); @@ -6787,11 +6794,13 @@ void Server::_rename_prepare(MDRequestRef& mdr, if (!silent) { if (pi) { pi->ctime = mdr->get_op_stamp(); + pi->change_attr++; if (linkmerge) pi->nlink--; } if (tpi) { tpi->ctime = mdr->get_op_stamp(); + tpi->change_attr++; destdn->make_path_string(tpi->stray_prior_path); tpi->nlink--; if (tpi->nlink == 0)