quota: Keep which entries were set by SETQUOTA quotactl
Jan Kara
reviewerPATCH 1/1 quota: Keep which entries were set by SETQUOTA quotactl
Quota in a clustered environment needs to synchronize quota information among cluster nodes. This means we have to occasionally update some information in dquot from disk / network. On the other hand we have to be careful not to overwrite changes administrator did via SETQUOTA. So indicate in dquot->dq_flags which entries have been set by SETQUOTA and quota format can clear these flags when it properly propagated the changes.
Signed-off-by Jan Kara <[email protected]>
--- fs/dquot.c | 12 ++++++++++-- include/linux/quota.h | 26 ++++++++++++++++++++------ 2 files changed, 30 insertions(+), 8 deletions(-)
fs/dquot.c +10 -2
@@ -2008,25 +2008,33 @@ static int do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)if (di->dqb_valid &QIF_SPACE ) { dm->dqb_curspace = di->dqb_curspace; check_blim =1 ; +__set_bit (DQ_LASTSET_B +QIF_SPACE_B , &dquot->dq_flags); }if (di->dqb_valid &QIF_BLIMITS ) { dm->dqb_bsoftlimit =qbtos (di->dqb_bsoftlimit); dm->dqb_bhardlimit =qbtos (di->dqb_bhardlimit); check_blim =1 ; +__set_bit (DQ_LASTSET_B +QIF_BLIMITS_B , &dquot->dq_flags); }if (di->dqb_valid &QIF_INODES ) { dm->dqb_curinodes = di->dqb_curinodes; check_ilim =1 ; +__set_bit (DQ_LASTSET_B +QIF_INODES_B , &dquot->dq_flags); }if (di->dqb_valid &QIF_ILIMITS ) { dm->dqb_isoftlimit = di->dqb_isoftlimit; dm->dqb_ihardlimit = di->dqb_ihardlimit; check_ilim =1 ; +__set_bit (DQ_LASTSET_B +QIF_ILIMITS_B , &dquot->dq_flags); } -if (di->dqb_valid &QIF_BTIME ) +if (di->dqb_valid &QIF_BTIME ) { dm->dqb_btime = di->dqb_btime; -if (di->dqb_valid &QIF_ITIME ) +__set_bit (DQ_LASTSET_B +QIF_BTIME_B , &dquot->dq_flags); + } +if (di->dqb_valid &QIF_ITIME ) { dm->dqb_itime = di->dqb_itime; +__set_bit (DQ_LASTSET_B +QIF_ITIME_B , &dquot->dq_flags); + }if (check_blim) {if (!dm->dqb_bsoftlimit || dm->dqb_curspace < dm->dqb_bsoftlimit) {
include/linux/quota.h +20 -6
@@ -82,12 +82,21 @@* Quota structure used for communication with userspace via quotactl * Following flags are used to specify which fields are valid */ -#define QIF_BLIMITS 1 -#define QIF_SPACE 2 -#define QIF_ILIMITS 4 -#define QIF_INODES 8 -#define QIF_BTIME 16 -#define QIF_ITIME 32 +enum { +QIF_BLIMITS_B =0 , +QIF_SPACE_B , +QIF_ILIMITS_B , +QIF_INODES_B , +QIF_BTIME_B , +QIF_ITIME_B , +}; + +#define QIF_BLIMITS (1 << QIF_BLIMITS_B) +#define QIF_SPACE (1 << QIF_SPACE_B) +#define QIF_ILIMITS (1 << QIF_ILIMITS_B) +#define QIF_INODES (1 << QIF_INODES_B) +#define QIF_BTIME (1 << QIF_BTIME_B) +#define QIF_ITIME (1 << QIF_ITIME_B)#define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS)#define QIF_USAGE (QIF_SPACE | QIF_INODES)#define QIF_TIMES (QIF_BTIME | QIF_ITIME)
@@ -247,6 +256,11 @@ extern struct dqstats dqstats;#define DQ_FAKE_B 3/* no limits only usage */ #define DQ_READ_B 4/* dquot was read into memory */ #define DQ_ACTIVE_B 5/* dquot is active (dquot_release not called) */ +#define DQ_LASTSET_B 6/* Following 6 bits (see QIF_) are reserved\ +* for the mask of entries set via SETQUOTA\ +* quotactl. They are set under dq_data_lock\ +* and the quota format handling dquot can\ +* clear them when it sees fit. */ struct dquot {struct hlist_node dq_hash;/* Hash list in memory */
Signature · 1 line
1.5.2.4