A CephFS quota follow-up and fixes for two older issues in the
messenger layer, marked for stable. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJa4y7RAAoJEEp/3jgCEfOLaOAH/jLawBpY9He0fwyRoDctOZAb KwZyFfCl7XnThJiejMt864cJ0vjU6iufE+3kxFqUWEhOH4nhXYWNdNJ3Tgn1satY uwG5PJGYy+El0xL6C7IYeasy+y8wbtvYdjRqYEAnEzTH2xQ99GsN1QPMjySAacvQ ONz/11Mdj6C8bLfIsth4jcCkkC9TqlWYmyCds4GADN+a/Nw6vwT+ew88kgVDhBcD JUjFsBpxe+WtR7rKUhldd+lwngiJ3D4YCKLogJgaYAwVBJoK3lbdldd9FH9/JGyf 67Y2j/oOTPWCWnZuXtUw7dEvTCuW5QSMQJyXB1+vndsN1Y3mfWwlVMw1wREtQXs= =BShN -----END PGP SIGNATURE----- Merge tag 'ceph-for-4.17-rc3' of git://github.com/ceph/ceph-client Pull ceph fixes from Ilya Dryomov: "A CephFS quota follow-up and fixes for two older issues in the messenger layer, marked for stable" * tag 'ceph-for-4.17-rc3' of git://github.com/ceph/ceph-client: libceph: validate con->state at the top of try_write() libceph: reschedule a tick in finish_hunting() libceph: un-backoff on tick when we have a authenticated session ceph: check if mds create snaprealm when setting quota
This commit is contained in:
commit
64ebe3126c
3 changed files with 43 additions and 6 deletions
|
@ -228,7 +228,15 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val,
|
||||||
|
|
||||||
static bool ceph_vxattrcb_quota_exists(struct ceph_inode_info *ci)
|
static bool ceph_vxattrcb_quota_exists(struct ceph_inode_info *ci)
|
||||||
{
|
{
|
||||||
return (ci->i_max_files || ci->i_max_bytes);
|
bool ret = false;
|
||||||
|
spin_lock(&ci->i_ceph_lock);
|
||||||
|
if ((ci->i_max_files || ci->i_max_bytes) &&
|
||||||
|
ci->i_vino.snap == CEPH_NOSNAP &&
|
||||||
|
ci->i_snap_realm &&
|
||||||
|
ci->i_snap_realm->ino == ci->i_vino.ino)
|
||||||
|
ret = true;
|
||||||
|
spin_unlock(&ci->i_ceph_lock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t ceph_vxattrcb_quota(struct ceph_inode_info *ci, char *val,
|
static size_t ceph_vxattrcb_quota(struct ceph_inode_info *ci, char *val,
|
||||||
|
@ -1008,14 +1016,19 @@ int __ceph_setxattr(struct inode *inode, const char *name,
|
||||||
char *newval = NULL;
|
char *newval = NULL;
|
||||||
struct ceph_inode_xattr *xattr = NULL;
|
struct ceph_inode_xattr *xattr = NULL;
|
||||||
int required_blob_size;
|
int required_blob_size;
|
||||||
|
bool check_realm = false;
|
||||||
bool lock_snap_rwsem = false;
|
bool lock_snap_rwsem = false;
|
||||||
|
|
||||||
if (ceph_snap(inode) != CEPH_NOSNAP)
|
if (ceph_snap(inode) != CEPH_NOSNAP)
|
||||||
return -EROFS;
|
return -EROFS;
|
||||||
|
|
||||||
vxattr = ceph_match_vxattr(inode, name);
|
vxattr = ceph_match_vxattr(inode, name);
|
||||||
if (vxattr && vxattr->readonly)
|
if (vxattr) {
|
||||||
return -EOPNOTSUPP;
|
if (vxattr->readonly)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
if (value && !strncmp(vxattr->name, "ceph.quota", 10))
|
||||||
|
check_realm = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* pass any unhandled ceph.* xattrs through to the MDS */
|
/* pass any unhandled ceph.* xattrs through to the MDS */
|
||||||
if (!strncmp(name, XATTR_CEPH_PREFIX, XATTR_CEPH_PREFIX_LEN))
|
if (!strncmp(name, XATTR_CEPH_PREFIX, XATTR_CEPH_PREFIX_LEN))
|
||||||
|
@ -1109,6 +1122,15 @@ int __ceph_setxattr(struct inode *inode, const char *name,
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
} else {
|
} else {
|
||||||
err = ceph_sync_setxattr(inode, name, value, size, flags);
|
err = ceph_sync_setxattr(inode, name, value, size, flags);
|
||||||
|
if (err >= 0 && check_realm) {
|
||||||
|
/* check if snaprealm was created for quota inode */
|
||||||
|
spin_lock(&ci->i_ceph_lock);
|
||||||
|
if ((ci->i_max_files || ci->i_max_bytes) &&
|
||||||
|
!(ci->i_snap_realm &&
|
||||||
|
ci->i_snap_realm->ino == ci->i_vino.ino))
|
||||||
|
err = -EOPNOTSUPP;
|
||||||
|
spin_unlock(&ci->i_ceph_lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
ceph_free_cap_flush(prealloc_cf);
|
ceph_free_cap_flush(prealloc_cf);
|
||||||
|
|
|
@ -2569,6 +2569,11 @@ static int try_write(struct ceph_connection *con)
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
dout("try_write start %p state %lu\n", con, con->state);
|
dout("try_write start %p state %lu\n", con, con->state);
|
||||||
|
if (con->state != CON_STATE_PREOPEN &&
|
||||||
|
con->state != CON_STATE_CONNECTING &&
|
||||||
|
con->state != CON_STATE_NEGOTIATING &&
|
||||||
|
con->state != CON_STATE_OPEN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
more:
|
more:
|
||||||
dout("try_write out_kvec_bytes %d\n", con->out_kvec_bytes);
|
dout("try_write out_kvec_bytes %d\n", con->out_kvec_bytes);
|
||||||
|
@ -2594,6 +2599,8 @@ static int try_write(struct ceph_connection *con)
|
||||||
}
|
}
|
||||||
|
|
||||||
more_kvec:
|
more_kvec:
|
||||||
|
BUG_ON(!con->sock);
|
||||||
|
|
||||||
/* kvec data queued? */
|
/* kvec data queued? */
|
||||||
if (con->out_kvec_left) {
|
if (con->out_kvec_left) {
|
||||||
ret = write_partial_kvec(con);
|
ret = write_partial_kvec(con);
|
||||||
|
|
|
@ -209,6 +209,14 @@ static void reopen_session(struct ceph_mon_client *monc)
|
||||||
__open_session(monc);
|
__open_session(monc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void un_backoff(struct ceph_mon_client *monc)
|
||||||
|
{
|
||||||
|
monc->hunt_mult /= 2; /* reduce by 50% */
|
||||||
|
if (monc->hunt_mult < 1)
|
||||||
|
monc->hunt_mult = 1;
|
||||||
|
dout("%s hunt_mult now %d\n", __func__, monc->hunt_mult);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reschedule delayed work timer.
|
* Reschedule delayed work timer.
|
||||||
*/
|
*/
|
||||||
|
@ -963,6 +971,7 @@ static void delayed_work(struct work_struct *work)
|
||||||
if (!monc->hunting) {
|
if (!monc->hunting) {
|
||||||
ceph_con_keepalive(&monc->con);
|
ceph_con_keepalive(&monc->con);
|
||||||
__validate_auth(monc);
|
__validate_auth(monc);
|
||||||
|
un_backoff(monc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_auth &&
|
if (is_auth &&
|
||||||
|
@ -1123,9 +1132,8 @@ static void finish_hunting(struct ceph_mon_client *monc)
|
||||||
dout("%s found mon%d\n", __func__, monc->cur_mon);
|
dout("%s found mon%d\n", __func__, monc->cur_mon);
|
||||||
monc->hunting = false;
|
monc->hunting = false;
|
||||||
monc->had_a_connection = true;
|
monc->had_a_connection = true;
|
||||||
monc->hunt_mult /= 2; /* reduce by 50% */
|
un_backoff(monc);
|
||||||
if (monc->hunt_mult < 1)
|
__schedule_delayed(monc);
|
||||||
monc->hunt_mult = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue