X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Flcommon_cl.c;h=f5ba1a842fd79d13febf7e4aa4b17e8cbfa44b06;hb=596f74c122f5edb0d45c4edf1b2aea4f741f7027;hp=c4b6cc9bca916e3cf96d691cb3d7b61874253119;hpb=0baa3eb1a4abe6e1e882cf03b0edfabda20142b7;p=fs%2Flustre-release.git diff --git a/lustre/llite/lcommon_cl.c b/lustre/llite/lcommon_cl.c index c4b6cc9..f5ba1a8 100644 --- a/lustre/llite/lcommon_cl.c +++ b/lustre/llite/lcommon_cl.c @@ -70,47 +70,50 @@ static DEFINE_MUTEX(cl_inode_fini_guard); int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr, enum op_xvalid xvalid, unsigned int attr_flags) { - struct lu_env *env; - struct cl_io *io; - int result; - __u16 refcheck; + struct lu_env *env; + struct cl_io *io; + int result; + __u16 refcheck; - ENTRY; + ENTRY; - env = cl_env_get(&refcheck); - if (IS_ERR(env)) - RETURN(PTR_ERR(env)); + env = cl_env_get(&refcheck); + if (IS_ERR(env)) + RETURN(PTR_ERR(env)); io = vvp_env_thread_io(env); io->ci_obj = obj; io->ci_verify_layout = 1; - io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime); - io->u.ci_setattr.sa_attr.lvb_mtime = LTIME_S(attr->ia_mtime); - io->u.ci_setattr.sa_attr.lvb_ctime = LTIME_S(attr->ia_ctime); + io->u.ci_setattr.sa_attr.lvb_atime = attr->ia_atime.tv_sec; + io->u.ci_setattr.sa_attr.lvb_mtime = attr->ia_mtime.tv_sec; + io->u.ci_setattr.sa_attr.lvb_ctime = attr->ia_ctime.tv_sec; io->u.ci_setattr.sa_attr.lvb_size = attr->ia_size; io->u.ci_setattr.sa_attr_flags = attr_flags; io->u.ci_setattr.sa_avalid = attr->ia_valid; io->u.ci_setattr.sa_xvalid = xvalid; io->u.ci_setattr.sa_parent_fid = lu_object_fid(&obj->co_lu); - + if (attr->ia_valid & ATTR_SIZE) + io->u.ci_setattr.sa_subtype = CL_SETATTR_TRUNC; again: if (attr->ia_valid & ATTR_FILE) ll_io_set_mirror(io, attr->ia_file); - if (cl_io_init(env, io, CIT_SETATTR, io->ci_obj) == 0) { + if (cl_io_init(env, io, CIT_SETATTR, io->ci_obj) == 0) { struct vvp_io *vio = vvp_env_io(env); if (attr->ia_valid & ATTR_FILE) - /* populate the file descriptor for ftruncate to honor - * group lock - see LU-787 */ - vio->vui_fd = LUSTRE_FPRIVATE(attr->ia_file); - - result = cl_io_loop(env, io); - } else { - result = io->ci_result; - } - cl_io_fini(env, io); + /* + * populate the file descriptor for ftruncate to honor + * group lock - see LU-787 + */ + vio->vui_fd = attr->ia_file->private_data; + + result = cl_io_loop(env, io); + } else { + result = io->ci_result; + } + cl_io_fini(env, io); if (unlikely(io->ci_need_restart)) goto again; @@ -164,8 +167,7 @@ int cl_file_inode_init(struct inode *inode, struct lustre_md *md) if (!(inode->i_state & I_NEW)) { result = -EIO; CERROR("%s: unexpected not-NEW inode "DFID": rc = %d\n", - ll_get_fsname(inode->i_sb, NULL, 0), PFID(fid), - result); + ll_i2sbi(inode)->ll_fsname, PFID(fid), result); goto out; } @@ -192,7 +194,7 @@ int cl_file_inode_init(struct inode *inode, struct lustre_md *md) if (result != 0) CERROR("%s: failed to initialize cl_object "DFID": rc = %d\n", - ll_get_fsname(inode->i_sb, NULL, 0), PFID(fid), result); + ll_i2sbi(inode)->ll_fsname, PFID(fid), result); out: cl_env_put(env, &refcheck); @@ -212,7 +214,6 @@ out: static void cl_object_put_last(struct lu_env *env, struct cl_object *obj) { struct lu_object_header *header = obj->co_lu.lo_header; - wait_queue_entry_t waiter; if (unlikely(atomic_read(&header->loh_ref) != 1)) { struct lu_site *site = obj->co_lu.lo_dev->ld_site; @@ -220,18 +221,7 @@ static void cl_object_put_last(struct lu_env *env, struct cl_object *obj) wq = lu_site_wq_from_fid(site, &header->loh_fid); - init_waitqueue_entry(&waiter, current); - add_wait_queue(wq, &waiter); - - while (1) { - set_current_state(TASK_UNINTERRUPTIBLE); - if (atomic_read(&header->loh_ref) == 1) - break; - schedule(); - } - - set_current_state(TASK_RUNNING); - remove_wait_queue(wq, &waiter); + wait_event(*wq, atomic_read(&header->loh_ref) == 1); } cl_object_put(env, obj);