From f12abbf655d5038f609cb5b21d857e886be1b5fb Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 1 Jan 2014 09:51:41 +0800 Subject: [PATCH] mds: don't allow changing layout for non-regular file layout is meaningless for non-regular file. using non-default layout may make backtrace less efficiency. Signed-off-by: Yan, Zheng --- src/mds/Server.cc | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 7738a09d2a443..84c300c45a423 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1913,15 +1913,14 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, u 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 */ @@ -3335,11 +3334,10 @@ void Server::handle_client_setlayout(MDRequest *mdr) 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); @@ -3942,32 +3940,28 @@ void Server::handle_client_mknod(MDRequest *mdr) 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) -- 2.39.5