1fb18a575SLuis Henriques // SPDX-License-Identifier: GPL-2.0 2fb18a575SLuis Henriques /* 3fb18a575SLuis Henriques * quota.c - CephFS quota 4fb18a575SLuis Henriques * 5fb18a575SLuis Henriques * Copyright (C) 2017-2018 SUSE 6fb18a575SLuis Henriques * 7fb18a575SLuis Henriques * This program is free software; you can redistribute it and/or 8fb18a575SLuis Henriques * modify it under the terms of the GNU General Public License 9fb18a575SLuis Henriques * as published by the Free Software Foundation; either version 2 10fb18a575SLuis Henriques * of the License, or (at your option) any later version. 11fb18a575SLuis Henriques * 12fb18a575SLuis Henriques * This program is distributed in the hope that it will be useful, 13fb18a575SLuis Henriques * but WITHOUT ANY WARRANTY; without even the implied warranty of 14fb18a575SLuis Henriques * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15fb18a575SLuis Henriques * GNU General Public License for more details. 16fb18a575SLuis Henriques * 17fb18a575SLuis Henriques * You should have received a copy of the GNU General Public License 18fb18a575SLuis Henriques * along with this program; if not, see <http://www.gnu.org/licenses/>. 19fb18a575SLuis Henriques */ 20fb18a575SLuis Henriques 21fb18a575SLuis Henriques #include "super.h" 22fb18a575SLuis Henriques #include "mds_client.h" 23fb18a575SLuis Henriques 24fb18a575SLuis Henriques void ceph_handle_quota(struct ceph_mds_client *mdsc, 25fb18a575SLuis Henriques struct ceph_mds_session *session, 26fb18a575SLuis Henriques struct ceph_msg *msg) 27fb18a575SLuis Henriques { 28fb18a575SLuis Henriques struct super_block *sb = mdsc->fsc->sb; 29fb18a575SLuis Henriques struct ceph_mds_quota *h = msg->front.iov_base; 30fb18a575SLuis Henriques struct ceph_vino vino; 31fb18a575SLuis Henriques struct inode *inode; 32fb18a575SLuis Henriques struct ceph_inode_info *ci; 33fb18a575SLuis Henriques 34fb18a575SLuis Henriques if (msg->front.iov_len != sizeof(*h)) { 35fb18a575SLuis Henriques pr_err("%s corrupt message mds%d len %d\n", __func__, 36fb18a575SLuis Henriques session->s_mds, (int)msg->front.iov_len); 37fb18a575SLuis Henriques ceph_msg_dump(msg); 38fb18a575SLuis Henriques return; 39fb18a575SLuis Henriques } 40fb18a575SLuis Henriques 41fb18a575SLuis Henriques /* increment msg sequence number */ 42fb18a575SLuis Henriques mutex_lock(&session->s_mutex); 43fb18a575SLuis Henriques session->s_seq++; 44fb18a575SLuis Henriques mutex_unlock(&session->s_mutex); 45fb18a575SLuis Henriques 46fb18a575SLuis Henriques /* lookup inode */ 47fb18a575SLuis Henriques vino.ino = le64_to_cpu(h->ino); 48fb18a575SLuis Henriques vino.snap = CEPH_NOSNAP; 49fb18a575SLuis Henriques inode = ceph_find_inode(sb, vino); 50fb18a575SLuis Henriques if (!inode) { 51fb18a575SLuis Henriques pr_warn("Failed to find inode %llu\n", vino.ino); 52fb18a575SLuis Henriques return; 53fb18a575SLuis Henriques } 54fb18a575SLuis Henriques ci = ceph_inode(inode); 55fb18a575SLuis Henriques 56fb18a575SLuis Henriques spin_lock(&ci->i_ceph_lock); 57fb18a575SLuis Henriques ci->i_rbytes = le64_to_cpu(h->rbytes); 58fb18a575SLuis Henriques ci->i_rfiles = le64_to_cpu(h->rfiles); 59fb18a575SLuis Henriques ci->i_rsubdirs = le64_to_cpu(h->rsubdirs); 60fb18a575SLuis Henriques ci->i_max_bytes = le64_to_cpu(h->max_bytes); 61fb18a575SLuis Henriques ci->i_max_files = le64_to_cpu(h->max_files); 62fb18a575SLuis Henriques spin_unlock(&ci->i_ceph_lock); 63fb18a575SLuis Henriques 64fb18a575SLuis Henriques iput(inode); 65fb18a575SLuis Henriques } 66