This reverts commit
c524079f4f59a39b99467d9868ee4aafdcf033e9,
because it breaks releasepage for Lustre and does not
completely fix the data consistency issue in LU-14541.
Breaking releasepage matters because it prevents direct I/O
from working if there is page cache data present, and
because it causes similar issues with GDS, which must be
able to flush page cache pages before doing I/O.
With patches:
"LU-16160 llite: SIGBUS is possible on a race with page reclaim"/
d9c23a7934747eb19e23470b30806482a1aa60f8
and
"LU-14541 llite: Check for page deletion after fault"/
19678e30147f50f813e72e8216cfb0453fe0ca6e
LU-14541 is fully resolved, so we can revert this patch.
Lustre-change: https://review.whamcloud.com/49654
Lustre-commit:
e3cfb688ed7116a57b2c7f89a3e4f28291a0b69f
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I613bdb4f27161ffc3638d1d8ea38827af5a7bd47
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50599
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Qian Yingjin <qian@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
*/
#define cl_page_in_use_noref(pg) __page_in_use(pg, 0)
-/* references: cl_page, page cache, optional + refcount for caller reference
- * (always 0 or 1 currently)
- */
-static inline int vmpage_in_use(struct page *vmpage, int refcount)
-{
- return (page_count(vmpage) - page_mapcount(vmpage) > 2 + refcount);
-}
-
/** @} cl_page */
/** \addtogroup cl_lock cl_lock
{
struct lu_env *env;
struct cl_object *obj;
- struct cl_page *clpage;
+ struct cl_page *page;
struct address_space *mapping;
int result = 0;
if (obj == NULL)
return 1;
- clpage = cl_vmpage_page(vmpage, obj);
- if (clpage == NULL)
+ page = cl_vmpage_page(vmpage, obj);
+ if (page == NULL)
return 1;
env = cl_env_percpu_get();
LASSERT(!IS_ERR(env));
- /* we must not delete the cl_page if the vmpage is in use, otherwise we
- * disconnect the vmpage from Lustre while it's still alive(!), which
- * means we won't find it to discard on lock cancellation.
- *
- * References here are: caller + cl_page + page cache.
- * Any other references are potentially transient and must be ignored.
- */
- if (!cl_page_in_use(clpage) && !vmpage_in_use(vmpage, 1)) {
+ if (!cl_page_in_use(page)) {
result = 1;
- cl_page_delete(env, clpage);
+ cl_page_delete(env, page);
}
/* To use percpu env array, the call path can not be rescheduled;
* that we won't get into object delete path.
*/
LASSERT(cl_object_refc(obj) > 1);
- cl_page_put(env, clpage);
+ cl_page_put(env, page);
cl_env_percpu_put(env);
return result;
if (cli->cl_cache->ccc_unstable_check) {
struct page *vmpage = cl_page_vmpage(page);
- /* this check is racy because the vmpage is not locked, but
- * that's OK - the code which does the actual page release
- * checks this again before releasing
- *
- * vmpage have two known users: cl_page and VM page cache
- */
- if (vmpage_in_use(vmpage, 0))
+ /* vmpage have two known users: cl_page and VM page cache */
+ if (page_count(vmpage) - page_mapcount(vmpage) > 2)
return true;
}
return false;
ALWAYS_EXCEPT="$SANITY_EXCEPT "
# bug number for skipped test: LU-9693 LU-6493 LU-9693
ALWAYS_EXCEPT+=" 42a 42b 42c "
-# bug number: LU-8411 LU-14541
-ALWAYS_EXCEPT+=" 407 277 "
+# bug number: LU-8411
+ALWAYS_EXCEPT+=" 407 "
if $SHARED_KEY; then
# bug number: LU-14181 LU-14181
$LFS setstripe -c 1 -i 0 $DIR/$tfile
$LCTL set_param ldlm.namespaces.*.lru_size=clear
- # Disabled: DIO does not push out buffered I/O pages, see LU-12587
# request a new lock on client
- #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
- #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
- #local lock_count=$($LCTL get_param -n \
- # ldlm.namespaces.$imp_name.lru_size)
- #[[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+ local lock_count=$($LCTL get_param -n \
+ ldlm.namespaces.$imp_name.lru_size)
+ [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
$LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
# no lock cached, should use lockless DIO and not enqueue new lock
- dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct \
- conv=notrunc ||
- error "dio write failed"
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
lock_count=$($LCTL get_param -n \
ldlm.namespaces.$imp_name.lru_size)
[[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"