in->inode.mode = mode;
memset(&in->inode.dir_layout, 0, sizeof(in->inode.dir_layout));
- if (in->inode.is_dir())
+ if (in->inode.is_dir()) {
in->inode.dir_layout.dl_dir_hash = g_conf->mds_default_dir_hash;
-
- if (layout)
- in->inode.layout = *layout;
- else if (in->inode.is_dir())
memset(&in->inode.layout, 0, sizeof(in->inode.layout));
- else
+ } else if (layout) {
+ in->inode.layout = *layout;
+ } else {
in->inode.layout = mds->mdcache->default_file_layout;
+ }
in->inode.truncate_size = -1ull; // not truncated, yet!
in->inode.truncate_seq = 1; /* starting with 1, 0 is kept for no-truncation logic */
reply_request(mdr, -EROFS);
return;
}
- if (cur->is_dir()) {
- reply_request(mdr, -EISDIR);
+ if (!cur->is_file()) {
+ reply_request(mdr, -EINVAL);
return;
}
-
if (cur->get_projected_inode()->size ||
cur->get_projected_inode()->truncate_seq > 1) {
reply_request(mdr, -ENOTEMPTY);
if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
return;
+ unsigned mode = req->head.args.mknod.mode;
+ if ((mode & S_IFMT) == 0)
+ mode |= S_IFREG;
+
// set layout
ceph_file_layout layout;
- if (dir_layout)
+ if (dir_layout && S_ISREG(mode))
layout = *dir_layout;
else
layout = mds->mdcache->default_file_layout;
- if (!ceph_file_layout_is_valid(&layout)) {
- dout(10) << " invalid initial file layout" << dendl;
- reply_request(mdr, -EINVAL);
- return;
- }
-
SnapRealm *realm = dn->get_dir()->inode->find_snaprealm();
snapid_t follows = realm->get_newest_seq();
mdr->now = ceph_clock_now(g_ceph_context);
CInode *newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(req->head.ino),
- req->head.args.mknod.mode, &layout);
+ mode, &layout);
assert(newi);
dn->push_projected_linkage(newi);
newi->inode.rdev = req->head.args.mknod.rdev;
- if ((newi->inode.mode & S_IFMT) == 0)
- newi->inode.mode |= S_IFREG;
newi->inode.version = dn->pre_dirty();
newi->inode.rstat.rfiles = 1;
if (layout.fl_pg_pool != mdcache->default_file_layout.fl_pg_pool)