On Fri, Jan 5, 2018 at 6:47 PM, Luis Henriques <lhenriques@xxxxxxxx> wrote: > A cephfs-specific quota implementation has been available in the > user-space fuse client for a while. This quota implementation allows an > administrator to restrict the number of bytes and/or the number of files > in a filesystem subtree. This quota implementation, however, is > supported at the client-level only, which means that cooperation is > required between different clients accessing the system. > > This obviously assumes that all clients are trusted entities and will > respect the quotas, preventing users from exceeding the quota limits. > Since the kernel client doesn't support quotas, it has not been possible > to use it in a cluster where quotas are a requirement. > > This patchset adds kernel client support for cephfs quotas as it is > currently implemented in the ceph fuse client. Note however that it > relies on some still-to-be-merged changes to the MDS (see below, > "Changes since v1" for details). > > For further details on CephFS quota, see [1]. > > [1] http://docs.ceph.com/docs/master/cephfs/quota/ > > ** Changes since v3 ** > > - Rework after review from Yan, Zheng: > * ceph_handle_quota(): Always increment message sequence number, even > if inode isn't in cache > * renamed inode variables ino -> in > * get_quota_realm() now returns a ceph_snap_realm instead of > ceph_inode_info > > - Updated quota.c copyright and added SPDX identifier > > - Added max_bytes quota implementation > > - Updated Documentation/filesystems/ceph.txt to include reference to > quota; also documented added a few more comments to the code. > > ** Changes since v2 ** > > Rework after review from Yan, Zheng: > > - Dropped patch 0001 ("ceph: add seqlock for snaprealm hierarchy change > detection") and use mdsc->snap_rwsem for walking the snaprealm > hierarchy instead of adding a seqlock. This means that patches 0003 > and 0004 needed to be reworked. > > - Added a NULL check in ceph_handle_quota() after the inode lookup with > ceph_find_inode(). > > ** Changes since v1 ** > > Instead of trying to do a reverse path walk to find the "quota realm" > for a given directory, this patchset is now using snaprealms. Thus, for > testing it, a modified MDS is required: > > https://github.com/ukernel/ceph/tree/wip-cephfs-quota-realm > > This modified MDS creates a snaprealm when a quota is set in a > directory. This means that a client needs only to walk up the snaprealm > hierarchy to find a directory that has quotas instead of doing the full > reverse path walking. > > Note however that this requires an extra patch that adds a seqlock (1st > patch in series) to detect changes in the snaprealm hierarchy. > > Luis Henriques (6): > ceph: quota: add initial infrastructure to support cephfs quotas > ceph: quota: support for ceph.quota.max_files > ceph: quota: don't allow cross-quota renames > ceph: quota: support for ceph.quota.max_bytes > ceph: quota: update MDS when max_bytes is approaching > ceph: quota: add quotas to the in-tree cephfs documentation > > Documentation/filesystems/ceph.txt | 12 ++ > fs/ceph/Makefile | 2 +- > fs/ceph/dir.c | 16 +++ > fs/ceph/file.c | 21 ++- > fs/ceph/inode.c | 10 ++ > fs/ceph/mds_client.c | 23 ++++ > fs/ceph/mds_client.h | 2 + > fs/ceph/quota.c | 276 +++++++++++++++++++++++++++++++++++++ > fs/ceph/super.h | 14 ++ > fs/ceph/xattr.c | 44 ++++++ > include/linux/ceph/ceph_features.h | 3 +- > include/linux/ceph/ceph_fs.h | 17 +++ > 12 files changed, 437 insertions(+), 3 deletions(-) > create mode 100644 fs/ceph/quota.c > Hi Luis. This series looks good. I will add them to our testing branch if my local test goes well. I also wish to do some optimization (incremental patches) to the code 1. avoid quota check if there is no quota in the filesystem. we can use a variable to tracker how many snaprealm have quota enabled. 2. save inode pointer (not increase inode's reference count) in ceph_snap_realm data structure. so we can avoid calling ceph_find_inode() in check_quota_exceeded() Regards Yan, Zheng > -- > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html