@@ -139,7 +139,9 @@ struct osc_io {
/* true if this io is lockless. */
unsigned int oi_lockless:1,
/* true if this io is counted as active IO */
- oi_is_active:1;
+ oi_is_active:1,
+ /** true if this io has CAP_SYS_RESOURCE */
+ oi_cap_sys_resource:1;
/* how many LRU pages are reserved for this IO */
unsigned long oi_lru_reserved;
@@ -2283,9 +2283,6 @@ int osc_prep_async_page(struct osc_object *osc, struct osc_page *ops,
oap->oap_obj_off = offset;
LASSERT(!(offset & ~PAGE_MASK));
- if (capable(CAP_SYS_RESOURCE))
- oap->oap_brw_flags = OBD_BRW_NOQUOTA;
-
INIT_LIST_HEAD(&oap->oap_pending_item);
INIT_LIST_HEAD(&oap->oap_rpc_item);
@@ -2324,7 +2321,7 @@ int osc_queue_async_io(const struct lu_env *env, struct cl_io *io,
/* Set the OBD_BRW_SRVLOCK before the page is queued. */
brw_flags |= ops->ops_srvlock ? OBD_BRW_SRVLOCK : 0;
- if (capable(CAP_SYS_RESOURCE)) {
+ if (oio->oi_cap_sys_resource) {
brw_flags |= OBD_BRW_NOQUOTA;
cmd |= OBD_BRW_NOQUOTA;
}
@@ -357,18 +357,20 @@ int osc_io_iter_init(const struct lu_env *env, const struct cl_io_slice *ios)
{
struct osc_object *osc = cl2osc(ios->cis_obj);
struct obd_import *imp = osc_cli(osc)->cl_import;
+ struct osc_io *oio = osc_env_io(env);
int rc = -EIO;
spin_lock(&imp->imp_lock);
if (likely(!imp->imp_invalid)) {
- struct osc_io *oio = osc_env_io(env);
-
atomic_inc(&osc->oo_nr_ios);
oio->oi_is_active = 1;
rc = 0;
}
spin_unlock(&imp->imp_lock);
+ if (capable(CAP_SYS_RESOURCE))
+ oio->oi_cap_sys_resource = 1;
+
return rc;
}
EXPORT_SYMBOL(osc_io_iter_init);
@@ -302,6 +302,7 @@ int osc_page_init(const struct lu_env *env, struct cl_object *obj,
void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
enum cl_req_type crt, int brw_flags)
{
+ struct osc_io *oio = osc_env_io(env);
struct osc_async_page *oap = &opg->ops_oap;
LASSERTF(oap->oap_magic == OAP_MAGIC,
@@ -313,9 +314,9 @@ void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
oap->oap_cmd = crt == CRT_WRITE ? OBD_BRW_WRITE : OBD_BRW_READ;
oap->oap_page_off = opg->ops_from;
oap->oap_count = opg->ops_to - opg->ops_from;
- oap->oap_brw_flags = brw_flags | OBD_BRW_SYNC;
+ oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags;
- if (capable(CAP_SYS_RESOURCE)) {
+ if (oio->oi_cap_sys_resource) {
oap->oap_brw_flags |= OBD_BRW_NOQUOTA;
oap->oap_cmd |= OBD_BRW_NOQUOTA;
}