return true;
}
+/**
+ * check whether fragment has reached maximum size
+ *
+ */
+bool Server::check_fragment_space(MDRequestRef &mdr, CDir *in)
+{
+ const auto size = in->get_frag_size();
+ if (size >= g_conf->mds_bal_fragment_size_max) {
+ dout(10) << "fragment " << *in << " size exceeds " << g_conf->mds_bal_fragment_size_max << " (ENOSPC)" << dendl;
+ respond_to_request(mdr, -ENOSPC);
+ return false;
+ }
+
+ return true;
+}
+
+
/** validate_dentry_dir
*
* verify that the dir exists and would own the dname.
{
CDentry *straydn = mdr->straydn;
if (straydn) {
- string name;
- in->name_stray_dentry(name);
- if (straydn->get_name() == name)
+ string straydname;
+ in->name_stray_dentry(straydname);
+ if (straydn->get_name() == straydname)
return straydn;
assert(!mdr->done_locking);
mdr->unpin(straydn);
}
+ CDir *straydir = mdcache->get_stray_dir(in);
+
+ if (!check_fragment_space(mdr, straydir))
+ return NULL;
+
straydn = mdcache->get_or_create_stray_dentry(in);
mdr->straydn = straydn;
mdr->pin(straydn);
return;
}
- CInode *diri = dn->get_dir()->get_inode();
+ CDir *dir = dn->get_dir();
+ CInode *diri = dir->get_inode();
rdlocks.insert(&diri->authlock);
if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
return;
if (!check_access(mdr, diri, access))
return;
+ if (!check_fragment_space(mdr, dir))
+ return;
+
CDentry::linkage_t *dnl = dn->get_projected_linkage();
if (!dnl->is_null()) {
if (!check_access(mdr, diri, MAY_WRITE))
return;
+ if (!check_fragment_space(mdr, dn->get_dir()))
+ return;
+
unsigned mode = req->head.args.mknod.mode;
if ((mode & S_IFMT) == 0)
mode |= S_IFREG;
respond_to_request(mdr, -EROFS);
return;
}
- CInode *diri = dn->get_dir()->get_inode();
+ CDir *dir = dn->get_dir();
+ CInode *diri = dir->get_inode();
rdlocks.insert(&diri->authlock);
if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
return;
if (!check_access(mdr, diri, MAY_WRITE))
return;
+ if (!check_fragment_space(mdr, dir))
+ return;
+
// new inode
SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
snapid_t follows = realm->get_newest_seq();
respond_to_request(mdr, -EROFS);
return;
}
- CInode *diri = dn->get_dir()->get_inode();
+ CDir *dir = dn->get_dir();
+ CInode *diri = dir->get_inode();
rdlocks.insert(&diri->authlock);
if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
return;
if (!check_access(mdr, diri, MAY_WRITE))
return;
+ if (!check_fragment_space(mdr, dir))
+ return;
+
unsigned mode = S_IFLNK | 0777;
CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino), mode);
assert(newi);
if (!check_access(mdr, dir->get_inode(), MAY_WRITE))
return;
+ if (!check_fragment_space(mdr, dir))
+ return;
+
// go!
assert(g_conf->mds_kill_link_at != 1);
CDentry *straydn = NULL;
if (dnl->is_primary()) {
straydn = prepare_stray_dentry(mdr, dnl->get_inode());
+ if (!straydn)
+ return;
dout(10) << " straydn is " << *straydn << dendl;
} else if (mdr->straydn) {
mdr->unpin(mdr->straydn);
CDentry *straydn = NULL;
if (destdnl->is_primary() && !linkmerge) {
straydn = prepare_stray_dentry(mdr, destdnl->get_inode());
+ if (!straydn)
+ return;
dout(10) << " straydn is " << *straydn << dendl;
} else if (mdr->straydn) {
mdr->unpin(mdr->straydn);
if (!check_access(mdr, destdn->get_dir()->get_inode(), MAY_WRITE))
return;
+ if (!check_fragment_space(mdr, destdn->get_dir()))
+ return;
+
if (!check_access(mdr, srci, MAY_WRITE))
return;