[PATCH 8/9] ceph: invalidate all write mode filp after reconnect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: "Yan, Zheng" <zyan@xxxxxxxxxx>
---
 fs/ceph/caps.c  | 4 ++++
 fs/ceph/file.c  | 1 +
 fs/ceph/super.c | 2 ++
 fs/ceph/super.h | 3 +++
 4 files changed, 10 insertions(+)

diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 416405e03c4c..a4717b3c1f89 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -2783,6 +2783,10 @@ int ceph_get_caps(struct file *filp, int need, int want,
 	if (ret < 0)
 		return ret;
 
+	if ((fi->fmode & CEPH_FILE_MODE_WR) &&
+	    fi->filp_gen != READ_ONCE(ceph_inode_to_client(inode)->filp_gen))
+		return -EBADF;
+
 	while (true) {
 		if (endoff > 0)
 			check_max_size(inode, endoff);
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index b868048211ba..77d3ef903cce 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -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;
 }
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 04a9af66419d..a00597602810 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -669,6 +669,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);
 
@@ -832,6 +833,7 @@ static void ceph_umount_begin(struct super_block *sb)
 	if (!fsc)
 		return;
 	fsc->mount_state = CEPH_MOUNT_SHUTDOWN;
+	fsc->filp_gen++; // invalidate open files
 	ceph_osdc_abort_requests(&fsc->client->osdc, -EIO);
 	ceph_mdsc_force_umount(fsc->mdsc);
 	return;
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 71ac136b8758..54039f7fb510 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -102,6 +102,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;
@@ -708,6 +710,7 @@ struct ceph_file_info {
 	struct list_head rw_contexts;
 
 	errseq_t meta_err;
+	u32 filp_gen;
 	atomic_t num_locks;
 };
 
-- 
2.20.1




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux