Whamcloud - gitweb
LU-7991 quota: project quota against ZFS backend
[fs/lustre-release.git] / lustre / osd-zfs / osd_oi.c
index bad04a4..010e023 100644 (file)
@@ -39,7 +39,6 @@
 
 #define DEBUG_SUBSYSTEM S_OSD
 
-#include <lustre_ver.h>
 #include <libcfs/libcfs.h>
 #include <obd_support.h>
 #include <lustre_net.h>
@@ -88,8 +87,6 @@ static const struct named_oid oids[] = {
        { .oid = FLD_INDEX_OID,        .name = "fld" },
        { .oid = MDD_LOV_OBJ_OID,      .name = LOV_OBJID },
        { .oid = OFD_HEALTH_CHECK_OID, .name = HEALTH_CHECK },
-       { .oid = ACCT_USER_OID,        .name = "acct_usr_inode" },
-       { .oid = ACCT_GROUP_OID,       .name = "acct_grp_inode" },
        { .oid = REPLY_DATA_OID,       .name = REPLY_DATA },
        { .oid = 0 }
 };
@@ -167,19 +164,19 @@ osd_oi_create(const struct lu_env *env, struct osd_device *o,
                return rc;
        }
 
-       oid = zap_create_flags(o->od_os, 0, ZAP_FLAG_HASH64,
-                              DMU_OT_DIRECTORY_CONTENTS,
-                              14, /* == ZFS fzap_default_block_shift */
-                              DN_MAX_INDBLKSHIFT, /* indirect block shift */
-                              DMU_OT_SA, DN_MAX_BONUSLEN, tx);
+       oid = osd_zap_create_flags(o->od_os, 0, ZAP_FLAG_HASH64,
+                                  DMU_OT_DIRECTORY_CONTENTS,
+                                  14, /* == ZFS fzap_default_block_shift */
+                                  DN_MAX_INDBLKSHIFT,
+                                  0, tx);
 
        rc = -sa_handle_get(o->od_os, oid, NULL, SA_HDL_PRIVATE, &sa_hdl);
        if (rc)
                goto commit;
+       memset(la, 0, sizeof(*la));
        la->la_valid = LA_MODE | LA_UID | LA_GID;
        la->la_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
-       la->la_uid = la->la_gid = 0;
-       rc = __osd_attr_init(env, o, sa_hdl, tx, la, parent);
+       rc = __osd_attr_init(env, o, NULL, sa_hdl, tx, la, parent, NULL);
        sa_handle_destroy(sa_hdl);
        if (rc)
                goto commit;
@@ -433,7 +430,7 @@ static void osd_fid2str(char *buf, const struct lu_fid *fid)
  */
 static uint64_t
 osd_get_idx_for_fid(struct osd_device *osd, const struct lu_fid *fid,
-                   char *buf)
+                   char *buf, dnode_t **zdn)
 {
        struct osd_oi *oi;
 
@@ -441,16 +438,23 @@ osd_get_idx_for_fid(struct osd_device *osd, const struct lu_fid *fid,
        oi = osd->od_oi_table[fid_seq(fid) & (osd->od_oi_count - 1)];
        if (buf)
                osd_fid2str(buf, fid);
+       if (zdn)
+               *zdn = oi->oi_dn;
 
        return oi->oi_zapid;
 }
 
 uint64_t osd_get_name_n_idx(const struct lu_env *env, struct osd_device *osd,
-                           const struct lu_fid *fid, char *buf, int bufsize)
+                           const struct lu_fid *fid, char *buf, int bufsize,
+                           dnode_t **zdn)
 {
        uint64_t zapid;
 
        LASSERT(fid);
+       LASSERT(!fid_is_acct(fid));
+
+       if (zdn != NULL)
+               *zdn = NULL;
 
        if (fid_is_on_ost(env, osd, fid) == 1 || fid_seq(fid) == FID_SEQ_ECHO) {
                zapid = osd_get_idx_for_ost_obj(env, osd, fid, buf, bufsize);
@@ -462,13 +466,11 @@ uint64_t osd_get_name_n_idx(const struct lu_env *env, struct osd_device *osd,
                        zapid = osd->od_root;
                        if (buf)
                                strncpy(buf, name, bufsize);
-                       if (fid_is_acct(fid))
-                               zapid = MASTER_NODE_OBJ;
                } else {
-                       zapid = osd_get_idx_for_fid(osd, fid, buf);
+                       zapid = osd_get_idx_for_fid(osd, fid, buf, NULL);
                }
        } else {
-               zapid = osd_get_idx_for_fid(osd, fid, buf);
+               zapid = osd_get_idx_for_fid(osd, fid, buf, zdn);
        }
 
        return zapid;
@@ -481,40 +483,28 @@ static inline int fid_is_fs_root(const struct lu_fid *fid)
                fid_oid(fid) == OSD_FS_ROOT_OID;
 }
 
