obdo_from_inode(oa, inode, valid_flags);
/* Bug11742 - set the OBD_FL_MMAP flag for memory mapped files */
- if (atomic_read(&(ll_i2info(inode)->lli_mmap_cnt)) != 0)
- oa->o_flags |= OBD_FL_MMAP;
+ if (atomic_read(&(ll_i2info(inode)->lli_mmap_cnt)) != 0) {
+ if (!(oa->o_valid & OBD_MD_FLFLAGS)) {
+ oa->o_valid |= OBD_MD_FLFLAGS;
+ oa->o_flags = OBD_FL_MMAP;
+ } else {
+ oa->o_flags |= OBD_FL_MMAP;
+ }
+ }
}
static void ll_ap_fill_obdo(void *data, int cmd, struct obdo *oa)
}
/* If this is mmaped file - it can be changed at any time */
- if (oa->o_flags & OBD_FL_MMAP)
+ if (oa->o_valid & OBD_MD_FLFLAGS && oa->o_flags & OBD_FL_MMAP)
return 1;
if (oa->o_valid & OBD_MD_FLFLAGS)
* on the network, that was not caused by mmap() modifying
* the page. bug 11742 */
if ((rc == -EAGAIN) && (aa->aa_resends > 0) &&
- (aa->aa_oa->o_flags & OBD_FL_MMAP)) {
+ aa->aa_oa->o_valid & OBD_MD_FLFLAGS &&
+ aa->aa_oa->o_flags & OBD_FL_MMAP) {
rc = 0;
} else {
rc = osc_brw_redo_request(request, aa);
int rc, i, j;
obd_count client_cksum = 0, server_cksum = 0;
cksum_type_t cksum_type = OBD_CKSUM_CRC32;
- int no_reply = 0;
+ int no_reply = 0, mmap = 0;
struct ost_thread_local_cache *tls;
ENTRY;
if (body->oa.o_valid & OBD_MD_FLFLAGS)
cksum_type = cksum_type_unpack(body->oa.o_flags);
}
+ if (body->oa.o_valid & OBD_MD_FLFLAGS && body->oa.o_flags & OBD_FL_MMAP)
+ mmap = 1;
/* Because we already sync grant info with client when reconnect,
* grant info will be cleared for resent req, then fed_grant and
repbody->oa.o_cksum = server_cksum;
cksum_counter++;
if (unlikely(client_cksum != server_cksum)) {
- CDEBUG_LIMIT((body->oa.o_flags&OBD_FL_MMAP) ? D_INFO
- : D_ERROR,
- "client csum %x, server csum %x\n",
- client_cksum, server_cksum);
+ CDEBUG_LIMIT(mmap ? D_INFO : D_ERROR,
+ "client csum %x, server csum %x\n",
+ client_cksum, server_cksum);
cksum_counter = 0;
} else if ((cksum_counter & (-cksum_counter)) == cksum_counter){
CDEBUG(D_INFO, "Checksum %u from %s OK: %x\n",
*/
repbody->oa.o_valid &= ~(OBD_MD_FLMTIME | OBD_MD_FLATIME);
- if (unlikely(client_cksum != server_cksum && rc == 0 &&
- !(body->oa.o_flags & OBD_FL_MMAP))) {
+ if (unlikely(client_cksum != server_cksum && rc == 0 && !mmap)) {
int new_cksum = ost_checksum_bulk(desc, OST_WRITE, cksum_type);
char *msg;
char *via;