-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
LUSTRE_SEQ_SUPER_WIDTH = ((1ULL << 30ULL) * LUSTRE_SEQ_META_WIDTH)
};
+enum {
+ /** 2^6 FIDs for OI containers */
+ OSD_OI_FID_OID_BITS = 6,
+ /** reserve enough FIDs in case we want more in the future */
+ OSD_OI_FID_OID_BITS_MAX = 10,
+};
+
/** special OID for local objects */
enum local_oid {
- /** \see osd_oi_index_create */
- OSD_OI_FID_16_OID = 2UL,
/** \see fld_mod_init */
FLD_INDEX_OID = 3UL,
/** \see fid_mod_init */
MDD_ORPHAN_OID = 7UL,
MDD_LOV_OBJ_OID = 8UL,
MDD_CAPA_KEYS_OID = 9UL,
- MDD_OBJECTS_OID = 10UL,
/** \see mdt_mod_init */
MDT_LAST_RECV_OID = 11UL,
- /** \see osd_mod_init */
- OSD_REM_OBJ_DIR_OID = 12UL,
+ OSD_FS_ROOT_OID = 13UL,
+ ACCT_USER_OID = 15UL,
+ ACCT_GROUP_OID = 16UL,
+ LFSCK_BOOKMARK_OID = 17UL,
+ OTABLE_IT_OID = 18UL,
+ OFD_LAST_RECV_OID = 19UL,
+ OFD_GROUP0_LAST_OID = 20UL,
+ OFD_GROUP4K_LAST_OID = 20UL+4096,
+ OFD_LAST_GROUP_OID = 4117UL,
+ LLOG_CATALOGS_OID = 4118UL,
+ MGS_CONFIGS_OID = 4119UL,
+ OFD_HEALTH_CHECK_OID = 4120UL,
};
static inline void lu_local_obj_fid(struct lu_fid *fid, __u32 oid)
fid->f_ver = 0;
}
+static inline int fid_is_otable_it(const struct lu_fid *fid)
+{
+ return unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
+ fid_oid(fid) == OTABLE_IT_OID);
+}
+
+static inline int fid_is_acct(const struct lu_fid *fid)
+{
+ return fid_seq(fid) == FID_SEQ_LOCAL_FILE &&
+ (fid_oid(fid) == ACCT_USER_OID ||
+ fid_oid(fid) == ACCT_GROUP_OID);
+}
+
enum lu_mgr_type {
LUSTRE_SEQ_SERVER,
LUSTRE_SEQ_CONTROLLER
struct lu_client_seq {
/* Sequence-controller export. */
struct obd_export *lcs_exp;
- cfs_semaphore_t lcs_sem;
+ cfs_mutex_t lcs_mutex;
/*
* Range of allowed for allocation sequeces. When using lu_client_seq on
/* Seq-server for direct talking */
struct lu_server_seq *lcs_srv;
+
+ /* wait queue for fid allocation and update indicator */
+ cfs_waitq_t lcs_waitq;
+ int lcs_update;
};
/* server sequence manager interface */
/* Client interafce to request controller */
struct lu_client_seq *lss_cli;
- /* Semaphore for protecting allocation */
- cfs_semaphore_t lss_sem;
+ /* Mutex for protecting allocation */
+ cfs_mutex_t lss_mutex;
/*
* Service uuid, passed from MDT + seq name to form unique seq name to
*/
__u64 lss_set_width;
- /* transaction no of seq update write operation */
- __u64 lss_set_transno;
+ /* sync is needed for update operation */
+ __u32 lss_need_sync;
/**
* Pointer to site object, required to access site fld.
*/
void seq_client_flush(struct lu_client_seq *seq);
-int seq_client_alloc_fid(struct lu_client_seq *seq,
+int seq_client_alloc_fid(const struct lu_env *env, struct lu_client_seq *seq,
struct lu_fid *fid);
+int seq_client_get_seq(const struct lu_env *env, struct lu_client_seq *seq,
+ seqno_t *seqnr);
/* Fids common stuff */
int fid_is_local(const struct lu_env *env,
struct ldlm_namespace;
-enum {
- LUSTRE_RES_ID_SEQ_OFF = 0,
- LUSTRE_RES_ID_OID_OFF = 1,
- LUSTRE_RES_ID_VER_OFF = 2,
- LUSTRE_RES_ID_HSH_OFF = 3
-};
-
/*
- * Build (DLM) resource name from fid.
+ * Build (DLM) resource name from FID.
+ *
+ * NOTE: until Lustre 1.8.7/2.1.1 the fid_ver() was packed into name[2],
+ * but was moved into name[1] along with the OID to avoid consuming the
+ * renaming name[2,3] fields that need to be used for the quota identifier.
*/
static inline struct ldlm_res_id *
fid_build_reg_res_name(const struct lu_fid *f,
{
memset(name, 0, sizeof *name);
name->name[LUSTRE_RES_ID_SEQ_OFF] = fid_seq(f);
- name->name[LUSTRE_RES_ID_OID_OFF] = fid_oid(f);
- name->name[LUSTRE_RES_ID_VER_OFF] = fid_ver(f);
+ name->name[LUSTRE_RES_ID_VER_OID_OFF] = fid_ver_oid(f);
return name;
}
static inline int fid_res_name_eq(const struct lu_fid *f,
const struct ldlm_res_id *name)
{
- return
- name->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(f) &&
- name->name[LUSTRE_RES_ID_OID_OFF] == fid_oid(f) &&
- name->name[LUSTRE_RES_ID_VER_OFF] == fid_ver(f);
+ return name->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(f) &&
+ name->name[LUSTRE_RES_ID_VER_OID_OFF] == fid_ver_oid(f);
}
/**
- * Flatten 128-bit FID values into a 64-bit value for
- * use as an inode number. For non-IGIF FIDs this
- * starts just over 2^32, and continues without conflict
- * until 2^64, at which point we wrap the high 32 bits
- * of the SEQ into the range where there may not be many
- * OID values in use, to minimize the risk of conflict.
+ * Flatten 128-bit FID values into a 64-bit value for use as an inode number.
+ * For non-IGIF FIDs this starts just over 2^32, and continues without
+ * conflict until 2^64, at which point we wrap the high 24 bits of the SEQ
+ * into the range where there may not be many OID values in use, to minimize
+ * the risk of conflict.
*
- * The time between re-used inode numbers is very long -
- * 2^32 SEQ numbers, or about 2^32 client mounts. */
+ * Suppose LUSTRE_SEQ_MAX_WIDTH less than (1 << 24) which is currently true,
+ * the time between re-used inode numbers is very long - 2^40 SEQ numbers,
+ * or about 2^40 client mounts, if clients create less than 2^24 files/mount.
+ */
static inline __u64 fid_flatten(const struct lu_fid *fid)
{
__u64 ino;
seq = fid_seq(fid);
- ino = (seq << 24) + ((seq >> (64-8)) & 0xffffff0000ULL) + fid_oid(fid);
+ ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid);
RETURN(ino ? ino : fid_oid(fid));
}
+static inline __u32 fid_hash(const struct lu_fid *f, int bits)
+{
+ /* all objects with same id and different versions will belong to same
+ * collisions list. */
+ return cfs_hash_long(fid_flatten(f), bits);
+}
+
/**
* map fid to 32 bit value for ino on 32bit systems. */
static inline __u32 fid_flatten32(const struct lu_fid *fid)
seq = fid_seq(fid) - FID_SEQ_START;
- /*
- map the high bits of the OID into higher bits of the inode number so that
- inodes generated at about the same time have a reduced chance of collisions.
- This will give a period of 1024 clients and 128 k = 128M inodes without collisions.
- */
-
+ /* Map the high bits of the OID into higher bits of the inode number so
+ * that inodes generated at about the same time have a reduced chance
+ * of collisions. This will give a period of 2^12 = 1024 unique clients
+ * (from SEQ) and up to min(LUSTRE_SEQ_MAX_WIDTH, 2^20) = 128k objects
+ * (from OID), or up to 128M inodes without collisions for new files. */
ino = ((seq & 0x000fffffULL) << 12) + ((seq >> 8) & 0xfffff000) +
(seq >> (64 - (40-8)) & 0xffffff00) +
- (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 16);
+ (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 8);
RETURN(ino ? ino : fid_oid(fid));
}