Commit a3fb8a61 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'ceph-for-6.16-rc1' of https://github.com/ceph/ceph-client

Pull ceph updates from Ilya Dryomov:

 - a one-liner that leads to a startling (but also very much rational)
   performance improvement in cases where an IMA policy with rules that
   are based on fsmagic matching is enforced

 - an encryption-related fixup that addresses generic/397 and other
   fstest failures

 - a couple of cleanups in CephFS

* tag 'ceph-for-6.16-rc1' of https://github.com/ceph/ceph-client:
  ceph: fix variable dereferenced before check in ceph_umount_begin()
  ceph: set superblock s_magic for IMA fsmagic matching
  ceph: cleanup hardcoded constants of file handle size
  ceph: fix possible integer overflow in ceph_zero_objects()
  ceph: avoid kernel BUG for encrypted inode with unaligned file size
parents 28fb80f0 b828b4bf
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -409,6 +409,15 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
		struct page **pages;
		size_t page_off;

		/*
		 * FIXME: io_iter.count needs to be corrected to aligned
		 * length. Otherwise, iov_iter_get_pages_alloc2() operates
		 * with the initial unaligned length value. As a result,
		 * ceph_msg_data_cursor_init() triggers BUG_ON() in the case
		 * if msg->sparse_read_total > msg->data_length.
		 */
		subreq->io_iter.count = len;

		err = iov_iter_get_pages_alloc2(&subreq->io_iter, &pages, len, &page_off);
		if (err < 0) {
			doutc(cl, "%llx.%llx failed to allocate pages, %d\n",
+13 −8
Original line number Diff line number Diff line
@@ -33,12 +33,19 @@ struct ceph_nfs_snapfh {
	u32 hash;
} __attribute__ ((packed));

#define BYTES_PER_U32		(sizeof(u32))
#define CEPH_FH_BASIC_SIZE \
	(sizeof(struct ceph_nfs_fh) / BYTES_PER_U32)
#define CEPH_FH_WITH_PARENT_SIZE \
	(sizeof(struct ceph_nfs_confh) / BYTES_PER_U32)
#define CEPH_FH_SNAPPED_INODE_SIZE \
	(sizeof(struct ceph_nfs_snapfh) / BYTES_PER_U32)

static int ceph_encode_snapfh(struct inode *inode, u32 *rawfh, int *max_len,
			      struct inode *parent_inode)
{
	struct ceph_client *cl = ceph_inode_to_client(inode);
	static const int snap_handle_length =
		sizeof(struct ceph_nfs_snapfh) >> 2;
	static const int snap_handle_length = CEPH_FH_SNAPPED_INODE_SIZE;
	struct ceph_nfs_snapfh *sfh = (void *)rawfh;
	u64 snapid = ceph_snap(inode);
	int ret;
@@ -88,10 +95,8 @@ static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len,
			  struct inode *parent_inode)
{
	struct ceph_client *cl = ceph_inode_to_client(inode);
	static const int handle_length =
		sizeof(struct ceph_nfs_fh) >> 2;
	static const int connected_handle_length =
		sizeof(struct ceph_nfs_confh) >> 2;
	static const int handle_length = CEPH_FH_BASIC_SIZE;
	static const int connected_handle_length = CEPH_FH_WITH_PARENT_SIZE;
	int type;

	if (ceph_snap(inode) != CEPH_NOSNAP)
@@ -308,7 +313,7 @@ static struct dentry *ceph_fh_to_dentry(struct super_block *sb,
	if (fh_type != FILEID_INO32_GEN  &&
	    fh_type != FILEID_INO32_GEN_PARENT)
		return NULL;
	if (fh_len < sizeof(*fh) / 4)
	if (fh_len < sizeof(*fh) / BYTES_PER_U32)
		return NULL;

	doutc(fsc->client, "%llx\n", fh->ino);
@@ -427,7 +432,7 @@ static struct dentry *ceph_fh_to_parent(struct super_block *sb,

	if (fh_type != FILEID_INO32_GEN_PARENT)
		return NULL;
	if (fh_len < sizeof(*cfh) / 4)
	if (fh_len < sizeof(*cfh) / BYTES_PER_U32)
		return NULL;

	doutc(fsc->client, "%llx\n", cfh->parent_ino);
+1 −1
Original line number Diff line number Diff line
@@ -2616,7 +2616,7 @@ static int ceph_zero_objects(struct inode *inode, loff_t offset, loff_t length)
	s32 stripe_unit = ci->i_layout.stripe_unit;
	s32 stripe_count = ci->i_layout.stripe_count;
	s32 object_size = ci->i_layout.object_size;
	u64 object_set_size = object_size * stripe_count;
	u64 object_set_size = (u64) object_size * stripe_count;
	u64 nearly, t;

	/* round offset up to next period boundary */
+2 −2
Original line number Diff line number Diff line
@@ -1033,8 +1033,7 @@ void ceph_umount_begin(struct super_block *sb)
	struct ceph_fs_client *fsc = ceph_sb_to_fs_client(sb);

	doutc(fsc->client, "starting forced umount\n");
	if (!fsc)
		return;

	fsc->mount_state = CEPH_MOUNT_SHUTDOWN;
	__ceph_umount_begin(fsc);
}
@@ -1227,6 +1226,7 @@ static int ceph_set_super(struct super_block *s, struct fs_context *fc)
	s->s_time_min = 0;
	s->s_time_max = U32_MAX;
	s->s_flags |= SB_NODIRATIME | SB_NOATIME;
	s->s_magic = CEPH_SUPER_MAGIC;

	ceph_fscrypt_set_ops(s);