From 2633ec3934ad8f7629c55b4345f426cacfb7b140 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 15 Apr 2016 20:15:14 +0800 Subject: [PATCH] mds: disallow 'open truncate' non-regular inode Signed-off-by: Yan, Zheng (cherry picked from commit 0e4b6f2332bb4822cf324587a94144f1c98e4b97) Conflicts: src/mds/Server.cc (hammer has cur->inode.inline_version - in master this has been changed to cur->inode.inline_data.version) --- src/mds/Server.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 3b1426958c3b2..da9ad31de9b72 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2732,9 +2732,13 @@ void Server::handle_client_open(MDRequestRef& mdr) return; } - // can only open non-regular inode with mode FILE_MODE_PIN, at least for now. - if (!cur->inode.is_file()) + if (!cur->inode.is_file()) { + // can only open non-regular inode with mode FILE_MODE_PIN, at least for now. cmode = CEPH_FILE_MODE_PIN; + // the inode is symlink and client wants to follow it, ignore the O_TRUNC flag. + if (cur->inode.is_symlink() && !(flags & O_NOFOLLOW)) + flags &= ~O_TRUNC; + } dout(10) << "open flags = " << flags << ", filemode = " << cmode @@ -2753,6 +2757,13 @@ void Server::handle_client_open(MDRequestRef& mdr) return; } + if ((flags & O_TRUNC) && !cur->inode.is_file()) { + dout(7) << "specified O_TRUNC on !(file|symlink) " << *cur << dendl; + // we should return -EISDIR for directory, return -EINVAL for other non-regular + respond_to_request(mdr, cur->inode.is_dir() ? EISDIR : -EINVAL); + return; + } + if (cur->inode.inline_version != CEPH_INLINE_NONE && !mdr->session->connection->has_feature(CEPH_FEATURE_MDS_INLINE_DATA)) { dout(7) << "old client cannot open inline data file " << *cur << dendl; -- 2.39.5