Whamcloud - gitweb
libext2fs: use ext2fs_punch() to truncate quota file
[tools/e2fsprogs.git] / lib / quota / quotaio_v2.c
index 3119745..e7bf29c 100644 (file)
@@ -4,13 +4,13 @@
  * Jan Kara <jack@suse.cz> - sponsored by SuSE CR
  */
 
+#include "config.h"
 #include <sys/types.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <asm/byteorder.h>
 
 #include "common.h"
 #include "quotaio_v2.h"
 #include "quotaio.h"
 #include "quotaio_tree.h"
 
-typedef char *dqbuf_t;
-
 static int v2_check_file(struct quota_handle *h, int type, int fmt);
 static int v2_init_io(struct quota_handle *h);
 static int v2_new_io(struct quota_handle *h);
 static int v2_write_info(struct quota_handle *h);
 static struct dquot *v2_read_dquot(struct quota_handle *h, qid_t id);
-static int v2_commit_dquot(struct dquot *dquot, int flags);
+static int v2_commit_dquot(struct dquot *dquot);
 static int v2_scan_dquots(struct quota_handle *h,
                          int (*process_dquot) (struct dquot *dquot,
-                                               char *dqname));
+                                               void *data),
+                         void *data);
 static int v2_report(struct quota_handle *h, int verbose);
 
 struct quotafile_ops quotafile_ops_2 = {
-check_file:    v2_check_file,
-init_io:       v2_init_io,
-new_io:                v2_new_io,
-write_info:    v2_write_info,
-read_dquot:    v2_read_dquot,
-commit_dquot:  v2_commit_dquot,
-scan_dquots:   v2_scan_dquots,
-report:        v2_report
+       .check_file     = v2_check_file,
+       .init_io        = v2_init_io,
+       .new_io         = v2_new_io,
+       .write_info     = v2_write_info,
+       .read_dquot     = v2_read_dquot,
+       .commit_dquot   = v2_commit_dquot,
+       .scan_dquots    = v2_scan_dquots,
+       .report         = v2_report,
 };
 
-#define getdqbuf() smalloc(V2_DQBLKSIZE)
-#define freedqbuf(buf) free(buf)
-
 /*
  * Copy dquot from disk to memory
  */
@@ -53,18 +49,18 @@ static void v2r1_disk2memdqblk(struct dquot *dquot, void *dp)
        struct util_dqblk *m = &dquot->dq_dqb;
        struct v2r1_disk_dqblk *d = dp, empty;
 
-       dquot->dq_id = __le32_to_cpu(d->dqb_id);
-       m->dqb_ihardlimit = __le64_to_cpu(d->dqb_ihardlimit);
-       m->dqb_isoftlimit = __le64_to_cpu(d->dqb_isoftlimit);
-       m->dqb_bhardlimit = __le64_to_cpu(d->dqb_bhardlimit);
-       m->dqb_bsoftlimit = __le64_to_cpu(d->dqb_bsoftlimit);
-       m->dqb_curinodes = __le64_to_cpu(d->dqb_curinodes);
-       m->dqb_curspace = __le64_to_cpu(d->dqb_curspace);
-       m->dqb_itime = __le64_to_cpu(d->dqb_itime);
-       m->dqb_btime = __le64_to_cpu(d->dqb_btime);
+       dquot->dq_id = ext2fs_le32_to_cpu(d->dqb_id);
+       m->dqb_ihardlimit = ext2fs_le64_to_cpu(d->dqb_ihardlimit);
+       m->dqb_isoftlimit = ext2fs_le64_to_cpu(d->dqb_isoftlimit);
+       m->dqb_bhardlimit = ext2fs_le64_to_cpu(d->dqb_bhardlimit);
+       m->dqb_bsoftlimit = ext2fs_le64_to_cpu(d->dqb_bsoftlimit);
+       m->dqb_curinodes = ext2fs_le64_to_cpu(d->dqb_curinodes);
+       m->dqb_curspace = ext2fs_le64_to_cpu(d->dqb_curspace);
+       m->dqb_itime = ext2fs_le64_to_cpu(d->dqb_itime);
+       m->dqb_btime = ext2fs_le64_to_cpu(d->dqb_btime);
 
        memset(&empty, 0, sizeof(struct v2r1_disk_dqblk));
