From: Yan, Zheng Date: Fri, 15 Apr 2016 12:15:14 +0000 (+0800) Subject: mds: disallow 'open truncate' non-regular inode X-Git-Tag: v0.94.8~18^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2633ec3934ad8f7629c55b4345f426cacfb7b140;p=ceph.git 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) --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 3b1426958c3..da9ad31de9b 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;