Skip to content

Commit c0e385b

Browse files
ukernelidryomov
authored andcommitted
ceph: always renew caps if mds_wanted is insufficient
Original code only renews caps for inodes with CEPH_I_CAP_DROPPED flag, which indicates that mds has closed the session and caps were dropped. Remove this flag in preparation for not requesting caps for idle open files. Signed-off-by: "Yan, Zheng" <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 3313f66 commit c0e385b

File tree

3 files changed

+21
-33
lines changed

3 files changed

+21
-33
lines changed

fs/ceph/caps.c

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,6 +2686,7 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
26862686
}
26872687
} else {
26882688
int session_readonly = false;
2689+
int mds_wanted;
26892690
if (ci->i_auth_cap &&
26902691
(need & (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_EXCL))) {
26912692
struct ceph_mds_session *s = ci->i_auth_cap->session;
@@ -2694,32 +2695,27 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
26942695
spin_unlock(&s->s_cap_lock);
26952696
}
26962697
if (session_readonly) {
2697-
dout("get_cap_refs %p needed %s but mds%d readonly\n",
2698+
dout("get_cap_refs %p need %s but mds%d readonly\n",
26982699
inode, ceph_cap_string(need), ci->i_auth_cap->mds);
26992700
ret = -EROFS;
27002701
goto out_unlock;
27012702
}
27022703

2703-
if (ci->i_ceph_flags & CEPH_I_CAP_DROPPED) {
2704-
int mds_wanted;
2705-
if (READ_ONCE(mdsc->fsc->mount_state) ==
2706-
CEPH_MOUNT_SHUTDOWN) {
2707-
dout("get_cap_refs %p forced umount\n", inode);
2708-
ret = -EIO;
2709-
goto out_unlock;
2710-
}
2711-
mds_wanted = __ceph_caps_mds_wanted(ci, false);
2712-
if (need & ~(mds_wanted & need)) {
2713-
dout("get_cap_refs %p caps were dropped"
2714-
" (session killed?)\n", inode);
2715-
ret = -ESTALE;
2716-
goto out_unlock;
2717-
}
2718-
if (!(file_wanted & ~mds_wanted))
2719-
ci->i_ceph_flags &= ~CEPH_I_CAP_DROPPED;
2704+
if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) {
2705+
dout("get_cap_refs %p forced umount\n", inode);
2706+
ret = -EIO;
2707+
goto out_unlock;
2708+
}
2709+
mds_wanted = __ceph_caps_mds_wanted(ci, false);
2710+
if (need & ~mds_wanted) {
2711+
dout("get_cap_refs %p need %s > mds_wanted %s\n",
2712+
inode, ceph_cap_string(need),
2713+
ceph_cap_string(mds_wanted));
2714+
ret = -ESTALE;
2715+
goto out_unlock;
27202716
}
27212717

2722-
dout("get_cap_refs %p have %s needed %s\n", inode,
2718+
dout("get_cap_refs %p have %s need %s\n", inode,
27232719
ceph_cap_string(have), ceph_cap_string(need));
27242720
}
27252721
out_unlock:
@@ -3678,8 +3674,6 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
36783674
goto out_unlock;
36793675

36803676
if (target < 0) {
3681-
if (cap->mds_wanted | cap->issued)
3682-
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
36833677
__ceph_remove_cap(cap, false);
36843678
goto out_unlock;
36853679
}

fs/ceph/mds_client.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,8 +1514,6 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,
15141514
dout("removing cap %p, ci is %p, inode is %p\n",
15151515
cap, ci, &ci->vfs_inode);
15161516
spin_lock(&ci->i_ceph_lock);
1517-
if (cap->mds_wanted | cap->issued)
1518-
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
15191517
__ceph_remove_cap(cap, false);
15201518
if (!ci->i_auth_cap) {
15211519
struct ceph_cap_flush *cf;
@@ -1681,9 +1679,6 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap,
16811679
/* mds did not re-issue stale cap */
16821680
spin_lock(&ci->i_ceph_lock);
16831681
cap->issued = cap->implemented = CEPH_CAP_PIN;
1684-
/* make sure mds knows what we want */
1685-
if (__ceph_caps_file_wanted(ci) & ~cap->mds_wanted)
1686-
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
16871682
spin_unlock(&ci->i_ceph_lock);
16881683
}
16891684
} else if (ev == FORCE_RO) {

fs/ceph/super.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -522,13 +522,12 @@ static inline struct inode *ceph_find_inode(struct super_block *sb,
522522
#define CEPH_I_POOL_RD (1 << 4) /* can read from pool */
523523
#define CEPH_I_POOL_WR (1 << 5) /* can write to pool */
524524
#define CEPH_I_SEC_INITED (1 << 6) /* security initialized */
525-
#define CEPH_I_CAP_DROPPED (1 << 7) /* caps were forcibly dropped */
526-
#define CEPH_I_KICK_FLUSH (1 << 8) /* kick flushing caps */
527-
#define CEPH_I_FLUSH_SNAPS (1 << 9) /* need flush snapss */
528-
#define CEPH_I_ERROR_WRITE (1 << 10) /* have seen write errors */
529-
#define CEPH_I_ERROR_FILELOCK (1 << 11) /* have seen file lock errors */
530-
#define CEPH_I_ODIRECT (1 << 12) /* inode in direct I/O mode */
531-
#define CEPH_ASYNC_CREATE_BIT (13) /* async create in flight for this */
525+
#define CEPH_I_KICK_FLUSH (1 << 7) /* kick flushing caps */
526+
#define CEPH_I_FLUSH_SNAPS (1 << 8) /* need flush snapss */
527+
#define CEPH_I_ERROR_WRITE (1 << 9) /* have seen write errors */
528+
#define CEPH_I_ERROR_FILELOCK (1 << 10) /* have seen file lock errors */
529+
#define CEPH_I_ODIRECT (1 << 11) /* inode in direct I/O mode */
530+
#define CEPH_ASYNC_CREATE_BIT (12) /* async create in flight for this */
532531
#define CEPH_I_ASYNC_CREATE (1 << CEPH_ASYNC_CREATE_BIT)
533532

534533
/*

0 commit comments

Comments
 (0)