-static inline uint64_t osd_oid(struct osd_device *dev, __u32 local_oid)
-{
-       switch (local_oid) {
-       case ACCT_USER_OID:
-               return dev->od_iusr_oid;
-       case ACCT_GROUP_OID:
-               return dev->od_igrp_oid;
-       }
-
-       LASSERTF(0, "invalid oid: %u for quota type", local_oid);
-       return dev->od_igrp_oid;
-}
-
 int osd_fid_lookup(const struct lu_env *env, struct osd_device *dev,
                   const struct lu_fid *fid, uint64_t *oid)
 {
        struct osd_thread_info  *info = osd_oti_get(env);
        char                    *buf = info->oti_buf;
-       uint64_t                zapid;
+       dnode_t *zdn;
+       uint64_t zapid;
        int                     rc = 0;
        ENTRY;
 
        if (OBD_FAIL_CHECK(OBD_FAIL_SRV_ENOENT))
                RETURN(-ENOENT);
 
-       if (unlikely(fid_is_acct(fid))) {
-               *oid = osd_oid(dev, fid_oid(fid));
-       } else if (unlikely(fid_is_fs_root(fid))) {
+       LASSERT(!fid_is_acct(fid));
+
+       if (unlikely(fid_is_fs_root(fid))) {
                *oid = dev->od_root;
        } else {
                zapid = osd_get_name_n_idx(env, dev, fid, buf,
-                                          sizeof(info->oti_buf));
-               rc = -zap_lookup(dev->od_os, zapid, buf,
-                               8, 1, &info->oti_zde);
+                                          sizeof(info->oti_buf), &zdn);
+               rc = osd_zap_lookup(dev, zapid, zdn, buf,
+                                   8, 1, &info->oti_zde);
                if (rc)
                        RETURN(rc);
                *oid = info->oti_zde.lzd_reg.zde_dnode;
@@ -570,7 +560,7 @@ osd_oi_add_table(const struct lu_env *env, struct osd_device *o,
        }
 
        o->od_oi_table[key] = oi;
-       __osd_obj2dnode(env, o->od_os, oi->oi_zapid, &oi->oi_dn);
+       __osd_obj2dnode(o->od_os, oi->oi_zapid, &oi->oi_dn);
 
        return 0;
 }
@@ -678,31 +668,13 @@ static void osd_ost_seq_fini(const struct lu_env *env, struct osd_device *osd)
 static int
 osd_oi_init_compat(const struct lu_env *env, struct osd_device *o)
 {
-       uint64_t         odb, sdb;
-       int              rc;
+       uint64_t sdb;
+       int rc;
        ENTRY;
 
        rc = osd_oi_find_or_create(env, o, o->od_root, "O", &sdb);
-       if (rc)
-               RETURN(rc);
-
-       o->od_O_id = sdb;
-
-       /* Create on-disk indexes to maintain per-UID/GID inode usage.
-        * Those new indexes are created in the top-level ZAP outside the
-        * namespace in order not to confuse ZPL which might interpret those
-        * indexes as directories and assume the values are object IDs */
-       rc = osd_oi_find_or_create(env, o, MASTER_NODE_OBJ,
-                       oid2name(ACCT_USER_OID), &odb);
-       if (rc)
-               RETURN(rc);
-       o->od_iusr_oid = odb;
-
-       rc = osd_oi_find_or_create(env, o, MASTER_NODE_OBJ,
-                       oid2name(ACCT_GROUP_OID), &odb);
-       if (rc)
-               RETURN(rc);
-       o->od_igrp_oid = odb;
+       if (!rc)
+               o->od_O_id = sdb;
 
        RETURN(rc);
 }
@@ -860,6 +832,8 @@ struct osd_idmap_cache *osd_idc_find_or_init(const struct lu_env *env,
        struct osd_idmap_cache *idc;
        int rc;
 
+       LASSERT(!fid_is_acct(fid));
+
        idc = osd_idc_find(env, osd, fid);
        if (idc != NULL)
                return idc;