linux/fs/ocfs2/quota_global.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *  Implementation of operations over global quota file
   4 */
   5#include <linux/spinlock.h>
   6#include <linux/fs.h>
   7#include <linux/slab.h>
   8#include <linux/quota.h>
   9#include <linux/quotaops.h>
  10#include <linux/dqblk_qtree.h>
  11#include <linux/jiffies.h>
  12#include <linux/writeback.h>
  13#include <linux/workqueue.h>
  14#include <linux/llist.h>
  15#include <linux/iversion.h>
  16
  17#include <cluster/masklog.h>
  18
  19#include "ocfs2_fs.h"
  20#include "ocfs2.h"
  21#include "alloc.h"
  22#include "blockcheck.h"
  23#include "inode.h"
  24#include "journal.h"
  25#include "file.h"
  26#include "sysfile.h"
  27#include "dlmglue.h"
  28#include "uptodate.h"
  29#include "super.h"
  30#include "buffer_head_io.h"
  31#include "quota.h"
  32#include "ocfs2_trace.h"
  33
  34/*
  35 * Locking of quotas with OCFS2 is rather complex. Here are rules that
  36 * should be obeyed by all the functions:
  37 * - any write of quota structure (either to local or global file) is protected
  38 *   by dqio_sem or dquot->dq_lock.
  39 * - any modification of global quota file holds inode cluster lock, i_mutex,
  40 *   and ip_alloc_sem of the global quota file (achieved by
  41 *   ocfs2_lock_global_qf). It also has to hold qinfo_lock.
  42 * - an allocation of new blocks for local quota file is protected by
  43 *   its ip_alloc_sem
  44 *
  45 * A rough sketch of locking dependencies (lf = local file, gf = global file):
  46 * Normal filesystem operation:
  47 *   start_trans -> dqio_sem -> write to lf
  48 * Syncing of local and global file:
  49 *   ocfs2_lock_global_qf -> start_trans -> dqio_sem -> qinfo_lock ->
  50 *     write to gf
  51 *                                                     -> write to lf
  52 * Acquire dquot for the first time:
  53 *   dq_lock -> ocfs2_lock_global_qf -> qinfo_lock -> read from gf
  54 *                                   -> alloc space for gf
  55 *                                   -> start_trans -> qinfo_lock -> write to gf
  56 *           -> ip_alloc_sem of lf -> alloc space for lf
  57 *           -> write to lf
  58 * Release last reference to dquot:
  59 *   dq_lock -> ocfs2_lock_global_qf -> start_trans -> qinfo_lock -> write to gf
  60 *           -> write to lf
  61 * Note that all the above operations also hold the inode cluster lock of lf.
  62 * Recovery:
  63 *   inode cluster lock of recovered lf
  64 *     -> read bitmaps -> ip_alloc_sem of lf
  65 *     -> ocfs2_lock_global_qf -> start_trans -> dqio_sem -> qinfo_lock ->
  66 *        write to gf
  67 */
  68
  69static void qsync_work_fn(struct work_struct *work);
  70
  71static void ocfs2_global_disk2memdqb(struct dquot *dquot, void *dp)
  72{
  73        struct ocfs2_global_disk_dqblk *d = dp;
  74        struct mem_dqblk *m = &dquot->dq_dqb;
  75
  76        /* Update from disk only entries not set by the admin */
  77        if (!test_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags)) {
  78                m->dqb_ihardlimit = le64_to_cpu(d->dqb_ihardlimit);
  79                m->dqb_isoftlimit = le64_to_cpu(d->dqb_isoftlimit);
  80        }
  81        if (!test_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags))
  82                m->dqb_curinodes = le64_to_cpu(d->dqb_curinodes);
  83        if (!test_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags)) {
  84                m->dqb_bhardlimit = le64_to_cpu(d->dqb_bhardlimit);
  85                m->dqb_bsoftlimit = le64_to_cpu(d->dqb_bsoftlimit);
  86        }
  87        if (!test_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags))
  88                m->dqb_curspace = le64_to_cpu(d->dqb_curspace);
  89        if (!test_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags))
  90                m->dqb_btime = le64_to_cpu(d->dqb_btime);
  91        if (!test_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags))
  92                m->dqb_itime = le64_to_cpu(d->dqb_itime);
  93        OCFS2_DQUOT(dquot)->dq_use_count = le32_to_cpu(d->dqb_use_count);
  94}
  95
  96static void ocfs2_global_mem2diskdqb(void *dp, struct dquot *dquot)
  97{
  98        struct ocfs2_global_disk_dqblk *d = dp;
  99        struct mem_dqblk *m = &dquot->dq_dqb;
 100
 101        d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id));
 102        d->dqb_use_count = cpu_to_le32(OCFS2_DQUOT(dquot)->dq_use_count);
 103        d->dqb_ihardlimit = cpu_to_le64(m->dqb_ihardlimit);
 104        d->dqb_isoftlimit = cpu_to_le64(m->dqb_isoftlimit);
 105        d->dqb_curinodes = cpu_to_le64(m->dqb_curinodes);
 106        d->dqb_bhardlimit = cpu_to_le64(m->dqb_bhardlimit);
 107        d->dqb_bsoftlimit = cpu_to_le64(m->dqb_bsoftlimit);
 108        d->dqb_curspace = cpu_to_le64(m->dqb_curspace);
 109        d->dqb_btime = cpu_to_le64(m->dqb_btime);
 110        d->dqb_itime = cpu_to_le64(m->dqb_itime);
 111        d->dqb_pad1 = d->dqb_pad2 = 0;
 112}
 113
 114static int ocfs2_global_is_id(void *dp, struct dquot *dquot)
 115{
 116        struct ocfs2_global_disk_dqblk *d = dp;
 117        struct ocfs2_mem_dqinfo *oinfo =
 118                        sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv;
 119
 120        if (qtree_entry_unused(&oinfo->dqi_gi, dp))
 121                return 0;
 122
 123        return qid_eq(make_kqid(&init_user_ns, dquot->dq_id.type,
 124                                le32_to_cpu(d->dqb_id)),
 125                      dquot->dq_id);
 126}
 127
 128const struct qtree_fmt_operations ocfs2_global_ops = {
 129        .mem2disk_dqblk = ocfs2_global_mem2diskdqb,
 130        .disk2mem_dqblk = ocfs2_global_disk2memdqb,
 131        .is_id = ocfs2_global_is_id,
 132};
 133
 134int ocfs2_validate_quota_block(struct super_block *sb, struct buffer_head *bh)
 135{
 136        struct ocfs2_disk_dqtrailer *dqt =
 137                ocfs2_block_dqtrailer(sb->s_blocksize, bh->b_data);
 138
 139        trace_ocfs2_validate_quota_block((unsigned long long)bh->b_blocknr);
 140
 141        BUG_ON(!buffer_uptodate(bh));
 142
 143        /*
 144         * If the ecc fails, we return the error but otherwise
 145         * leave the filesystem running.  We know any error is
 146         * local to this block.
 147         */
 148        return ocfs2_validate_meta_ecc(sb, bh->b_data, &dqt->dq_check);
 149}
 150
 151int ocfs2_read_quota_phys_block(struct inode *inode, u64 p_block,
 152                                struct buffer_head **bhp)
 153{
 154        int rc;
 155
 156        *bhp = NULL;
 157        rc = ocfs2_read_blocks(INODE_CACHE(inode), p_block, 1, bhp, 0,
 158                               ocfs2_validate_quota_block);
 159        if (rc)
 160                mlog_errno(rc);
 161        return rc;
 162}
 163
 164/* Read data from global quotafile - avoid pagecache and such because we cannot
 165 * afford acquiring the locks... We use quota cluster lock to serialize
 166 * operations. Caller is responsible for acquiring it. */
 167ssize_t ocfs2_quota_read(struct super_block *sb, int type, char *data,
 168                         size_t len, loff_t off)
 169{
 170        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 171        struct inode *gqinode = oinfo->dqi_gqinode;
 172        loff_t i_size = i_size_read(gqinode);
 173        int offset = off & (sb->s_blocksize - 1);
 174        sector_t blk = off >> sb->s_blocksize_bits;
 175        int err = 0;
 176        struct buffer_head *bh;
 177        size_t toread, tocopy;
 178        u64 pblock = 0, pcount = 0;
 179
 180        if (off > i_size)
 181                return 0;
 182        if (off + len > i_size)
 183                len = i_size - off;
 184        toread = len;
 185        while (toread > 0) {
 186                tocopy = min_t(size_t, (sb->s_blocksize - offset), toread);
 187                if (!pcount) {
 188                        err = ocfs2_extent_map_get_blocks(gqinode, blk, &pblock,
 189                                                          &pcount, NULL);
 190                        if (err) {
 191                                mlog_errno(err);
 192                                return err;
 193                        }
 194                } else {
 195                        pcount--;
 196                        pblock++;
 197                }
 198                bh = NULL;
 199                err = ocfs2_read_quota_phys_block(gqinode, pblock, &bh);
 200                if (err) {
 201                        mlog_errno(err);
 202                        return err;
 203                }
 204                memcpy(data, bh->b_data + offset, tocopy);
 205                brelse(bh);
 206                offset = 0;
 207                toread -= tocopy;
 208                data += tocopy;
 209                blk++;
 210        }
 211        return len;
 212}
 213
 214/* Write to quotafile (we know the transaction is already started and has
 215 * enough credits) */
 216ssize_t ocfs2_quota_write(struct super_block *sb, int type,
 217                          const char *data, size_t len, loff_t off)
 218{
 219        struct mem_dqinfo *info = sb_dqinfo(sb, type);
 220        struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
 221        struct inode *gqinode = oinfo->dqi_gqinode;
 222        int offset = off & (sb->s_blocksize - 1);
 223        sector_t blk = off >> sb->s_blocksize_bits;
 224        int err = 0, new = 0, ja_type;
 225        struct buffer_head *bh = NULL;
 226        handle_t *handle = journal_current_handle();
 227        u64 pblock, pcount;
 228
 229        if (!handle) {
 230                mlog(ML_ERROR, "Quota write (off=%llu, len=%llu) cancelled "
 231                     "because transaction was not started.\n",
 232                     (unsigned long long)off, (unsigned long long)len);
 233                return -EIO;
 234        }
 235        if (len > sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE - offset) {
 236                WARN_ON(1);
 237                len = sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE - offset;
 238        }
 239
 240        if (i_size_read(gqinode) < off + len) {
 241                loff_t rounded_end =
 242                                ocfs2_align_bytes_to_blocks(sb, off + len);
 243
 244                /* Space is already allocated in ocfs2_acquire_dquot() */
 245                err = ocfs2_simple_size_update(gqinode,
 246                                               oinfo->dqi_gqi_bh,
 247                                               rounded_end);
 248                if (err < 0)
 249                        goto out;
 250                new = 1;
 251        }
 252        err = ocfs2_extent_map_get_blocks(gqinode, blk, &pblock, &pcount, NULL);
 253        if (err) {
 254                mlog_errno(err);
 255                goto out;
 256        }
 257        /* Not rewriting whole block? */
 258        if ((offset || len < sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) &&
 259            !new) {
 260                err = ocfs2_read_quota_phys_block(gqinode, pblock, &bh);
 261                ja_type = OCFS2_JOURNAL_ACCESS_WRITE;
 262        } else {
 263                bh = sb_getblk(sb, pblock);
 264                if (!bh)
 265                        err = -ENOMEM;
 266                ja_type = OCFS2_JOURNAL_ACCESS_CREATE;
 267        }
 268        if (err) {
 269                mlog_errno(err);
 270                goto out;
 271        }
 272        lock_buffer(bh);
 273        if (new)
 274                memset(bh->b_data, 0, sb->s_blocksize);
 275        memcpy(bh->b_data + offset, data, len);
 276        flush_dcache_page(bh->b_page);
 277        set_buffer_uptodate(bh);
 278        unlock_buffer(bh);
 279        ocfs2_set_buffer_uptodate(INODE_CACHE(gqinode), bh);
 280        err = ocfs2_journal_access_dq(handle, INODE_CACHE(gqinode), bh,
 281                                      ja_type);
 282        if (err < 0) {
 283                brelse(bh);
 284                goto out;
 285        }
 286        ocfs2_journal_dirty(handle, bh);
 287        brelse(bh);
 288out:
 289        if (err) {
 290                mlog_errno(err);
 291                return err;
 292        }
 293        inode_inc_iversion(gqinode);
 294        ocfs2_mark_inode_dirty(handle, gqinode, oinfo->dqi_gqi_bh);
 295        return len;
 296}
 297
 298int ocfs2_lock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex)
 299{
 300        int status;
 301        struct buffer_head *bh = NULL;
 302
 303        status = ocfs2_inode_lock(oinfo->dqi_gqinode, &bh, ex);
 304        if (status < 0)
 305                return status;
 306        spin_lock(&dq_data_lock);
 307        if (!oinfo->dqi_gqi_count++)
 308                oinfo->dqi_gqi_bh = bh;
 309        else
 310                WARN_ON(bh != oinfo->dqi_gqi_bh);
 311        spin_unlock(&dq_data_lock);
 312        if (ex) {
 313                inode_lock(oinfo->dqi_gqinode);
 314                down_write(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem);
 315        } else {
 316                down_read(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem);
 317        }
 318        return 0;
 319}
 320
 321void ocfs2_unlock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex)
 322{
 323        if (ex) {
 324                up_write(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem);
 325                inode_unlock(oinfo->dqi_gqinode);
 326        } else {
 327                up_read(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem);
 328        }
 329        ocfs2_inode_unlock(oinfo->dqi_gqinode, ex);
 330        brelse(oinfo->dqi_gqi_bh);
 331        spin_lock(&dq_data_lock);
 332        if (!--oinfo->dqi_gqi_count)
 333                oinfo->dqi_gqi_bh = NULL;
 334        spin_unlock(&dq_data_lock);
 335}
 336
 337/* Read information header from global quota file */
 338int ocfs2_global_read_info(struct super_block *sb, int type)
 339{
 340        struct inode *gqinode = NULL;
 341        unsigned int ino[OCFS2_MAXQUOTAS] = { USER_QUOTA_SYSTEM_INODE,
 342                                              GROUP_QUOTA_SYSTEM_INODE };
 343        struct ocfs2_global_disk_dqinfo dinfo;
 344        struct mem_dqinfo *info = sb_dqinfo(sb, type);
 345        struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
 346        u64 pcount;
 347        int status;
 348
 349        /* Read global header */
 350        gqinode = ocfs2_get_system_file_inode(OCFS2_SB(sb), ino[type],
 351                        OCFS2_INVALID_SLOT);
 352        if (!gqinode) {
 353                mlog(ML_ERROR, "failed to get global quota inode (type=%d)\n",
 354                        type);
 355                status = -EINVAL;
 356                goto out_err;
 357        }
 358        oinfo->dqi_gi.dqi_sb = sb;
 359        oinfo->dqi_gi.dqi_type = type;
 360        ocfs2_qinfo_lock_res_init(&oinfo->dqi_gqlock, oinfo);
 361        oinfo->dqi_gi.dqi_entry_size = sizeof(struct ocfs2_global_disk_dqblk);
 362        oinfo->dqi_gi.dqi_ops = &ocfs2_global_ops;
 363        oinfo->dqi_gqi_bh = NULL;
 364        oinfo->dqi_gqi_count = 0;
 365        oinfo->dqi_gqinode = gqinode;
 366        status = ocfs2_lock_global_qf(oinfo, 0);
 367        if (status < 0) {
 368                mlog_errno(status);
 369                goto out_err;
 370        }
 371
 372        status = ocfs2_extent_map_get_blocks(gqinode, 0, &oinfo->dqi_giblk,
 373                                             &pcount, NULL);
 374        if (status < 0)
 375                goto out_unlock;
 376
 377        status = ocfs2_qinfo_lock(oinfo, 0);
 378        if (status < 0)
 379                goto out_unlock;
 380        status = sb->s_op->quota_read(sb, type, (char *)&dinfo,
 381                                      sizeof(struct ocfs2_global_disk_dqinfo),
 382                                      OCFS2_GLOBAL_INFO_OFF);
 383        ocfs2_qinfo_unlock(oinfo, 0);
 384        ocfs2_unlock_global_qf(oinfo, 0);
 385        if (status != sizeof(struct ocfs2_global_disk_dqinfo)) {
 386                mlog(ML_ERROR, "Cannot read global quota info (%d).\n",
 387                     status);
 388                if (status >= 0)
 389                        status = -EIO;
 390                mlog_errno(status);
 391                goto out_err;
 392        }
 393        info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace);
 394        info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace);
 395        oinfo->dqi_syncms = le32_to_cpu(dinfo.dqi_syncms);
 396        oinfo->dqi_gi.dqi_blocks = le32_to_cpu(dinfo.dqi_blocks);
 397        oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk);
 398        oinfo->dqi_gi.dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry);
 399        oinfo->dqi_gi.dqi_blocksize_bits = sb->s_blocksize_bits;
 400        oinfo->dqi_gi.dqi_usable_bs = sb->s_blocksize -
 401                                                OCFS2_QBLK_RESERVED_SPACE;
 402        oinfo->dqi_gi.dqi_qtree_depth = qtree_depth(&oinfo->dqi_gi);
 403        INIT_DELAYED_WORK(&oinfo->dqi_sync_work, qsync_work_fn);
 404        schedule_delayed_work(&oinfo->dqi_sync_work,
 405                              msecs_to_jiffies(oinfo->dqi_syncms));
 406
 407out_err:
 408        return status;
 409out_unlock:
 410        ocfs2_unlock_global_qf(oinfo, 0);
 411        mlog_errno(status);
 412        goto out_err;
 413}
 414
 415/* Write information to global quota file. Expects exlusive lock on quota
 416 * file inode and quota info */
 417static int __ocfs2_global_write_info(struct super_block *sb, int type)
 418{
 419        struct mem_dqinfo *info = sb_dqinfo(sb, type);
 420        struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
 421        struct ocfs2_global_disk_dqinfo dinfo;
 422        ssize_t size;
 423
 424        spin_lock(&dq_data_lock);
 425        info->dqi_flags &= ~DQF_INFO_DIRTY;
 426        dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace);
 427        dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace);
 428        spin_unlock(&dq_data_lock);
 429        dinfo.dqi_syncms = cpu_to_le32(oinfo->dqi_syncms);
 430        dinfo.dqi_blocks = cpu_to_le32(oinfo->dqi_gi.dqi_blocks);
 431        dinfo.dqi_free_blk = cpu_to_le32(oinfo->dqi_gi.dqi_free_blk);
 432        dinfo.dqi_free_entry = cpu_to_le32(oinfo->dqi_gi.dqi_free_entry);
 433        size = sb->s_op->quota_write(sb, type, (char *)&dinfo,
 434                                     sizeof(struct ocfs2_global_disk_dqinfo),
 435                                     OCFS2_GLOBAL_INFO_OFF);
 436        if (size != sizeof(struct ocfs2_global_disk_dqinfo)) {
 437                mlog(ML_ERROR, "Cannot write global quota info structure\n");
 438                if (size >= 0)
 439                        size = -EIO;
 440                return size;
 441        }
 442        return 0;
 443}
 444
 445int ocfs2_global_write_info(struct super_block *sb, int type)
 446{
 447        int err;
 448        struct quota_info *dqopt = sb_dqopt(sb);
 449        struct ocfs2_mem_dqinfo *info = dqopt->info[type].dqi_priv;
 450
 451        down_write(&dqopt->dqio_sem);
 452        err = ocfs2_qinfo_lock(info, 1);
 453        if (err < 0)
 454                goto out_sem;
 455        err = __ocfs2_global_write_info(sb, type);
 456        ocfs2_qinfo_unlock(info, 1);
 457out_sem:
 458        up_write(&dqopt->dqio_sem);
 459        return err;
 460}
 461
 462static int ocfs2_global_qinit_alloc(struct super_block *sb, int type)
 463{
 464        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 465
 466        /*
 467         * We may need to allocate tree blocks and a leaf block but not the
 468         * root block
 469         */
 470        return oinfo->dqi_gi.dqi_qtree_depth;
 471}
 472
 473static int ocfs2_calc_global_qinit_credits(struct super_block *sb, int type)
 474{
 475        /* We modify all the allocated blocks, tree root, info block and
 476         * the inode */
 477        return (ocfs2_global_qinit_alloc(sb, type) + 2) *
 478                        OCFS2_QUOTA_BLOCK_UPDATE_CREDITS + 1;
 479}
 480
 481/* Sync local information about quota modifications with global quota file.
 482 * Caller must have started the transaction and obtained exclusive lock for
 483 * global quota file inode */
 484int __ocfs2_sync_dquot(struct dquot *dquot, int freeing)
 485{
 486        int err, err2;
 487        struct super_block *sb = dquot->dq_sb;
 488        int type = dquot->dq_id.type;
 489        struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv;
 490        struct ocfs2_global_disk_dqblk dqblk;
 491        s64 spacechange, inodechange;
 492        time64_t olditime, oldbtime;
 493
 494        err = sb->s_op->quota_read(sb, type, (char *)&dqblk,
 495                                   sizeof(struct ocfs2_global_disk_dqblk),
 496                                   dquot->dq_off);
 497        if (err != sizeof(struct ocfs2_global_disk_dqblk)) {
 498                if (err >= 0) {
 499                        mlog(ML_ERROR, "Short read from global quota file "
 500                                       "(%u read)\n", err);
 501                        err = -EIO;
 502                }
 503                goto out;
 504        }
 505
 506        /* Update space and inode usage. Get also other information from
 507         * global quota file so that we don't overwrite any changes there.
 508         * We are */
 509        spin_lock(&dquot->dq_dqb_lock);
 510        spacechange = dquot->dq_dqb.dqb_curspace -
 511                                        OCFS2_DQUOT(dquot)->dq_origspace;
 512        inodechange = dquot->dq_dqb.dqb_curinodes -
 513                                        OCFS2_DQUOT(dquot)->dq_originodes;
 514        olditime = dquot->dq_dqb.dqb_itime;
 515        oldbtime = dquot->dq_dqb.dqb_btime;
 516        ocfs2_global_disk2memdqb(dquot, &dqblk);
 517        trace_ocfs2_sync_dquot(from_kqid(&init_user_ns, dquot->dq_id),
 518                               dquot->dq_dqb.dqb_curspace,
 519                               (long long)spacechange,
 520                               dquot->dq_dqb.dqb_curinodes,
 521                               (long long)inodechange);
 522        if (!test_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags))
 523                dquot->dq_dqb.dqb_curspace += spacechange;
 524        if (!test_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags))
 525                dquot->dq_dqb.dqb_curinodes += inodechange;
 526        /* Set properly space grace time... */
 527        if (dquot->dq_dqb.dqb_bsoftlimit &&
 528            dquot->dq_dqb.dqb_curspace > dquot->dq_dqb.dqb_bsoftlimit) {
 529                if (!test_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags) &&
 530                    oldbtime > 0) {
 531                        if (dquot->dq_dqb.dqb_btime > 0)
 532                                dquot->dq_dqb.dqb_btime =
 533                                        min(dquot->dq_dqb.dqb_btime, oldbtime);
 534                        else
 535                                dquot->dq_dqb.dqb_btime = oldbtime;
 536                }
 537        } else {
 538                dquot->dq_dqb.dqb_btime = 0;
 539                clear_bit(DQ_BLKS_B, &dquot->dq_flags);
 540        }
 541        /* Set properly inode grace time... */
 542        if (dquot->dq_dqb.dqb_isoftlimit &&
 543            dquot->dq_dqb.dqb_curinodes > dquot->dq_dqb.dqb_isoftlimit) {
 544                if (!test_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags) &&
 545                    olditime > 0) {
 546                        if (dquot->dq_dqb.dqb_itime > 0)
 547                                dquot->dq_dqb.dqb_itime =
 548                                        min(dquot->dq_dqb.dqb_itime, olditime);
 549                        else
 550                                dquot->dq_dqb.dqb_itime = olditime;
 551                }
 552        } else {
 553                dquot->dq_dqb.dqb_itime = 0;
 554                clear_bit(DQ_INODES_B, &dquot->dq_flags);
 555        }
 556        /* All information is properly updated, clear the flags */
 557        __clear_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags);
 558        __clear_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags);
 559        __clear_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags);
 560        __clear_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags);
 561        __clear_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags);
 562        __clear_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags);
 563        OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace;
 564        OCFS2_DQUOT(dquot)->dq_originodes = dquot->dq_dqb.dqb_curinodes;
 565        spin_unlock(&dquot->dq_dqb_lock);
 566        err = ocfs2_qinfo_lock(info, freeing);
 567        if (err < 0) {
 568                mlog(ML_ERROR, "Failed to lock quota info, losing quota write"
 569                               " (type=%d, id=%u)\n", dquot->dq_id.type,
 570                               (unsigned)from_kqid(&init_user_ns, dquot->dq_id));
 571                goto out;
 572        }
 573        if (freeing)
 574                OCFS2_DQUOT(dquot)->dq_use_count--;
 575        err = qtree_write_dquot(&info->dqi_gi, dquot);
 576        if (err < 0)
 577                goto out_qlock;
 578        if (freeing && !OCFS2_DQUOT(dquot)->dq_use_count) {
 579                err = qtree_release_dquot(&info->dqi_gi, dquot);
 580                if (info_dirty(sb_dqinfo(sb, type))) {
 581                        err2 = __ocfs2_global_write_info(sb, type);
 582                        if (!err)
 583                                err = err2;
 584                }
 585        }
 586out_qlock:
 587        ocfs2_qinfo_unlock(info, freeing);
 588out:
 589        if (err < 0)
 590                mlog_errno(err);
 591        return err;
 592}
 593
 594/*
 595 *  Functions for periodic syncing of dquots with global file
 596 */
 597static int ocfs2_sync_dquot_helper(struct dquot *dquot, unsigned long type)
 598{
 599        handle_t *handle;
 600        struct super_block *sb = dquot->dq_sb;
 601        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 602        struct ocfs2_super *osb = OCFS2_SB(sb);
 603        int status = 0;
 604
 605        trace_ocfs2_sync_dquot_helper(from_kqid(&init_user_ns, dquot->dq_id),
 606                                      dquot->dq_id.type,
 607                                      type, sb->s_id);
 608        if (type != dquot->dq_id.type)
 609                goto out;
 610        status = ocfs2_lock_global_qf(oinfo, 1);
 611        if (status < 0)
 612                goto out;
 613
 614        handle = ocfs2_start_trans(osb, OCFS2_QSYNC_CREDITS);
 615        if (IS_ERR(handle)) {
 616                status = PTR_ERR(handle);
 617                mlog_errno(status);
 618                goto out_ilock;
 619        }
 620        down_write(&sb_dqopt(sb)->dqio_sem);
 621        status = ocfs2_sync_dquot(dquot);
 622        if (status < 0)
 623                mlog_errno(status);
 624        /* We have to write local structure as well... */
 625        status = ocfs2_local_write_dquot(dquot);
 626        if (status < 0)
 627                mlog_errno(status);
 628        up_write(&sb_dqopt(sb)->dqio_sem);
 629        ocfs2_commit_trans(osb, handle);
 630out_ilock:
 631        ocfs2_unlock_global_qf(oinfo, 1);
 632out:
 633        return status;
 634}
 635
 636static void qsync_work_fn(struct work_struct *work)
 637{
 638        struct ocfs2_mem_dqinfo *oinfo = container_of(work,
 639                                                      struct ocfs2_mem_dqinfo,
 640                                                      dqi_sync_work.work);
 641        struct super_block *sb = oinfo->dqi_gqinode->i_sb;
 642
 643        /*
 644         * We have to be careful here not to deadlock on s_umount as umount
 645         * disabling quotas may be in progress and it waits for this work to
 646         * complete. If trylock fails, we'll do the sync next time...
 647         */
 648        if (down_read_trylock(&sb->s_umount)) {
 649                dquot_scan_active(sb, ocfs2_sync_dquot_helper, oinfo->dqi_type);
 650                up_read(&sb->s_umount);
 651        }
 652        schedule_delayed_work(&oinfo->dqi_sync_work,
 653                              msecs_to_jiffies(oinfo->dqi_syncms));
 654}
 655
 656/*
 657 *  Wrappers for generic quota functions
 658 */
 659
 660static int ocfs2_write_dquot(struct dquot *dquot)
 661{
 662        handle_t *handle;
 663        struct ocfs2_super *osb = OCFS2_SB(dquot->dq_sb);
 664        int status = 0;
 665
 666        trace_ocfs2_write_dquot(from_kqid(&init_user_ns, dquot->dq_id),
 667                                dquot->dq_id.type);
 668
 669        handle = ocfs2_start_trans(osb, OCFS2_QWRITE_CREDITS);
 670        if (IS_ERR(handle)) {
 671                status = PTR_ERR(handle);
 672                mlog_errno(status);
 673                goto out;
 674        }
 675        down_write(&sb_dqopt(dquot->dq_sb)->dqio_sem);
 676        status = ocfs2_local_write_dquot(dquot);
 677        up_write(&sb_dqopt(dquot->dq_sb)->dqio_sem);
 678        ocfs2_commit_trans(osb, handle);
 679out:
 680        return status;
 681}
 682
 683static int ocfs2_calc_qdel_credits(struct super_block *sb, int type)
 684{
 685        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 686        /*
 687         * We modify tree, leaf block, global info, local chunk header,
 688         * global and local inode; OCFS2_QINFO_WRITE_CREDITS already
 689         * accounts for inode update
 690         */
 691        return (oinfo->dqi_gi.dqi_qtree_depth + 2) *
 692               OCFS2_QUOTA_BLOCK_UPDATE_CREDITS +
 693               OCFS2_QINFO_WRITE_CREDITS +
 694               OCFS2_INODE_UPDATE_CREDITS;
 695}
 696
 697void ocfs2_drop_dquot_refs(struct work_struct *work)
 698{
 699        struct ocfs2_super *osb = container_of(work, struct ocfs2_super,
 700                                               dquot_drop_work);
 701        struct llist_node *list;
 702        struct ocfs2_dquot *odquot, *next_odquot;
 703
 704        list = llist_del_all(&osb->dquot_drop_list);
 705        llist_for_each_entry_safe(odquot, next_odquot, list, list) {
 706                /* Drop the reference we acquired in ocfs2_dquot_release() */
 707                dqput(&odquot->dq_dquot);
 708        }
 709}
 710
 711/*
 712 * Called when the last reference to dquot is dropped. If we are called from
 713 * downconvert thread, we cannot do all the handling here because grabbing
 714 * quota lock could deadlock (the node holding the quota lock could need some
 715 * other cluster lock to proceed but with blocked downconvert thread we cannot
 716 * release any lock).
 717 */
 718static int ocfs2_release_dquot(struct dquot *dquot)
 719{
 720        handle_t *handle;
 721        struct ocfs2_mem_dqinfo *oinfo =
 722                        sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv;
 723        struct ocfs2_super *osb = OCFS2_SB(dquot->dq_sb);
 724        int status = 0;
 725
 726        trace_ocfs2_release_dquot(from_kqid(&init_user_ns, dquot->dq_id),
 727                                  dquot->dq_id.type);
 728
 729        mutex_lock(&dquot->dq_lock);
 730        /* Check whether we are not racing with some other dqget() */
 731        if (atomic_read(&dquot->dq_count) > 1)
 732                goto out;
 733        /* Running from downconvert thread? Postpone quota processing to wq */
 734        if (current == osb->dc_task) {
 735                /*
 736                 * Grab our own reference to dquot and queue it for delayed
 737                 * dropping.  Quota code rechecks after calling
 738                 * ->release_dquot() and won't free dquot structure.
 739                 */
 740                dqgrab(dquot);
 741                /* First entry on list -> queue work */
 742                if (llist_add(&OCFS2_DQUOT(dquot)->list, &osb->dquot_drop_list))
 743                        queue_work(osb->ocfs2_wq, &osb->dquot_drop_work);
 744                goto out;
 745        }
 746        status = ocfs2_lock_global_qf(oinfo, 1);
 747        if (status < 0)
 748                goto out;
 749        handle = ocfs2_start_trans(osb,
 750                ocfs2_calc_qdel_credits(dquot->dq_sb, dquot->dq_id.type));
 751        if (IS_ERR(handle)) {
 752                status = PTR_ERR(handle);
 753                mlog_errno(status);
 754                goto out_ilock;
 755        }
 756
 757        status = ocfs2_global_release_dquot(dquot);
 758        if (status < 0) {
 759                mlog_errno(status);
 760                goto out_trans;
 761        }
 762        status = ocfs2_local_release_dquot(handle, dquot);
 763        /*
 764         * If we fail here, we cannot do much as global structure is
 765         * already released. So just complain...
 766         */
 767        if (status < 0)
 768                mlog_errno(status);
 769        /*
 770         * Clear dq_off so that we search for the structure in quota file next
 771         * time we acquire it. The structure might be deleted and reallocated
 772         * elsewhere by another node while our dquot structure is on freelist.
 773         */
 774        dquot->dq_off = 0;
 775        clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
 776out_trans:
 777        ocfs2_commit_trans(osb, handle);
 778out_ilock:
 779        ocfs2_unlock_global_qf(oinfo, 1);
 780out:
 781        mutex_unlock(&dquot->dq_lock);
 782        if (status)
 783                mlog_errno(status);
 784        return status;
 785}
 786
 787/*
 788 * Read global dquot structure from disk or create it if it does
 789 * not exist. Also update use count of the global structure and
 790 * create structure in node-local quota file.
 791 */
 792static int ocfs2_acquire_dquot(struct dquot *dquot)
 793{
 794        int status = 0, err;
 795        int ex = 0;
 796        struct super_block *sb = dquot->dq_sb;
 797        struct ocfs2_super *osb = OCFS2_SB(sb);
 798        int type = dquot->dq_id.type;
 799        struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv;
 800        struct inode *gqinode = info->dqi_gqinode;
 801        int need_alloc = ocfs2_global_qinit_alloc(sb, type);
 802        handle_t *handle;
 803
 804        trace_ocfs2_acquire_dquot(from_kqid(&init_user_ns, dquot->dq_id),
 805                                  type);
 806        mutex_lock(&dquot->dq_lock);
 807        /*
 808         * We need an exclusive lock, because we're going to update use count
 809         * and instantiate possibly new dquot structure
 810         */
 811        status = ocfs2_lock_global_qf(info, 1);
 812        if (status < 0)
 813                goto out;
 814        status = ocfs2_qinfo_lock(info, 0);
 815        if (status < 0)
 816                goto out_dq;
 817        /*
 818         * We always want to read dquot structure from disk because we don't
 819         * know what happened with it while it was on freelist.
 820         */
 821        status = qtree_read_dquot(&info->dqi_gi, dquot);
 822        ocfs2_qinfo_unlock(info, 0);
 823        if (status < 0)
 824                goto out_dq;
 825
 826        OCFS2_DQUOT(dquot)->dq_use_count++;
 827        OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace;
 828        OCFS2_DQUOT(dquot)->dq_originodes = dquot->dq_dqb.dqb_curinodes;
 829        if (!dquot->dq_off) {   /* No real quota entry? */
 830                ex = 1;
 831                /*
 832                 * Add blocks to quota file before we start a transaction since
 833                 * locking allocators ranks above a transaction start
 834                 */
 835                WARN_ON(journal_current_handle());
 836                status = ocfs2_extend_no_holes(gqinode, NULL,
 837                        i_size_read(gqinode) + (need_alloc << sb->s_blocksize_bits),
 838                        i_size_read(gqinode));
 839                if (status < 0)
 840                        goto out_dq;
 841        }
 842
 843        handle = ocfs2_start_trans(osb,
 844                                   ocfs2_calc_global_qinit_credits(sb, type));
 845        if (IS_ERR(handle)) {
 846                status = PTR_ERR(handle);
 847                goto out_dq;
 848        }
 849        status = ocfs2_qinfo_lock(info, ex);
 850        if (status < 0)
 851                goto out_trans;
 852        status = qtree_write_dquot(&info->dqi_gi, dquot);
 853        if (ex && info_dirty(sb_dqinfo(sb, type))) {
 854                err = __ocfs2_global_write_info(sb, type);
 855                if (!status)
 856                        status = err;
 857        }
 858        ocfs2_qinfo_unlock(info, ex);
 859out_trans:
 860        ocfs2_commit_trans(osb, handle);
 861out_dq:
 862        ocfs2_unlock_global_qf(info, 1);
 863        if (status < 0)
 864                goto out;
 865
 866        status = ocfs2_create_local_dquot(dquot);
 867        if (status < 0)
 868                goto out;
 869        set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
 870out:
 871        mutex_unlock(&dquot->dq_lock);
 872        if (status)
 873                mlog_errno(status);
 874        return status;
 875}
 876
 877static int ocfs2_get_next_id(struct super_block *sb, struct kqid *qid)
 878{
 879        int type = qid->type;
 880        struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv;
 881        int status = 0;
 882
 883        trace_ocfs2_get_next_id(from_kqid(&init_user_ns, *qid), type);
 884        if (!sb_has_quota_loaded(sb, type)) {
 885                status = -ESRCH;
 886                goto out;
 887        }
 888        status = ocfs2_lock_global_qf(info, 0);
 889        if (status < 0)
 890                goto out;
 891        status = ocfs2_qinfo_lock(info, 0);
 892        if (status < 0)
 893                goto out_global;
 894        status = qtree_get_next_id(&info->dqi_gi, qid);
 895        ocfs2_qinfo_unlock(info, 0);
 896out_global:
 897        ocfs2_unlock_global_qf(info, 0);
 898out:
 899        /*
 900         * Avoid logging ENOENT since it just means there isn't next ID and
 901         * ESRCH which means quota isn't enabled for the filesystem.
 902         */
 903        if (status && status != -ENOENT && status != -ESRCH)
 904                mlog_errno(status);
 905        return status;
 906}
 907
 908static int ocfs2_mark_dquot_dirty(struct dquot *dquot)
 909{
 910        unsigned long mask = (1 << (DQ_LASTSET_B + QIF_ILIMITS_B)) |
 911                             (1 << (DQ_LASTSET_B + QIF_BLIMITS_B)) |
 912                             (1 << (DQ_LASTSET_B + QIF_INODES_B)) |
 913                             (1 << (DQ_LASTSET_B + QIF_SPACE_B)) |
 914                             (1 << (DQ_LASTSET_B + QIF_BTIME_B)) |
 915                             (1 << (DQ_LASTSET_B + QIF_ITIME_B));
 916        int sync = 0;
 917        int status;
 918        struct super_block *sb = dquot->dq_sb;
 919        int type = dquot->dq_id.type;
 920        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 921        handle_t *handle;
 922        struct ocfs2_super *osb = OCFS2_SB(sb);
 923
 924        trace_ocfs2_mark_dquot_dirty(from_kqid(&init_user_ns, dquot->dq_id),
 925                                     type);
 926
 927        /* In case user set some limits, sync dquot immediately to global
 928         * quota file so that information propagates quicker */
 929        spin_lock(&dquot->dq_dqb_lock);
 930        if (dquot->dq_flags & mask)
 931                sync = 1;
 932        spin_unlock(&dquot->dq_dqb_lock);
 933        /* This is a slight hack but we can't afford getting global quota
 934         * lock if we already have a transaction started. */
 935        if (!sync || journal_current_handle()) {
 936                status = ocfs2_write_dquot(dquot);
 937                goto out;
 938        }
 939        status = ocfs2_lock_global_qf(oinfo, 1);
 940        if (status < 0)
 941                goto out;
 942        handle = ocfs2_start_trans(osb, OCFS2_QSYNC_CREDITS);
 943        if (IS_ERR(handle)) {
 944                status = PTR_ERR(handle);
 945                mlog_errno(status);
 946                goto out_ilock;
 947        }
 948        down_write(&sb_dqopt(sb)->dqio_sem);
 949        status = ocfs2_sync_dquot(dquot);
 950        if (status < 0) {
 951                mlog_errno(status);
 952                goto out_dlock;
 953        }
 954        /* Now write updated local dquot structure */
 955        status = ocfs2_local_write_dquot(dquot);
 956out_dlock:
 957        up_write(&sb_dqopt(sb)->dqio_sem);
 958        ocfs2_commit_trans(osb, handle);
 959out_ilock:
 960        ocfs2_unlock_global_qf(oinfo, 1);
 961out:
 962        if (status)
 963                mlog_errno(status);
 964        return status;
 965}
 966
 967/* This should happen only after set_dqinfo(). */
 968static int ocfs2_write_info(struct super_block *sb, int type)
 969{
 970        handle_t *handle;
 971        int status = 0;
 972        struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
 973
 974        status = ocfs2_lock_global_qf(oinfo, 1);
 975        if (status < 0)
 976                goto out;
 977        handle = ocfs2_start_trans(OCFS2_SB(sb), OCFS2_QINFO_WRITE_CREDITS);
 978        if (IS_ERR(handle)) {
 979                status = PTR_ERR(handle);
 980                mlog_errno(status);
 981                goto out_ilock;
 982        }
 983        status = dquot_commit_info(sb, type);
 984        ocfs2_commit_trans(OCFS2_SB(sb), handle);
 985out_ilock:
 986        ocfs2_unlock_global_qf(oinfo, 1);
 987out:
 988        if (status)
 989                mlog_errno(status);
 990        return status;
 991}
 992
 993static struct dquot *ocfs2_alloc_dquot(struct super_block *sb, int type)
 994{
 995        struct ocfs2_dquot *dquot =
 996                                kmem_cache_zalloc(ocfs2_dquot_cachep, GFP_NOFS);
 997
 998        if (!dquot)
 999                return NULL;
1000        return &dquot->dq_dquot;
1001}
1002
1003static void ocfs2_destroy_dquot(struct dquot *dquot)
1004{
1005        kmem_cache_free(ocfs2_dquot_cachep, dquot);
1006}
1007
1008const struct dquot_operations ocfs2_quota_operations = {
1009        /* We never make dquot dirty so .write_dquot is never called */
1010        .acquire_dquot  = ocfs2_acquire_dquot,
1011        .release_dquot  = ocfs2_release_dquot,
1012        .mark_dirty     = ocfs2_mark_dquot_dirty,
1013        .write_info     = ocfs2_write_info,
1014        .alloc_dquot    = ocfs2_alloc_dquot,
1015        .destroy_dquot  = ocfs2_destroy_dquot,
1016        .get_next_id    = ocfs2_get_next_id,
1017};
1018