Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21b27a74 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ceph fix from Sage Weil:
 "This is a final commit we missed to align the protocol compatibility
  with the feature bits.

  It decodes a few extra fields in two different messages and reports
  EIO when they are used (not yet supported)"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
  ceph: initial CEPH_FEATURE_FS_FILE_LAYOUT_V2 support
parents a58b9ada 5ea5c5e0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1756,6 +1756,10 @@ int ceph_pool_perm_check(struct ceph_inode_info *ci, int need)
	u32 pool;
	int ret, flags;

	/* does not support pool namespace yet */
	if (ci->i_pool_ns_len)
		return -EIO;

	if (ceph_test_mount_opt(ceph_inode_to_client(&ci->vfs_inode),
				NOPOOLPERM))
		return 0;
+24 −3
Original line number Diff line number Diff line
@@ -2753,7 +2753,8 @@ static void handle_cap_grant(struct ceph_mds_client *mdsc,
			     void *inline_data, int inline_len,
			     struct ceph_buffer *xattr_buf,
			     struct ceph_mds_session *session,
			     struct ceph_cap *cap, int issued)
			     struct ceph_cap *cap, int issued,
			     u32 pool_ns_len)
	__releases(ci->i_ceph_lock)
	__releases(mdsc->snap_rwsem)
{
@@ -2873,6 +2874,8 @@ static void handle_cap_grant(struct ceph_mds_client *mdsc,
	if (newcaps & (CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)) {
		/* file layout may have changed */
		ci->i_layout = grant->layout;
		ci->i_pool_ns_len = pool_ns_len;

		/* size/truncate_seq? */
		queue_trunc = ceph_fill_file_size(inode, issued,
					le32_to_cpu(grant->truncate_seq),
@@ -3411,6 +3414,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
	u32  inline_len = 0;
	void *snaptrace;
	size_t snaptrace_len;
	u32 pool_ns_len = 0;
	void *p, *end;

	dout("handle_caps from mds%d\n", mds);
@@ -3463,6 +3467,21 @@ void ceph_handle_caps(struct ceph_mds_session *session,
		p += inline_len;
	}

	if (le16_to_cpu(msg->hdr.version) >= 8) {
		u64 flush_tid;
		u32 caller_uid, caller_gid;
		u32 osd_epoch_barrier;
		/* version >= 5 */
		ceph_decode_32_safe(&p, end, osd_epoch_barrier, bad);
		/* version >= 6 */
		ceph_decode_64_safe(&p, end, flush_tid, bad);
		/* version >= 7 */
		ceph_decode_32_safe(&p, end, caller_uid, bad);
		ceph_decode_32_safe(&p, end, caller_gid, bad);
		/* version >= 8 */
		ceph_decode_32_safe(&p, end, pool_ns_len, bad);
	}

	/* lookup ino */
	inode = ceph_find_inode(sb, vino);
	ci = ceph_inode(inode);
@@ -3518,7 +3537,8 @@ void ceph_handle_caps(struct ceph_mds_session *session,
				  &cap, &issued);
		handle_cap_grant(mdsc, inode, h,
				 inline_version, inline_data, inline_len,
				 msg->middle, session, cap, issued);
				 msg->middle, session, cap, issued,
				 pool_ns_len);
		if (realm)
			ceph_put_snap_realm(mdsc, realm);
		goto done_unlocked;
@@ -3542,7 +3562,8 @@ void ceph_handle_caps(struct ceph_mds_session *session,
		issued |= __ceph_caps_dirty(ci);
		handle_cap_grant(mdsc, inode, h,
				 inline_version, inline_data, inline_len,
				 msg->middle, session, cap, issued);
				 msg->middle, session, cap, issued,
				 pool_ns_len);
		goto done_unlocked;

	case CEPH_CAP_OP_FLUSH_ACK:
+2 −0
Original line number Diff line number Diff line
@@ -396,6 +396,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
	ci->i_symlink = NULL;

	memset(&ci->i_dir_layout, 0, sizeof(ci->i_dir_layout));
	ci->i_pool_ns_len = 0;

	ci->i_fragtree = RB_ROOT;
	mutex_init(&ci->i_fragtree_mutex);
@@ -756,6 +757,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
		if (ci->i_layout.fl_pg_pool != info->layout.fl_pg_pool)
			ci->i_ceph_flags &= ~CEPH_I_POOL_PERM;
		ci->i_layout = info->layout;
		ci->i_pool_ns_len = iinfo->pool_ns_len;

		queue_trunc = ceph_fill_file_size(inode, issued,
					le32_to_cpu(info->truncate_seq),
+16 −0
Original line number Diff line number Diff line
@@ -100,6 +100,14 @@ static int parse_reply_info_in(void **p, void *end,
	} else
		info->inline_version = CEPH_INLINE_NONE;

	if (features & CEPH_FEATURE_FS_FILE_LAYOUT_V2) {
		ceph_decode_32_safe(p, end, info->pool_ns_len, bad);
		ceph_decode_need(p, end, info->pool_ns_len, bad);
		*p += info->pool_ns_len;
	} else {
		info->pool_ns_len = 0;
	}

	return 0;
bad:
	return err;
@@ -2298,6 +2306,14 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
		ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir),
				  CEPH_CAP_PIN);

	/* deny access to directories with pool_ns layouts */
	if (req->r_inode && S_ISDIR(req->r_inode->i_mode) &&
	    ceph_inode(req->r_inode)->i_pool_ns_len)
		return -EIO;
	if (req->r_locked_dir &&
	    ceph_inode(req->r_locked_dir)->i_pool_ns_len)
		return -EIO;

	/* issue */
	mutex_lock(&mdsc->mutex);
	__register_request(mdsc, req, dir);
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ struct ceph_mds_reply_info_in {
	u64 inline_version;
	u32 inline_len;
	char *inline_data;
	u32 pool_ns_len;
};

/*
Loading