-       empty.dqb_itime = __cpu_to_le64(1);
+       empty.dqb_itime = ext2fs_cpu_to_le64(1);
        if (!memcmp(&empty, dp, sizeof(struct v2r1_disk_dqblk)))
                m->dqb_itime = 0;
 }
@@ -77,17 +73,17 @@ static void v2r1_mem2diskdqblk(void *dp, struct dquot *dquot)
        struct util_dqblk *m = &dquot->dq_dqb;
        struct v2r1_disk_dqblk *d = dp;
 
-       d->dqb_ihardlimit = __cpu_to_le64(m->dqb_ihardlimit);
-       d->dqb_isoftlimit = __cpu_to_le64(m->dqb_isoftlimit);
-       d->dqb_bhardlimit = __cpu_to_le64(m->dqb_bhardlimit);
-       d->dqb_bsoftlimit = __cpu_to_le64(m->dqb_bsoftlimit);
-       d->dqb_curinodes = __cpu_to_le64(m->dqb_curinodes);
-       d->dqb_curspace = __cpu_to_le64(m->dqb_curspace);
-       d->dqb_itime = __cpu_to_le64(m->dqb_itime);
-       d->dqb_btime = __cpu_to_le64(m->dqb_btime);
-       d->dqb_id = __cpu_to_le32(dquot->dq_id);
+       d->dqb_ihardlimit = ext2fs_cpu_to_le64(m->dqb_ihardlimit);
+       d->dqb_isoftlimit = ext2fs_cpu_to_le64(m->dqb_isoftlimit);
+       d->dqb_bhardlimit = ext2fs_cpu_to_le64(m->dqb_bhardlimit);
+       d->dqb_bsoftlimit = ext2fs_cpu_to_le64(m->dqb_bsoftlimit);
+       d->dqb_curinodes = ext2fs_cpu_to_le64(m->dqb_curinodes);
+       d->dqb_curspace = ext2fs_cpu_to_le64(m->dqb_curspace);
+       d->dqb_itime = ext2fs_cpu_to_le64(m->dqb_itime);
+       d->dqb_btime = ext2fs_cpu_to_le64(m->dqb_btime);
+       d->dqb_id = ext2fs_cpu_to_le32(dquot->dq_id);
        if (qtree_entry_unused(&dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree, dp))
-               d->dqb_itime = __cpu_to_le64(1);
+               d->dqb_itime = ext2fs_cpu_to_le64(1);
 }
 
 static int v2r1_is_id(void *dp, struct dquot *dquot)
@@ -98,7 +94,7 @@ static int v2r1_is_id(void *dp, struct dquot *dquot)
 
        if (qtree_entry_unused(info, dp))
                return 0;
