Whamcloud - gitweb
tune2fs: preserve old limits when turn on quota feature
authorNiu <niu@whamcloud.com>
Mon, 14 Nov 2011 15:58:28 +0000 (10:58 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 14 Nov 2011 15:58:28 +0000 (10:58 -0500)
When turn on quota by tune2fs, if the old quota file exist, the quota
usage should be recomputed but the old limits should be preserved.

Signed-off-by: Niu Yawei <niu@whamcloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/tune2fs.c

index 8bcf667..74a0489 100644 (file)
@@ -700,7 +700,6 @@ err:
 void handle_quota_options(ext2_filsys fs)
 {
        quota_ctx_t qctx;
-       errcode_t retval;
        ext2_ino_t qf_ino;
 
        if (!usrquota && !grpquota)
@@ -712,15 +711,33 @@ void handle_quota_options(ext2_filsys fs)
        if (usrquota == QOPT_ENABLE || grpquota == QOPT_ENABLE)
                quota_compute_usage(qctx);
 
-       if (usrquota == QOPT_ENABLE)
-               quota_write_inode(qctx, USRQUOTA);
-       else if (usrquota == QOPT_DISABLE)
+       if (usrquota == QOPT_ENABLE && !fs->super->s_usr_quota_inum) {
+               if ((qf_ino = quota_file_exists(fs, USRQUOTA,
+                                               QFMT_VFS_V1)) > 0) {
+                       if (quota_update_inode(qctx, qf_ino, USRQUOTA) == 0)
+                               quota_set_sb_inum(fs, qf_ino, USRQUOTA);
+                       else
+                               quota_write_inode(qctx, USRQUOTA);
+               } else {
+                       quota_write_inode(qctx, USRQUOTA);
+               }
+       } else if (usrquota == QOPT_DISABLE) {
                quota_remove_inode(fs, USRQUOTA);
+       }
 
-       if (grpquota == QOPT_ENABLE)
-               quota_write_inode(qctx, GRPQUOTA);
-       else if (grpquota == QOPT_DISABLE)
+       if (grpquota == QOPT_ENABLE && !fs->super->s_grp_quota_inum) {
+               if ((qf_ino = quota_file_exists(fs, GRPQUOTA,
+                                               QFMT_VFS_V1)) > 0) {
+                       if (quota_update_inode(qctx, qf_ino, GRPQUOTA) == 0)
+                               quota_set_sb_inum(fs, qf_ino, GRPQUOTA);
+                       else
+                               quota_write_inode(qctx, GRPQUOTA);
+               } else {
+                       quota_write_inode(qctx, GRPQUOTA);
+               }
+       } else if (grpquota == QOPT_DISABLE) {
                quota_remove_inode(fs, GRPQUOTA);
+       }
 
        quota_release_context(&qctx);