Commit c0e385b1 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov

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: default avatar"Yan, Zheng" <zyan@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 3313f66a
...@@ -2686,6 +2686,7 @@ static int try_get_cap_refs(struct inode *inode, int need, int want, ...@@ -2686,6 +2686,7 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
} }
} else { } else {
int session_readonly = false; int session_readonly = false;
int mds_wanted;
if (ci->i_auth_cap && if (ci->i_auth_cap &&
(need & (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_EXCL))) { (need & (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_EXCL))) {
struct ceph_mds_session *s = ci->i_auth_cap->session; 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, ...@@ -2694,32 +2695,27 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
spin_unlock(&s->s_cap_lock); spin_unlock(&s->s_cap_lock);
} }
if (session_readonly) { if (session_readonly) {
dout("get_cap_refs %p needed %s but mds%d readonly\n", dout("get_cap_refs %p need %s but mds%d readonly\n",
inode, ceph_cap_string(need), ci->i_auth_cap->mds); inode, ceph_cap_string(need), ci->i_auth_cap->mds);
ret = -EROFS; ret = -EROFS;
goto out_unlock; goto out_unlock;
} }
if (ci->i_ceph_flags & CEPH_I_CAP_DROPPED) { if (READ_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) {
int mds_wanted; dout("get_cap_refs %p forced umount\n", inode);
if (READ_ONCE(mdsc->fsc->mount_state) == ret = -EIO;
CEPH_MOUNT_SHUTDOWN) { goto out_unlock;
dout("get_cap_refs %p forced umount\n", inode); }
ret = -EIO; mds_wanted = __ceph_caps_mds_wanted(ci, false);
goto out_unlock; if (need & ~mds_wanted) {
} dout("get_cap_refs %p need %s > mds_wanted %s\n",
mds_wanted = __ceph_caps_mds_wanted(ci, false); inode, ceph_cap_string(need),
if (need & ~(mds_wanted & need)) { ceph_cap_string(mds_wanted));
dout("get_cap_refs %p caps were dropped" ret = -ESTALE;
" (session killed?)\n", inode); goto out_unlock;
ret = -ESTALE;
goto out_unlock;
}
if (!(file_wanted & ~mds_wanted))
ci->i_ceph_flags &= ~CEPH_I_CAP_DROPPED;
} }
dout("get_cap_refs %p have %s needed %s\n", inode, dout("get_cap_refs %p have %s need %s\n", inode,
ceph_cap_string(have), ceph_cap_string(need)); ceph_cap_string(have), ceph_cap_string(need));
} }
out_unlock: out_unlock:
...@@ -3678,8 +3674,6 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, ...@@ -3678,8 +3674,6 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
goto out_unlock; goto out_unlock;
if (target < 0) { if (target < 0) {
if (cap->mds_wanted | cap->issued)
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
__ceph_remove_cap(cap, false); __ceph_remove_cap(cap, false);
goto out_unlock; goto out_unlock;
} }
......
...@@ -1514,8 +1514,6 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap, ...@@ -1514,8 +1514,6 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,
dout("removing cap %p, ci is %p, inode is %p\n", dout("removing cap %p, ci is %p, inode is %p\n",
cap, ci, &ci->vfs_inode); cap, ci, &ci->vfs_inode);
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
if (cap->mds_wanted | cap->issued)
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
__ceph_remove_cap(cap, false); __ceph_remove_cap(cap, false);
if (!ci->i_auth_cap) { if (!ci->i_auth_cap) {
struct ceph_cap_flush *cf; struct ceph_cap_flush *cf;
...@@ -1681,9 +1679,6 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, ...@@ -1681,9 +1679,6 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap,
/* mds did not re-issue stale cap */ /* mds did not re-issue stale cap */
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
cap->issued = cap->implemented = CEPH_CAP_PIN; cap->issued = cap->implemented = CEPH_CAP_PIN;
/* make sure mds knows what we want */
if (__ceph_caps_file_wanted(ci) & ~cap->mds_wanted)
ci->i_ceph_flags |= CEPH_I_CAP_DROPPED;
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
} }
} else if (ev == FORCE_RO) { } else if (ev == FORCE_RO) {
......
...@@ -522,13 +522,12 @@ static inline struct inode *ceph_find_inode(struct super_block *sb, ...@@ -522,13 +522,12 @@ static inline struct inode *ceph_find_inode(struct super_block *sb,
#define CEPH_I_POOL_RD (1 << 4) /* can read from pool */ #define CEPH_I_POOL_RD (1 << 4) /* can read from pool */
#define CEPH_I_POOL_WR (1 << 5) /* can write to pool */ #define CEPH_I_POOL_WR (1 << 5) /* can write to pool */
#define CEPH_I_SEC_INITED (1 << 6) /* security initialized */ #define CEPH_I_SEC_INITED (1 << 6) /* security initialized */
#define CEPH_I_CAP_DROPPED (1 << 7) /* caps were forcibly dropped */ #define CEPH_I_KICK_FLUSH (1 << 7) /* kick flushing caps */
#define CEPH_I_KICK_FLUSH (1 << 8) /* kick flushing caps */ #define CEPH_I_FLUSH_SNAPS (1 << 8) /* need flush snapss */
#define CEPH_I_FLUSH_SNAPS (1 << 9) /* need flush snapss */ #define CEPH_I_ERROR_WRITE (1 << 9) /* have seen write errors */
#define CEPH_I_ERROR_WRITE (1 << 10) /* have seen write errors */ #define CEPH_I_ERROR_FILELOCK (1 << 10) /* have seen file lock errors */
#define CEPH_I_ERROR_FILELOCK (1 << 11) /* have seen file lock errors */ #define CEPH_I_ODIRECT (1 << 11) /* inode in direct I/O mode */
#define CEPH_I_ODIRECT (1 << 12) /* inode in direct I/O mode */ #define CEPH_ASYNC_CREATE_BIT (12) /* async create in flight for this */
#define CEPH_ASYNC_CREATE_BIT (13) /* async create in flight for this */
#define CEPH_I_ASYNC_CREATE (1 << CEPH_ASYNC_CREATE_BIT) #define CEPH_I_ASYNC_CREATE (1 << CEPH_ASYNC_CREATE_BIT)
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment