};
-void Locker::calc_new_client_ranges(CInode *in, uint64_t size, map<client_t,client_writeable_range_t>& new_ranges)
+void Locker::calc_new_client_ranges(CInode *in, uint64_t size,
+ map<client_t,client_writeable_range_t> *new_ranges,
+ bool *max_increased)
{
inode_t *latest = in->get_projected_inode();
uint64_t ms;
p != in->client_caps.end();
++p) {
if ((p->second->issued() | p->second->wanted()) & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER)) {
- client_writeable_range_t& nr = new_ranges[p->first];
+ client_writeable_range_t& nr = (*new_ranges)[p->first];
nr.range.first = 0;
if (latest->client_ranges.count(p->first)) {
client_writeable_range_t& oldr = latest->client_ranges[p->first];
+ if (ms > oldr.range.last)
+ *max_increased = true;
nr.range.last = MAX(ms, oldr.range.last);
nr.follows = oldr.follows;
} else {
map<client_t, client_writeable_range_t> new_ranges;
uint64_t size = latest->size;
bool new_max = update_max;
+ bool max_increased = false;
if (update_size) {
new_size = size = MAX(size, new_size);
}
uint64_t client_range_size = update_max ? new_max_size : size;
+ calc_new_client_ranges(in, client_range_size, &new_ranges, &max_increased);
- calc_new_client_ranges(in, client_range_size, new_ranges);
-
- if (latest->client_ranges != new_ranges)
+ if (max_increased || latest->client_ranges != new_ranges)
new_max = true;
if (!update_size && !new_max) {
mut->auth_pin(in);
// make max_size _increase_ timely
- if (new_max)
+ if (max_increased)
mds->mdlog->flush();
return true;
void file_update_finish(CInode *in, MutationRef& mut, bool share, client_t client, Capability *cap,
MClientCaps *ack);
public:
- void calc_new_client_ranges(CInode *in, uint64_t size, map<client_t, client_writeable_range_t>& new_ranges);
+ void calc_new_client_ranges(CInode *in, uint64_t size,
+ map<client_t, client_writeable_range_t>* new_ranges,
+ bool *max_increased);
bool check_inode_max_size(CInode *in, bool force_wrlock=false,
bool update_size=false, uint64_t newsize=0,
bool update_max=false, uint64_t newmax=0,
// adjust client's max_size?
map<client_t,client_writeable_range_t> new_ranges;
- mds->locker->calc_new_client_ranges(cur, pi->size, new_ranges);
+ bool max_increased = false;
+ mds->locker->calc_new_client_ranges(cur, pi->size, &new_ranges, &max_increased);
if (pi->client_ranges != new_ranges) {
dout(10) << " client_ranges " << pi->client_ranges << " -> " << new_ranges << dendl;
pi->client_ranges = new_ranges;