#define DEBUG_SUBSYSTEM S_OSD
-#include <lustre_ver.h>
#include <libcfs/libcfs.h>
#include <obd_support.h>
#include <lustre_net.h>
{ .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 }
};
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;
*/
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;
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);
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;
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;
}
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;
}
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);
}
struct osd_idmap_cache *idc;
int rc;
+ LASSERT(!fid_is_acct(fid));
+
idc = osd_idc_find(env, osd, fid);
if (idc != NULL)
return idc;