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

Commit 81f148a9 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: invalidate all write mode filp after reconnect

parent ff5d913d
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -2780,12 +2780,17 @@ int ceph_get_caps(struct file *filp, int need, int want,
	struct ceph_file_info *fi = filp->private_data;
	struct inode *inode = file_inode(filp);
	struct ceph_inode_info *ci = ceph_inode(inode);
	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
	int ret, _got, flags;

	ret = ceph_pool_perm_check(inode, need);
	if (ret < 0)
		return ret;

	if ((fi->fmode & CEPH_FILE_MODE_WR) &&
	    fi->filp_gen != READ_ONCE(fsc->filp_gen))
		return -EBADF;

	while (true) {
		if (endoff > 0)
			check_max_size(inode, endoff);
@@ -2814,6 +2819,14 @@ int ceph_get_caps(struct file *filp, int need, int want,
			if (ret == -EAGAIN)
				continue;
		}

		if ((fi->fmode & CEPH_FILE_MODE_WR) &&
		    fi->filp_gen != READ_ONCE(fsc->filp_gen)) {
			if (ret >= 0 && _got)
				ceph_put_cap_refs(ci, _got);
			return -EBADF;
		}

		if (ret < 0) {
			if (ret == -ESTALE) {
				/* session was killed, try renew caps */
+1 −0
Original line number Diff line number Diff line
@@ -234,6 +234,7 @@ static int ceph_init_file_info(struct inode *inode, struct file *file,
	spin_lock_init(&fi->rw_contexts_lock);
	INIT_LIST_HEAD(&fi->rw_contexts);
	fi->meta_err = errseq_sample(&ci->i_meta_err);
	fi->filp_gen = READ_ONCE(ceph_inode_to_client(inode)->filp_gen);

	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -664,6 +664,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,

	fsc->sb = NULL;
	fsc->mount_state = CEPH_MOUNT_MOUNTING;
	fsc->filp_gen = 1;

	atomic_long_set(&fsc->writeback_count, 0);

@@ -829,6 +830,7 @@ static void ceph_umount_begin(struct super_block *sb)
	fsc->mount_state = CEPH_MOUNT_SHUTDOWN;
	ceph_osdc_abort_requests(&fsc->client->osdc, -EIO);
	ceph_mdsc_force_umount(fsc->mdsc);
	fsc->filp_gen++; // invalidate open files
}

static int ceph_remount(struct super_block *sb, int *flags, char *data)
+3 −0
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@ struct ceph_fs_client {
	struct ceph_client *client;

	unsigned long mount_state;

	u32 filp_gen;
	loff_t max_file_size;

	struct ceph_mds_client *mdsc;
@@ -707,6 +709,7 @@ struct ceph_file_info {
	struct list_head rw_contexts;

	errseq_t meta_err;
	u32 filp_gen;
	atomic_t num_locks;
};