]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't allow changing layout for non-regular file 1029/head
authorYan, Zheng <zheng.z.yan@intel.com>
Wed, 1 Jan 2014 01:51:41 +0000 (09:51 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Wed, 1 Jan 2014 03:19:00 +0000 (11:19 +0800)
layout is meaningless for non-regular file. using non-default layout
may make backtrace less efficiency.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Server.cc

index 7738a09d2a4434b76345f136eea96df301227a42..84c300c45a423eb6fcd2a7dc5a047bd86dd90756 100644 (file)
@@ -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)