dout(10) << "_setattr mask " << mask << " issued " << ccap_string(issued) << dendl;
+ if (in->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
// make the change locally?
if (!mask) {
int want = ceph_caps_for_mode(cmode);
int result = 0;
+ if (in->snapid != CEPH_NOSNAP &&
+ (mode & (O_WRONLY | O_RDWR | O_CREAT | O_TRUNC | O_APPEND))) {
+ return -EROFS;
+ }
+
in->get_open_ref(cmode); // make note of pending open, since it effects _wanted_ caps.
if (in->caps_issued_mask(want)) {
int Client::_setxattr(Inode *in, const char *name, const void *value, size_t size, int flags,
int uid, int gid)
{
+ if (in->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SETXATTR);
filepath path;
in->make_nosnap_relative_path(path);
int Client::_removexattr(Inode *in, const char *name, int uid, int gid)
{
+ if (in->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_RMXATTR);
filepath path;
in->make_nosnap_relative_path(path);
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
+ if (dir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_MKNOD);
filepath path;
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
+ if (dir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_CREATE);
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
+ if (dir->snapid != CEPH_NOSNAP && dir->snapid != CEPH_SNAPDIR) {
+ return -EROFS;
+ }
MetaRequest *req = new MetaRequest(dir->snapid == CEPH_SNAPDIR ? CEPH_MDS_OP_MKSNAP:CEPH_MDS_OP_MKDIR);
filepath path;
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
+ if (dir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SYMLINK);
filepath path;
{
dout(3) << "_unlink(" << dir->ino << " " << name << " uid " << uid << " gid " << gid << ")" << dendl;
+ if (dir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_UNLINK);
filepath path;
{
dout(3) << "_rmdir(" << dir->ino << " " << name << " uid " << uid << " gid " << gid << ")" << dendl;
+ if (dir->snapid != CEPH_NOSNAP && dir->snapid != CEPH_SNAPDIR) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(dir->snapid == CEPH_SNAPDIR ? CEPH_MDS_OP_RMSNAP:CEPH_MDS_OP_RMDIR);
filepath path;
dir->make_nosnap_relative_path(path);
dout(3) << "_rmdir(" << fromdir->ino << " " << fromname << " to " << todir->ino << " " << toname
<< " uid " << uid << " gid " << gid << ")" << dendl;
+ if (fromdir->snapid != CEPH_NOSNAP ||
+ todir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_RENAME);
filepath from;
if (strlen(newname) > NAME_MAX)
return -ENAMETOOLONG;
+ if (in->snapid != CEPH_NOSNAP || dir->snapid != CEPH_NOSNAP) {
+ return -EROFS;
+ }
+
MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LINK);
filepath path(newname, dir->ino);