* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define OFD_ROCOMPAT_SUPP (0)
#define OFD_INCOMPAT_SUPP (OBD_INCOMPAT_GROUPS | OBD_INCOMPAT_OST | \
OBD_INCOMPAT_COMMON_LR)
-#define OFD_MAX_GROUPS 256
#define OFD_PRECREATE_BATCH_DEFAULT (FILTER_SUBDIR_COUNT * 4)
+/* on small filesystems we should not precreate too many objects in
+ * a single transaction, otherwise we can overflow transactions */
+#define OFD_PRECREATE_SMALL_FS (1024ULL * 1024 * 1024)
+#define OFD_PRECREATE_BATCH_SMALL 8
+
/* Limit the returned fields marked valid to those that we actually might set */
#define OFD_VALID_FLAGS (LA_TYPE | LA_MODE | LA_SIZE | LA_BLOCKS | \
LA_BLKSIZE | LA_ATIME | LA_MTIME | LA_CTIME)
if (exp->exp_obd && exp->exp_obd->u.obt.obt_jobstats.ojs_hash &&
(exp->exp_connect_flags & OBD_CONNECT_JOBSTATS))
lprocfs_job_stats_log(exp->exp_obd, jobid, opcode, amount);
+
+ if (exp->exp_nid_stats != NULL &&
+ exp->exp_nid_stats->nid_stats != NULL) {
+ if (opcode == LPROC_OFD_STATS_READ)
+ lprocfs_counter_add(exp->exp_nid_stats->nid_stats,
+ LPROC_OFD_READ_BYTES, amount);
+ else if (opcode == LPROC_OFD_STATS_WRITE)
+ lprocfs_counter_add(exp->exp_nid_stats->nid_stats,
+ LPROC_OFD_WRITE_BYTES, amount);
+ }
}
+struct ofd_seq {
+ cfs_list_t os_list;
+ obd_id os_last_oid;
+ obd_seq os_seq;
+ spinlock_t os_last_oid_lock;
+ struct mutex os_create_lock;
+ cfs_atomic_t os_refc;
+ struct dt_object *os_lastid_obj;
+ unsigned long os_destroys_in_progress:1;
+};
+
struct ofd_device {
struct dt_device ofd_dt_dev;
struct dt_device *ofd_osd;
/* last_rcvd file */
struct lu_target ofd_lut;
- struct dt_object *ofd_last_group_file;
struct dt_object *ofd_health_check_file;
int ofd_subdir_count;
- int ofd_max_group;
- obd_id ofd_last_objids[OFD_MAX_GROUPS];
- struct mutex ofd_create_locks[OFD_MAX_GROUPS];
- struct dt_object *ofd_lastid_obj[OFD_MAX_GROUPS];
- spinlock_t ofd_objid_lock;
- unsigned long ofd_destroys_in_progress;
- int ofd_precreate_batch;
+ cfs_list_t ofd_seq_list;
+ rwlock_t ofd_seq_list_lock;
+ int ofd_seq_count;
+ int ofd_precreate_batch;
+ spinlock_t ofd_batch_lock;
/* protect all statfs-related counters */
spinlock_t ofd_osfs_lock;
/* Space used by the I/O, used by grant code */
unsigned long fti_used;
+ struct ost_lvb fti_lvb;
};
extern void target_recovery_fini(struct obd_device *obd);
int *from_cache);
/* ofd_fs.c */
-obd_id ofd_last_id(struct ofd_device *ofd, obd_seq seq);
-void ofd_last_id_set(struct ofd_device *ofd, obd_id id, obd_seq seq);
-int ofd_last_id_write(const struct lu_env *env, struct ofd_device *ofd,
- obd_seq seq);
-int ofd_group_load(const struct lu_env *env, struct ofd_device *ofd, int);
+obd_id ofd_seq_last_oid(struct ofd_seq *oseq);
+void ofd_seq_last_oid_set(struct ofd_seq *oseq, obd_id id);
+int ofd_seq_last_oid_write(const struct lu_env *env, struct ofd_device *ofd,
+ struct ofd_seq *oseq);
+int ofd_seqs_init(const struct lu_env *env, struct ofd_device *ofd);
+struct ofd_seq *ofd_seq_get(struct ofd_device *ofd, obd_seq seq);
+void ofd_seq_put(const struct lu_env *env, struct ofd_seq *oseq);
+
int ofd_fs_setup(const struct lu_env *env, struct ofd_device *ofd,
struct obd_device *obd);
void ofd_fs_cleanup(const struct lu_env *env, struct ofd_device *ofd);
int ofd_precreate_batch(struct ofd_device *ofd, int batch);
+struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd,
+ obd_seq seq);
+void ofd_seqs_fini(const struct lu_env *env, struct ofd_device *ofd);
/* ofd_io.c */
int ofd_preprw(const struct lu_env *env,int cmd, struct obd_export *exp,
struct lu_attr *attr);
int ofd_object_ff_check(const struct lu_env *env, struct ofd_object *fo);
int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
- obd_id id, obd_seq group, int nr);
+ obd_id id, struct ofd_seq *oseq, int nr);
void ofd_object_put(const struct lu_env *env, struct ofd_object *fo);
int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo,