X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flclient%2Flcommon_cl.c;h=f1fe4dd0cda949d5995c3c2766b2adf48ba3ccc9;hb=7265c5d9e5327e48d7b80b0c11bc3532a2c55ecf;hp=60fc4c7b2d76bc9ca226bc7f306168cf99fabd88;hpb=09803193a151902acc39720946b831b90655c4a8;p=fs%2Flustre-release.git diff --git a/lustre/lclient/lcommon_cl.c b/lustre/lclient/lcommon_cl.c index 60fc4c7..f1fe4dd 100644 --- a/lustre/lclient/lcommon_cl.c +++ b/lustre/lclient/lcommon_cl.c @@ -26,10 +26,13 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* + * Copyright (c) 2011 Whamcloud, Inc. + */ +/* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. * @@ -673,7 +676,8 @@ void ccc_lock_state(const struct lu_env *env, if (lock->cll_descr.cld_start == 0 && lock->cll_descr.cld_end == CL_PAGE_EOF) { cl_isize_write_nolock(inode, attr->cat_kms); - CDEBUG(D_INODE, DFID" updating i_size "LPU64"\n", + CDEBUG(D_INODE|D_VFSTRACE, + DFID" updating i_size "LPU64"\n", PFID(lu_object_fid(&obj->co_lu)), (__u64)cl_isize_read(inode)); } @@ -681,7 +685,7 @@ void ccc_lock_state(const struct lu_env *env, cl_inode_atime(inode) = attr->cat_atime; cl_inode_ctime(inode) = attr->cat_ctime; } else { - CL_LOCK_DEBUG(D_INFO, env, lock, "attr_get: %i\n", rc); + CL_LOCK_DEBUG(D_INFO, env, lock, "attr_get: %d\n", rc); } cl_object_attr_unlock(obj); cl_isize_unlock(inode, 0); @@ -713,7 +717,7 @@ int ccc_io_one_lock_index(const struct lu_env *env, struct cl_io *io, CLOBINVRNT(env, obj, ccc_object_invariant(obj)); ENTRY; - CDEBUG(D_VFSTRACE, "lock: %i [%lu, %lu]\n", mode, start, end); + CDEBUG(D_VFSTRACE, "lock: %d [%lu, %lu]\n", mode, start, end); memset(&cio->cui_link, 0, sizeof cio->cui_link); @@ -922,6 +926,11 @@ int ccc_prep_size(const struct lu_env *env, struct cl_object *obj, cl_isize_write_nolock(inode, kms); else cl_isize_write(inode, kms); + CDEBUG(D_VFSTRACE, + DFID" updating i_size "LPU64"\n", + PFID(lu_object_fid(&obj->co_lu)), + (__u64)cl_isize_read(inode)); + } } } @@ -995,6 +1004,17 @@ void ccc_req_attr_set(const struct lu_env *env, } obdo_from_inode(oa, inode, &cl_i2info(inode)->lli_fid, valid_flags & flags); +#ifdef __KERNEL__ + /* Bug11742 - set the OBD_FL_MMAP flag for memory mapped files */ + if (cfs_atomic_read(&(cl_inode2ccc(inode)->cob_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; + } + } +#endif } const struct cl_req_operations ccc_req_ops = { @@ -1016,7 +1036,7 @@ int cl_setattr_ost(struct inode *inode, const struct iattr *attr, if (IS_ERR(env)) RETURN(PTR_ERR(env)); - io = &ccc_env_info(env)->cti_io; + io = ccc_env_thread_io(env); io->ci_obj = cl_i2info(inode)->lli_clob; io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime); @@ -1141,7 +1161,7 @@ int cl_inode_init(struct inode *inode, struct lustre_md *md) struct cl_object *clob; struct lu_site *site; struct lu_fid *fid; - const struct cl_object_conf conf = { + struct cl_object_conf conf = { .coc_inode = inode, .u = { .coc_md = md @@ -1150,7 +1170,6 @@ int cl_inode_init(struct inode *inode, struct lustre_md *md) int result = 0; int refcheck; - /* LASSERT(inode->i_state & I_NEW); */ LASSERT(md->body->valid & OBD_MD_FLID); if (!S_ISREG(cl_inode_mode(inode))) @@ -1166,6 +1185,14 @@ int cl_inode_init(struct inode *inode, struct lustre_md *md) LASSERT(fid_is_sane(fid)); if (lli->lli_clob == NULL) { + /* clob is slave of inode, empty lli_clob means for new inode, + * there is no clob in cache with the given fid, so it is + * unnecessary to perform lookup-alloc-lookup-insert, just + * alloc and insert directly. */ +#ifdef __KERNEL__ + LASSERT(inode->i_state & I_NEW); +#endif + conf.coc_lu.loc_flags = LOC_F_NEW; clob = cl_object_find(env, lu2cl_dev(site->ls_top_dev), fid, &conf); if (!IS_ERR(clob)) { @@ -1201,14 +1228,16 @@ int cl_inode_init(struct inode *inode, struct lustre_md *md) static void cl_object_put_last(struct lu_env *env, struct cl_object *obj) { struct lu_object_header *header = obj->co_lu.lo_header; - struct lu_site *site; cfs_waitlink_t waiter; if (unlikely(cfs_atomic_read(&header->loh_ref) != 1)) { - site = obj->co_lu.lo_dev->ld_site; + struct lu_site *site = obj->co_lu.lo_dev->ld_site; + struct lu_site_bkt_data *bkt; + + bkt = lu_site_bkt_from_fid(site, &header->loh_fid); cfs_waitlink_init(&waiter); - cfs_waitq_add(&site->ls_marche_funebre, &waiter); + cfs_waitq_add(&bkt->lsb_marche_funebre, &waiter); while (1) { cfs_set_current_state(CFS_TASK_UNINT); @@ -1218,7 +1247,7 @@ static void cl_object_put_last(struct lu_env *env, struct cl_object *obj) } cfs_set_current_state(CFS_TASK_RUNNING); - cfs_waitq_del(&site->ls_marche_funebre, &waiter); + cfs_waitq_del(&bkt->lsb_marche_funebre, &waiter); } cl_object_put(env, obj); @@ -1285,22 +1314,13 @@ __u16 ll_dirent_type_get(struct lu_dirent *ent) } /** - * for 32 bit inode numbers directly map seq+oid to 32bit number. - */ -__u32 cl_fid_build_ino32(const struct lu_fid *fid) -{ - RETURN(fid_flatten32(fid)); -} - -/** * build inode number from passed @fid */ -__u64 cl_fid_build_ino(const struct lu_fid *fid) +__u64 cl_fid_build_ino(const struct lu_fid *fid, int api32) { -#if BITS_PER_LONG == 32 - RETURN(fid_flatten32(fid)); -#else - RETURN(fid_flatten(fid)); -#endif + if (BITS_PER_LONG == 32 || api32) + RETURN(fid_flatten32(fid)); + else + RETURN(fid_flatten(fid)); } /**