Whamcloud - gitweb
LU-15141 quota: optimize capability check for root squash
[fs/lustre-release.git] / lustre / osc / osc_cache.c
index d193fae..fe8a56e 100644 (file)
@@ -1937,9 +1937,9 @@ static unsigned int get_write_extents(struct osc_object *obj,
        };
 
        assert_osc_object_is_locked(obj);
-       while (!list_empty(&obj->oo_hp_exts)) {
-               ext = list_entry(obj->oo_hp_exts.next, struct osc_extent,
-                                oe_link);
+       while ((ext = list_first_entry_or_null(&obj->oo_hp_exts,
+                                              struct osc_extent,
+                                              oe_link)) != NULL) {
                if (!try_to_add_extent_for_io(cli, ext, &data))
                        return data.erd_page_count;
                EASSERT(ext->oe_nr_pages <= data.erd_max_pages, ext);
@@ -1947,9 +1947,9 @@ static unsigned int get_write_extents(struct osc_object *obj,
        if (data.erd_page_count == data.erd_max_pages)
                return data.erd_page_count;
 
-       while (!list_empty(&obj->oo_urgent_exts)) {
-               ext = list_entry(obj->oo_urgent_exts.next,
-                                struct osc_extent, oe_link);
+       while ((ext = list_first_entry_or_null(&obj->oo_urgent_exts,
+                                              struct osc_extent,
+                                              oe_link)) != NULL) {
                if (!try_to_add_extent_for_io(cli, ext, &data))
                        return data.erd_page_count;
        }
@@ -1960,10 +1960,11 @@ static unsigned int get_write_extents(struct osc_object *obj,
         * extents can usually only be added if the rpclist was empty, so if we
         * can't add one, we continue on to trying to add normal extents.  This
         * is so we don't miss adding extra extents to an RPC containing high
-        * priority or urgent extents. */
-       while (!list_empty(&obj->oo_full_exts)) {
-               ext = list_entry(obj->oo_full_exts.next,
-                                struct osc_extent, oe_link);
+        * priority or urgent extents.
+        */
+       while ((ext = list_first_entry_or_null(&obj->oo_full_exts,
+                                              struct osc_extent,
+                                              oe_link)) != NULL) {
                if (!try_to_add_extent_for_io(cli, ext, &data))
                        break;
        }
@@ -2303,13 +2304,23 @@ 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 (oio->oi_cap_sys_resource || io->ci_noquota) {
+       if (io->ci_noquota) {
                brw_flags |= OBD_BRW_NOQUOTA;
                cmd |= OBD_BRW_NOQUOTA;
        }
 
+       if (oio->oi_cap_sys_resource) {
+               brw_flags |= OBD_BRW_SYS_RESOURCE;
+               cmd |= OBD_BRW_SYS_RESOURCE;
+       }
+
        /* check if the file's owner/group is over quota */
-       if (!(cmd & OBD_BRW_NOQUOTA)) {
+       /* do not check for root without root squash, because in this case
+        * we should bypass quota
+        */
+       if ((!oio->oi_cap_sys_resource ||
+            cli->cl_root_squash) &&
+           !io->ci_noquota) {
                struct cl_object *obj;
                struct cl_attr   *attr;
                unsigned int qid[LL_MAXQUOTAS];
@@ -2634,8 +2645,8 @@ int osc_queue_sync_pages(const struct lu_env *env, struct cl_io *io,
                        list_for_each_entry(oap, list, oap_pending_item) {
                                osc_consume_write_grant(cli,
                                                        &oap->oap_brw_page);
-                               atomic_long_inc(&obd_dirty_pages);
                        }
+                       atomic_long_add(page_count, &obd_dirty_pages);
                        osc_unreserve_grant_nolock(cli, grants, 0);
                        ext->oe_grants = grants;
                } else {
@@ -2649,6 +2660,7 @@ int osc_queue_sync_pages(const struct lu_env *env, struct cl_io *io,
                        "not enough grant available, switching to sync for this i/o\n");
                }
                spin_unlock(&cli->cl_loi_list_lock);
+               osc_update_next_shrink(cli);
        }
 
        ext->oe_is_rdma_only = !!(brw_flags & OBD_BRW_RDMA_ONLY);
@@ -2756,10 +2768,11 @@ again:
 
        osc_list_maint(cli, obj);
 
-       while (!list_empty(&list)) {
+       while ((ext = list_first_entry_or_null(&list,
+                                              struct osc_extent,
+                                              oe_link)) != NULL) {
                int rc;
 
-               ext = list_entry(list.next, struct osc_extent, oe_link);
                list_del_init(&ext->oe_link);
 
                /* extent may be in OES_ACTIVE state because inode mutex
@@ -3116,6 +3129,9 @@ bool osc_page_gang_lookup(const struct lu_env *env, struct cl_io *io,
                if (!res)
                        break;
 
+               OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_SLOW_PAGE_EVICT,
+                                cfs_fail_val ?: 20);
+
                if (io->ci_type == CIT_MISC &&
                    io->u.ci_misc.lm_next_rpc_time &&
                    ktime_get_seconds() > io->u.ci_misc.lm_next_rpc_time) {