Whamcloud - gitweb
LU-12014 llite: check correct size in ll_dom_finish_open() 95/33895/10
authorMikhail Pershin <mpershin@whamcloud.com>
Wed, 19 Dec 2018 19:28:53 +0000 (22:28 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 7 Jun 2019 04:09:05 +0000 (04:09 +0000)
The check in ll_dom_finish_open() for data end shouldn't
use i_size for comparision because it may be not updated
yet with just returned data from server. Use size value in
mdt_body from reply for that check.

Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: I1104fbbb0eb4633869b9bf2d1803ac3e84e3853d
Reviewed-on: https://review.whamcloud.com/33895
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/llite/file.c
lustre/tests/sanityn.sh

index d7c1e9e..4420486 100644 (file)
@@ -412,6 +412,7 @@ void ll_dom_finish_open(struct inode *inode, struct ptlrpc_request *req,
        struct address_space *mapping = inode->i_mapping;
        struct page *vmpage;
        struct niobuf_remote *rnb;
+       struct mdt_body *body;
        char *data;
        unsigned long index, start;
        struct niobuf_local lnb;
@@ -437,18 +438,19 @@ void ll_dom_finish_open(struct inode *inode, struct ptlrpc_request *req,
        if (rnb->rnb_offset % PAGE_SIZE)
                RETURN_EXIT;
 
-       /* Server returns whole file or just file tail if it fills in
-        * reply buffer, in both cases total size should be inode size.
+       /* Server returns whole file or just file tail if it fills in reply
+        * buffer, in both cases total size should be equal to the file size.
         */
-       if (rnb->rnb_offset + rnb->rnb_len < i_size_read(inode)) {
-               CERROR("%s: server returns off/len %llu/%u < i_size %llu\n",
+       body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
+       if (rnb->rnb_offset + rnb->rnb_len != body->mbo_dom_size) {
+               CERROR("%s: server returns off/len %llu/%u but size %llu\n",
                       ll_i2sbi(inode)->ll_fsname, rnb->rnb_offset,
-                      rnb->rnb_len, i_size_read(inode));
+                      rnb->rnb_len, body->mbo_dom_size);
                RETURN_EXIT;
        }
 
-       CDEBUG(D_INFO, "Get data along with open at %llu len %i, i_size %llu\n",
-              rnb->rnb_offset, rnb->rnb_len, i_size_read(inode));
+       CDEBUG(D_INFO, "Get data along with open at %llu len %i, size %llu\n",
+              rnb->rnb_offset, rnb->rnb_len, body->mbo_dom_size);
 
        data = (char *)rnb + sizeof(*rnb);
 
index a4006aa..38b884a 100755 (executable)
@@ -4493,7 +4493,7 @@ run_test 93 "alloc_rr should not allocate on same ost"
 test_100a() {
        skip "Reserved for glimpse-ahead" && return
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
-               skip "Need MDS version at least 2.10.55" && return
+               skip "Need MDS version at least 2.10.55"
 
        mkdir -p $DIR/$tdir
 
@@ -4517,7 +4517,7 @@ run_test 100a "DoM: glimpse RPCs for stat without IO lock (DoM only file)"
 
 test_100b() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
-               skip "Need MDS version at least 2.10.55" && return
+               skip "Need MDS version at least 2.10.55"
 
        mkdir -p $DIR/$tdir
 
@@ -4540,7 +4540,7 @@ run_test 100b "DoM: no glimpse RPC for stat with IO lock (DoM only file)"
 
 test_100c() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
-               skip "Need MDS version at least 2.10.55" && return
+               skip "Need MDS version at least 2.10.55"
 
        mkdir -p $DIR/$tdir
 
@@ -4563,7 +4563,7 @@ run_test 100c "DoM: write vs stat without IO lock (combined file)"
 
 test_100d() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
-               skip "Need MDS version at least 2.10.55" && return
+               skip "Need MDS version at least 2.10.55"
 
        mkdir -p $DIR/$tdir
 
@@ -4586,6 +4586,28 @@ test_100d() {
 }
 run_test 100d "DoM: write+truncate vs stat without IO lock (combined file)"
 
+test_100e() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.50) ] &&
+               skip "Need MDS version at least 2.11.50"
+
+       local dom=$DIR/$tdir/dom
+       local dom2=$DIR2/$tdir/dom
+       mkdir -p $DIR/$tdir
+
+       $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+       cancel_lru_locks mdc
+       dd if=/dev/urandom of=$dom bs=12000 count=1
+       $TRUNCATE $dom2 6000
+       cancel_lru_locks mdc
+       lctl set_param -n mdc.*.stats=clear
+       # expect read-on-open to return all data before write
+       cat /etc/hosts >> $dom
+       local read=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
+       [[ $read -eq 0 ]] || error "Unexpected $read READ RPCs"
+}
+run_test 100e "DoM: read on open and file size"
+
 test_101a() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
                skip "Need MDS version at least 2.10.55" && return