-       return __le32_to_cpu(d->dqb_id) == dquot->dq_id;
+       return ext2fs_le32_to_cpu(d->dqb_id) == dquot->dq_id;
 }
 
 static struct qtree_fmt_operations v2r1_fmt_ops = {
@@ -113,13 +109,14 @@ static struct qtree_fmt_operations v2r1_fmt_ops = {
 static inline void v2_disk2memdqinfo(struct util_dqinfo *m,
                                     struct v2_disk_dqinfo *d)
 {
-       m->dqi_bgrace = __le32_to_cpu(d->dqi_bgrace);
-       m->dqi_igrace = __le32_to_cpu(d->dqi_igrace);
-       m->u.v2_mdqi.dqi_flags = __le32_to_cpu(d->dqi_flags) & V2_DQF_MASK;
-       m->u.v2_mdqi.dqi_qtree.dqi_blocks = __le32_to_cpu(d->dqi_blocks);
-       m->u.v2_mdqi.dqi_qtree.dqi_free_blk = __le32_to_cpu(d->dqi_free_blk);
+       m->dqi_bgrace = ext2fs_le32_to_cpu(d->dqi_bgrace);
+       m->dqi_igrace = ext2fs_le32_to_cpu(d->dqi_igrace);
+       m->u.v2_mdqi.dqi_flags = ext2fs_le32_to_cpu(d->dqi_flags) & V2_DQF_MASK;
+       m->u.v2_mdqi.dqi_qtree.dqi_blocks = ext2fs_le32_to_cpu(d->dqi_blocks);
+       m->u.v2_mdqi.dqi_qtree.dqi_free_blk =
+               ext2fs_le32_to_cpu(d->dqi_free_blk);
        m->u.v2_mdqi.dqi_qtree.dqi_free_entry =
-                               __le32_to_cpu(d->dqi_free_entry);
+                               ext2fs_le32_to_cpu(d->dqi_free_entry);
 }
 
 /*
@@ -128,41 +125,14 @@ static inline void v2_disk2memdqinfo(struct util_dqinfo *m,
 static inline void v2_mem2diskdqinfo(struct v2_disk_dqinfo *d,
                                     struct util_dqinfo *m)
 {
-       d->dqi_bgrace = __cpu_to_le32(m->dqi_bgrace);
-       d->dqi_igrace = __cpu_to_le32(m->dqi_igrace);
-       d->dqi_flags = __cpu_to_le32(m->u.v2_mdqi.dqi_flags & V2_DQF_MASK);
-       d->dqi_blocks = __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_blocks);
-       d->dqi_free_blk = __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_blk);
+       d->dqi_bgrace = ext2fs_cpu_to_le32(m->dqi_bgrace);
+       d->dqi_igrace = ext2fs_cpu_to_le32(m->dqi_igrace);
+       d->dqi_flags = ext2fs_cpu_to_le32(m->u.v2_mdqi.dqi_flags & V2_DQF_MASK);
+       d->dqi_blocks = ext2fs_cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_blocks);
+       d->dqi_free_blk =
+               ext2fs_cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_blk);
        d->dqi_free_entry =
-                       __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_entry);
-}
-
-/* Convert kernel quotablock format to utility one */
-static inline void v2_kern2utildqblk(struct util_dqblk *u,
-                                    struct v2_kern_dqblk *k)
-{
-       u->dqb_ihardlimit = k->dqb_ihardlimit;
-       u->dqb_isoftlimit = k->dqb_isoftlimit;
-       u->dqb_bhardlimit = k->dqb_bhardlimit;
-       u->dqb_bsoftlimit = k->dqb_bsoftlimit;
-       u->dqb_curinodes = k->dqb_curinodes;
-       u->dqb_curspace = k->dqb_curspace;
-       u->dqb_itime = k->dqb_itime;
-       u->dqb_btime = k->dqb_btime;
-}
-
-/* Convert utility quotablock format to kernel one */
-static inline void v2_util2kerndqblk(struct v2_kern_dqblk *k,
-                                    struct util_dqblk *u)
-{
-       k->dqb_ihardlimit = u->dqb_ihardlimit;
-       k->dqb_isoftlimit = u->dqb_isoftlimit;
-       k->dqb_bhardlimit = u->dqb_bhardlimit;
-       k->dqb_bsoftlimit = u->dqb_bsoftlimit;
-       k->dqb_curinodes = u->dqb_curinodes;
-       k->dqb_curspace = u->dqb_curspace;
-       k->dqb_itime = u->dqb_itime;
-       k->dqb_btime = u->dqb_btime;
+               ext2fs_cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_entry);
 }
 
 static int v2_read_header(struct quota_handle *h, struct v2_disk_dqheader *dqh)
@@ -181,27 +151,19 @@ static int v2_check_file(struct quota_handle *h, int type, int fmt)
 {
        struct v2_disk_dqheader dqh;
        int file_magics[] = INITQMAGICS;
-       int known_versions[] = INIT_V2_VERSIONS;
-       int version;
 
-       if (!v2_read_header(h, &dqh))
+       if (fmt != QFMT_VFS_V1)
                return 0;
-       if (fmt == QFMT_VFS_V0)
-               version = 0;
-       else if (fmt == QFMT_VFS_V1)
-               version = 1;
-       else
+
+       if (!v2_read_header(h, &dqh))
                return 0;
 
-       if (__le32_to_cpu(dqh.dqh_magic) != file_magics[type]) {
-               if (__be32_to_cpu(dqh.dqh_magic) == file_magics[type])
-                       log_fatal(3, "Your quota file is stored in wrong "
-                                 "endianity.", "");
+       if (ext2fs_le32_to_cpu(dqh.dqh_magic) != file_magics[type]) {
+               if (ext2fs_be32_to_cpu(dqh.dqh_magic) == file_magics[type])
+                       log_err("Your quota file is stored in wrong endianity");
                return 0;
        }
-       if (__le32_to_cpu(dqh.dqh_version) > known_versions[type])
-               return 0;
-       if (version != __le32_to_cpu(dqh.dqh_version))
+       if (V2_VERSION != ext2fs_le32_to_cpu(dqh.dqh_version))
                return 0;
        return 1;
 }
@@ -211,8 +173,17 @@ static int v2_check_file(struct quota_handle *h, int type, int fmt)
  */
 static int v2_init_io(struct quota_handle *h)
 {
-       log_err("Not Implemented.", "");
-       BUG_ON(1);
+       struct v2_disk_dqinfo ddqinfo;
+
+       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size =
+               sizeof(struct v2r1_disk_dqblk);
+       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = &v2r1_fmt_ops;
+
+       /* Read information about quotafile */
+       if (h->e2fs_read(&h->qh_qf, V2_DQINFOOFF, &ddqinfo,
+                        sizeof(ddqinfo)) != sizeof(ddqinfo))
+               return -1;
+       v2_disk2memdqinfo(&h->qh_info, &ddqinfo);
        return 0;
 }
 
@@ -224,13 +195,13 @@ static int v2_new_io(struct quota_handle *h)
        int file_magics[] = INITQMAGICS;
        struct v2_disk_dqheader ddqheader;
        struct v2_disk_dqinfo ddqinfo;
-       int version = 1;
 
-       BUG_ON(h->qh_fmt != QFMT_VFS_V1);
+       if (h->qh_fmt != QFMT_VFS_V1)
+               return -1;
 
        /* Write basic quota header */
-       ddqheader.dqh_magic = __cpu_to_le32(file_magics[h->qh_type]);
-       ddqheader.dqh_version = __cpu_to_le32(version);
+       ddqheader.dqh_magic = ext2fs_cpu_to_le32(file_magics[h->qh_type]);
+       ddqheader.dqh_version = ext2fs_cpu_to_le32(V2_VERSION);
        if (h->e2fs_write(&h->qh_qf, 0, &ddqheader, sizeof(ddqheader)) !=
                        sizeof(ddqheader))
                return -1;
@@ -270,8 +241,7 @@ static int v2_write_info(struct quota_handle *h)
 }
 
 /*
- * Read dquot (either from disk or from kernel)
- * User can use errno to detect errstr when NULL is returned
+ * Read dquot from disk
  */
 static struct dquot *v2_read_dquot(struct quota_handle *h, qid_t id)
 {
@@ -283,7 +253,7 @@ static struct dquot *v2_read_dquot(struct quota_handle *h, qid_t id)
  * became fake one and user has no blocks.
  * User can process use 'errno' to detect errstr.
  */
-static int v2_commit_dquot(struct dquot *dquot, int flags)
+static int v2_commit_dquot(struct dquot *dquot)
 {
        struct util_dqblk *b = &dquot->dq_dqb;
 
@@ -296,9 +266,10 @@ static int v2_commit_dquot(struct dquot *dquot, int flags)
 }
 
 static int v2_scan_dquots(struct quota_handle *h,
-                         int (*process_dquot) (struct dquot *, char *))
+                         int (*process_dquot) (struct dquot *, void *),
+                         void *data)
 {
-       return qtree_scan_dquots(h, process_dquot);
+       return qtree_scan_dquots(h, process_dquot, data);
 }
 
 /* Report information about quotafile.
@@ -307,7 +278,6 @@ static int v2_scan_dquots(struct quota_handle *h,
  */
 static int v2_report(struct quota_handle *h, int verbose)
 {
-       log_err("Not Implemented.", "");
-       BUG_ON(1);
-       return 0;
+       log_err("Not Implemented.");
+       return -1;
 }