staging: lustre: clio: use CIT_SETATTR for FSFILT_IOC_SETFLAGS
Add handling of inode flags to the handlers of CIT_SETATTR in lov and osc. In the FSFILT_IOC_SETFLAGS case of ll_iocontrol() use cl_setattr_ost() rather than obd_setattr_rqset() to set inode flags on OST objects. Remove the then unused OBD API methods obd_setattr_rqset() and obd_setattr_async() along with their supporting functions. Signed-off-by: John L. Hammond <john.hammond@intel.com> Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5823 Reviewed-on: http://review.whamcloud.com/13422 Reviewed-by: Bobi Jam <bobijam@hotmail.com> Reviewed-by: Oleg Drokin <oleg.drokin@intel.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2a99f82947
commit
933eb39736
@ -1772,9 +1772,10 @@ struct cl_io {
|
|||||||
struct cl_io_rw_common ci_rw;
|
struct cl_io_rw_common ci_rw;
|
||||||
struct cl_setattr_io {
|
struct cl_setattr_io {
|
||||||
struct ost_lvb sa_attr;
|
struct ost_lvb sa_attr;
|
||||||
|
unsigned int sa_attr_flags;
|
||||||
unsigned int sa_valid;
|
unsigned int sa_valid;
|
||||||
int sa_stripe_index;
|
int sa_stripe_index;
|
||||||
struct lu_fid *sa_parent_fid;
|
const struct lu_fid *sa_parent_fid;
|
||||||
} ci_setattr;
|
} ci_setattr;
|
||||||
struct cl_fault_io {
|
struct cl_fault_io {
|
||||||
/** page index within file. */
|
/** page index within file. */
|
||||||
|
@ -74,4 +74,6 @@
|
|||||||
# define ext2_find_next_zero_bit find_next_zero_bit_le
|
# define ext2_find_next_zero_bit find_next_zero_bit_le
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TIMES_SET_FLAGS (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)
|
||||||
|
|
||||||
#endif /* _LUSTRE_COMPAT_H */
|
#endif /* _LUSTRE_COMPAT_H */
|
||||||
|
@ -896,9 +896,6 @@ struct obd_ops {
|
|||||||
struct obdo *oa, struct obd_trans_info *oti);
|
struct obdo *oa, struct obd_trans_info *oti);
|
||||||
int (*setattr)(const struct lu_env *, struct obd_export *exp,
|
int (*setattr)(const struct lu_env *, struct obd_export *exp,
|
||||||
struct obd_info *oinfo, struct obd_trans_info *oti);
|
struct obd_info *oinfo, struct obd_trans_info *oti);
|
||||||
int (*setattr_async)(struct obd_export *exp, struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct ptlrpc_request_set *rqset);
|
|
||||||
int (*getattr)(const struct lu_env *env, struct obd_export *exp,
|
int (*getattr)(const struct lu_env *env, struct obd_export *exp,
|
||||||
struct obd_info *oinfo);
|
struct obd_info *oinfo);
|
||||||
int (*getattr_async)(struct obd_export *exp, struct obd_info *oinfo,
|
int (*getattr_async)(struct obd_export *exp, struct obd_info *oinfo,
|
||||||
|
@ -749,45 +749,6 @@ static inline int obd_setattr(const struct lu_env *env, struct obd_export *exp,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This performs all the requests set init/wait/destroy actions. */
|
|
||||||
static inline int obd_setattr_rqset(struct obd_export *exp,
|
|
||||||
struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti)
|
|
||||||
{
|
|
||||||
struct ptlrpc_request_set *set = NULL;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
EXP_CHECK_DT_OP(exp, setattr_async);
|
|
||||||
EXP_COUNTER_INCREMENT(exp, setattr_async);
|
|
||||||
|
|
||||||
set = ptlrpc_prep_set();
|
|
||||||
if (!set)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
rc = OBP(exp->exp_obd, setattr_async)(exp, oinfo, oti, set);
|
|
||||||
if (rc == 0)
|
|
||||||
rc = ptlrpc_set_wait(set);
|
|
||||||
ptlrpc_set_destroy(set);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This adds all the requests into @set if @set != NULL, otherwise
|
|
||||||
* all requests are sent asynchronously without waiting for response.
|
|
||||||
*/
|
|
||||||
static inline int obd_setattr_async(struct obd_export *exp,
|
|
||||||
struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct ptlrpc_request_set *set)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
EXP_CHECK_DT_OP(exp, setattr_async);
|
|
||||||
EXP_COUNTER_INCREMENT(exp, setattr_async);
|
|
||||||
|
|
||||||
rc = OBP(exp->exp_obd, setattr_async)(exp, oinfo, oti, set);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int obd_add_conn(struct obd_import *imp, struct obd_uuid *uuid,
|
static inline int obd_add_conn(struct obd_import *imp, struct obd_uuid *uuid,
|
||||||
int priority)
|
int priority)
|
||||||
{
|
{
|
||||||
|
@ -80,7 +80,8 @@ int cl_inode_fini_refcheck;
|
|||||||
*/
|
*/
|
||||||
static DEFINE_MUTEX(cl_inode_fini_guard);
|
static DEFINE_MUTEX(cl_inode_fini_guard);
|
||||||
|
|
||||||
int cl_setattr_ost(struct inode *inode, const struct iattr *attr)
|
int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
|
||||||
|
unsigned int attr_flags)
|
||||||
{
|
{
|
||||||
struct lu_env *env;
|
struct lu_env *env;
|
||||||
struct cl_io *io;
|
struct cl_io *io;
|
||||||
@ -92,14 +93,15 @@ int cl_setattr_ost(struct inode *inode, const struct iattr *attr)
|
|||||||
return PTR_ERR(env);
|
return PTR_ERR(env);
|
||||||
|
|
||||||
io = vvp_env_thread_io(env);
|
io = vvp_env_thread_io(env);
|
||||||
io->ci_obj = ll_i2info(inode)->lli_clob;
|
io->ci_obj = obj;
|
||||||
|
|
||||||
io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime);
|
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_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_ctime = LTIME_S(attr->ia_ctime);
|
||||||
io->u.ci_setattr.sa_attr.lvb_size = attr->ia_size;
|
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_valid = attr->ia_valid;
|
io->u.ci_setattr.sa_valid = attr->ia_valid;
|
||||||
io->u.ci_setattr.sa_parent_fid = ll_inode2fid(inode);
|
io->u.ci_setattr.sa_parent_fid = lu_object_fid(&obj->co_lu);
|
||||||
|
|
||||||
again:
|
again:
|
||||||
if (cl_io_init(env, io, CIT_SETATTR, io->ci_obj) == 0) {
|
if (cl_io_init(env, io, CIT_SETATTR, io->ci_obj) == 0) {
|
||||||
|
@ -1336,7 +1336,8 @@ int ll_page_sync_io(const struct lu_env *env, struct cl_io *io,
|
|||||||
int ll_getparent(struct file *file, struct getparent __user *arg);
|
int ll_getparent(struct file *file, struct getparent __user *arg);
|
||||||
|
|
||||||
/* lcommon_cl.c */
|
/* lcommon_cl.c */
|
||||||
int cl_setattr_ost(struct inode *inode, const struct iattr *attr);
|
int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
|
||||||
|
unsigned int attr_flags);
|
||||||
|
|
||||||
extern struct lu_env *cl_inode_fini_env;
|
extern struct lu_env *cl_inode_fini_env;
|
||||||
extern int cl_inode_fini_refcheck;
|
extern int cl_inode_fini_refcheck;
|
||||||
|
@ -1502,7 +1502,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
|
|||||||
*/
|
*/
|
||||||
if (attr->ia_valid & ATTR_SIZE)
|
if (attr->ia_valid & ATTR_SIZE)
|
||||||
down_write(&lli->lli_trunc_sem);
|
down_write(&lli->lli_trunc_sem);
|
||||||
rc = cl_setattr_ost(inode, attr);
|
rc = cl_setattr_ost(ll_i2info(inode)->lli_clob, attr, 0);
|
||||||
if (attr->ia_valid & ATTR_SIZE)
|
if (attr->ia_valid & ATTR_SIZE)
|
||||||
up_write(&lli->lli_trunc_sem);
|
up_write(&lli->lli_trunc_sem);
|
||||||
}
|
}
|
||||||
@ -1879,9 +1879,9 @@ int ll_iocontrol(struct inode *inode, struct file *file,
|
|||||||
return put_user(flags, (int __user *)arg);
|
return put_user(flags, (int __user *)arg);
|
||||||
}
|
}
|
||||||
case FSFILT_IOC_SETFLAGS: {
|
case FSFILT_IOC_SETFLAGS: {
|
||||||
struct lov_stripe_md *lsm;
|
|
||||||
struct obd_info oinfo = { };
|
|
||||||
struct md_op_data *op_data;
|
struct md_op_data *op_data;
|
||||||
|
struct cl_object *obj;
|
||||||
|
struct iattr *attr;
|
||||||
|
|
||||||
if (get_user(flags, (int __user *)arg))
|
if (get_user(flags, (int __user *)arg))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
@ -1901,30 +1901,17 @@ int ll_iocontrol(struct inode *inode, struct file *file,
|
|||||||
|
|
||||||
inode->i_flags = ll_ext_to_inode_flags(flags);
|
inode->i_flags = ll_ext_to_inode_flags(flags);
|
||||||
|
|
||||||
lsm = ccc_inode_lsm_get(inode);
|
obj = ll_i2info(inode)->lli_clob;
|
||||||
if (!lsm_has_objects(lsm)) {
|
if (!obj)
|
||||||
ccc_inode_lsm_put(inode, lsm);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
oinfo.oi_oa = kmem_cache_zalloc(obdo_cachep, GFP_NOFS);
|
attr = kzalloc(sizeof(*attr), GFP_NOFS);
|
||||||
if (!oinfo.oi_oa) {
|
if (!attr)
|
||||||
ccc_inode_lsm_put(inode, lsm);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
oinfo.oi_md = lsm;
|
|
||||||
oinfo.oi_oa->o_oi = lsm->lsm_oi;
|
|
||||||
oinfo.oi_oa->o_flags = flags;
|
|
||||||
oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS |
|
|
||||||
OBD_MD_FLGROUP;
|
|
||||||
obdo_set_parent_fid(oinfo.oi_oa, &ll_i2info(inode)->lli_fid);
|
|
||||||
rc = obd_setattr_rqset(sbi->ll_dt_exp, &oinfo, NULL);
|
|
||||||
kmem_cache_free(obdo_cachep, oinfo.oi_oa);
|
|
||||||
ccc_inode_lsm_put(inode, lsm);
|
|
||||||
|
|
||||||
if (rc && rc != -EPERM && rc != -EACCES)
|
|
||||||
CERROR("osc_setattr_async fails: rc = %d\n", rc);
|
|
||||||
|
|
||||||
|
attr->ia_valid = ATTR_ATTR_FLAG;
|
||||||
|
rc = cl_setattr_ost(obj, attr, flags);
|
||||||
|
kfree(attr);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -551,9 +551,16 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
|
|||||||
if (new_size == 0)
|
if (new_size == 0)
|
||||||
enqflags = CEF_DISCARD_DATA;
|
enqflags = CEF_DISCARD_DATA;
|
||||||
} else {
|
} else {
|
||||||
if ((io->u.ci_setattr.sa_attr.lvb_mtime >=
|
unsigned int valid = io->u.ci_setattr.sa_valid;
|
||||||
io->u.ci_setattr.sa_attr.lvb_ctime) ||
|
|
||||||
(io->u.ci_setattr.sa_attr.lvb_atime >=
|
if (!(valid & TIMES_SET_FLAGS))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((!(valid & ATTR_MTIME) ||
|
||||||
|
io->u.ci_setattr.sa_attr.lvb_mtime >=
|
||||||
|
io->u.ci_setattr.sa_attr.lvb_ctime) &&
|
||||||
|
(!(valid & ATTR_ATIME) ||
|
||||||
|
io->u.ci_setattr.sa_attr.lvb_atime >=
|
||||||
io->u.ci_setattr.sa_attr.lvb_ctime))
|
io->u.ci_setattr.sa_attr.lvb_ctime))
|
||||||
return 0;
|
return 0;
|
||||||
new_size = 0;
|
new_size = 0;
|
||||||
@ -624,7 +631,7 @@ static int vvp_io_setattr_start(const struct lu_env *env,
|
|||||||
if (cl_io_is_trunc(io))
|
if (cl_io_is_trunc(io))
|
||||||
result = vvp_io_setattr_trunc(env, ios, inode,
|
result = vvp_io_setattr_trunc(env, ios, inode,
|
||||||
io->u.ci_setattr.sa_attr.lvb_size);
|
io->u.ci_setattr.sa_attr.lvb_size);
|
||||||
if (result == 0)
|
if (!result && io->u.ci_setattr.sa_valid & TIMES_SET_FLAGS)
|
||||||
result = vvp_io_setattr_time(env, ios);
|
result = vvp_io_setattr_time(env, ios);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -155,12 +155,6 @@ int lov_update_common_set(struct lov_request_set *set,
|
|||||||
int lov_prep_getattr_set(struct obd_export *exp, struct obd_info *oinfo,
|
int lov_prep_getattr_set(struct obd_export *exp, struct obd_info *oinfo,
|
||||||
struct lov_request_set **reqset);
|
struct lov_request_set **reqset);
|
||||||
int lov_fini_getattr_set(struct lov_request_set *set);
|
int lov_fini_getattr_set(struct lov_request_set *set);
|
||||||
int lov_prep_setattr_set(struct obd_export *exp, struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct lov_request_set **reqset);
|
|
||||||
int lov_update_setattr_set(struct lov_request_set *set,
|
|
||||||
struct lov_request *req, int rc);
|
|
||||||
int lov_fini_setattr_set(struct lov_request_set *set);
|
|
||||||
int lov_prep_statfs_set(struct obd_device *obd, struct obd_info *oinfo,
|
int lov_prep_statfs_set(struct obd_device *obd, struct obd_info *oinfo,
|
||||||
struct lov_request_set **reqset);
|
struct lov_request_set **reqset);
|
||||||
int lov_fini_statfs(struct obd_device *obd, struct obd_statfs *osfs,
|
int lov_fini_statfs(struct obd_device *obd, struct obd_statfs *osfs,
|
||||||
|
@ -86,6 +86,8 @@ static void lov_io_sub_inherit(struct cl_io *io, struct lov_io *lio,
|
|||||||
switch (io->ci_type) {
|
switch (io->ci_type) {
|
||||||
case CIT_SETATTR: {
|
case CIT_SETATTR: {
|
||||||
io->u.ci_setattr.sa_attr = parent->u.ci_setattr.sa_attr;
|
io->u.ci_setattr.sa_attr = parent->u.ci_setattr.sa_attr;
|
||||||
|
io->u.ci_setattr.sa_attr_flags =
|
||||||
|
parent->u.ci_setattr.sa_attr_flags;
|
||||||
io->u.ci_setattr.sa_valid = parent->u.ci_setattr.sa_valid;
|
io->u.ci_setattr.sa_valid = parent->u.ci_setattr.sa_valid;
|
||||||
io->u.ci_setattr.sa_stripe_index = stripe;
|
io->u.ci_setattr.sa_stripe_index = stripe;
|
||||||
io->u.ci_setattr.sa_parent_fid =
|
io->u.ci_setattr.sa_parent_fid =
|
||||||
|
@ -1047,87 +1047,6 @@ out:
|
|||||||
return rc ? rc : err;
|
return rc ? rc : err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lov_setattr_interpret(struct ptlrpc_request_set *rqset,
|
|
||||||
void *data, int rc)
|
|
||||||
{
|
|
||||||
struct lov_request_set *lovset = (struct lov_request_set *)data;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (rc)
|
|
||||||
atomic_set(&lovset->set_completes, 0);
|
|
||||||
err = lov_fini_setattr_set(lovset);
|
|
||||||
return rc ? rc : err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If @oti is given, the request goes from MDS and responses from OSTs are not
|
|
||||||
* needed. Otherwise, a client is waiting for responses.
|
|
||||||
*/
|
|
||||||
static int lov_setattr_async(struct obd_export *exp, struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct ptlrpc_request_set *rqset)
|
|
||||||
{
|
|
||||||
struct lov_request_set *set;
|
|
||||||
struct lov_request *req;
|
|
||||||
struct lov_obd *lov;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
LASSERT(oinfo);
|
|
||||||
ASSERT_LSM_MAGIC(oinfo->oi_md);
|
|
||||||
if (oinfo->oi_oa->o_valid & OBD_MD_FLCOOKIE) {
|
|
||||||
LASSERT(oti);
|
|
||||||
LASSERT(oti->oti_logcookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!exp || !exp->exp_obd)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
lov = &exp->exp_obd->u.lov;
|
|
||||||
rc = lov_prep_setattr_set(exp, oinfo, oti, &set);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
CDEBUG(D_INFO, "objid "DOSTID": %ux%u byte stripes\n",
|
|
||||||
POSTID(&oinfo->oi_md->lsm_oi),
|
|
||||||
oinfo->oi_md->lsm_stripe_count,
|
|
||||||
oinfo->oi_md->lsm_stripe_size);
|
|
||||||
|
|
||||||
list_for_each_entry(req, &set->set_list, rq_link) {
|
|
||||||
if (oinfo->oi_oa->o_valid & OBD_MD_FLCOOKIE)
|
|
||||||
oti->oti_logcookies = set->set_cookies + req->rq_stripe;
|
|
||||||
|
|
||||||
CDEBUG(D_INFO, "objid " DOSTID "[%d] has subobj " DOSTID " at idx%u\n",
|
|
||||||
POSTID(&oinfo->oi_oa->o_oi), req->rq_stripe,
|
|
||||||
POSTID(&req->rq_oi.oi_oa->o_oi), req->rq_idx);
|
|
||||||
|
|
||||||
rc = obd_setattr_async(lov->lov_tgts[req->rq_idx]->ltd_exp,
|
|
||||||
&req->rq_oi, oti, rqset);
|
|
||||||
if (rc) {
|
|
||||||
CERROR("error: setattr objid "DOSTID" subobj"
|
|
||||||
DOSTID" on OST idx %d: rc = %d\n",
|
|
||||||
POSTID(&set->set_oi->oi_oa->o_oi),
|
|
||||||
POSTID(&req->rq_oi.oi_oa->o_oi),
|
|
||||||
req->rq_idx, rc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we are not waiting for responses on async requests, return. */
|
|
||||||
if (rc || !rqset || list_empty(&rqset->set_requests)) {
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (rc)
|
|
||||||
atomic_set(&set->set_completes, 0);
|
|
||||||
err = lov_fini_setattr_set(set);
|
|
||||||
return rc ? rc : err;
|
|
||||||
}
|
|
||||||
|
|
||||||
LASSERT(!rqset->set_interpret);
|
|
||||||
rqset->set_interpret = lov_setattr_interpret;
|
|
||||||
rqset->set_arg = (void *)set;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lov_statfs_interpret(struct ptlrpc_request_set *rqset, void *data, int rc)
|
int lov_statfs_interpret(struct ptlrpc_request_set *rqset, void *data, int rc)
|
||||||
{
|
{
|
||||||
struct lov_request_set *lovset = (struct lov_request_set *)data;
|
struct lov_request_set *lovset = (struct lov_request_set *)data;
|
||||||
@ -1613,7 +1532,6 @@ static struct obd_ops lov_obd_ops = {
|
|||||||
.packmd = lov_packmd,
|
.packmd = lov_packmd,
|
||||||
.unpackmd = lov_unpackmd,
|
.unpackmd = lov_unpackmd,
|
||||||
.getattr_async = lov_getattr_async,
|
.getattr_async = lov_getattr_async,
|
||||||
.setattr_async = lov_setattr_async,
|
|
||||||
.iocontrol = lov_iocontrol,
|
.iocontrol = lov_iocontrol,
|
||||||
.get_info = lov_get_info,
|
.get_info = lov_get_info,
|
||||||
.set_info_async = lov_set_info_async,
|
.set_info_async = lov_set_info_async,
|
||||||
|
@ -311,137 +311,6 @@ out_set:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lov_fini_setattr_set(struct lov_request_set *set)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
if (!set)
|
|
||||||
return 0;
|
|
||||||
LASSERT(set->set_exp);
|
|
||||||
if (atomic_read(&set->set_completes)) {
|
|
||||||
rc = common_attr_done(set);
|
|
||||||
/* FIXME update qos data here */
|
|
||||||
}
|
|
||||||
|
|
||||||
lov_put_reqset(set);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lov_update_setattr_set(struct lov_request_set *set,
|
|
||||||
struct lov_request *req, int rc)
|
|
||||||
{
|
|
||||||
struct lov_obd *lov = &req->rq_rqset->set_exp->exp_obd->u.lov;
|
|
||||||
struct lov_stripe_md *lsm = req->rq_rqset->set_oi->oi_md;
|
|
||||||
|
|
||||||
lov_update_set(set, req, rc);
|
|
||||||
|
|
||||||
/* grace error on inactive ost */
|
|
||||||
if (rc && !(lov->lov_tgts[req->rq_idx] &&
|
|
||||||
lov->lov_tgts[req->rq_idx]->ltd_active))
|
|
||||||
rc = 0;
|
|
||||||
|
|
||||||
if (rc == 0) {
|
|
||||||
if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCTIME)
|
|
||||||
lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_ctime =
|
|
||||||
req->rq_oi.oi_oa->o_ctime;
|
|
||||||
if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLMTIME)
|
|
||||||
lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_mtime =
|
|
||||||
req->rq_oi.oi_oa->o_mtime;
|
|
||||||
if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLATIME)
|
|
||||||
lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_atime =
|
|
||||||
req->rq_oi.oi_oa->o_atime;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The callback for osc_setattr_async that finalizes a request info when a
|
|
||||||
* response is received.
|
|
||||||
*/
|
|
||||||
static int cb_setattr_update(void *cookie, int rc)
|
|
||||||
{
|
|
||||||
struct obd_info *oinfo = cookie;
|
|
||||||
struct lov_request *lovreq;
|
|
||||||
|
|
||||||
lovreq = container_of(oinfo, struct lov_request, rq_oi);
|
|
||||||
return lov_update_setattr_set(lovreq->rq_rqset, lovreq, rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int lov_prep_setattr_set(struct obd_export *exp, struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct lov_request_set **reqset)
|
|
||||||
{
|
|
||||||
struct lov_request_set *set;
|
|
||||||
struct lov_obd *lov = &exp->exp_obd->u.lov;
|
|
||||||
int rc = 0, i;
|
|
||||||
|
|
||||||
set = kzalloc(sizeof(*set), GFP_NOFS);
|
|
||||||
if (!set)
|
|
||||||
return -ENOMEM;
|
|
||||||
lov_init_set(set);
|
|
||||||
|
|
||||||
set->set_exp = exp;
|
|
||||||
set->set_oi = oinfo;
|
|
||||||
if (oti && oinfo->oi_oa->o_valid & OBD_MD_FLCOOKIE)
|
|
||||||
set->set_cookies = oti->oti_logcookies;
|
|
||||||
|
|
||||||
for (i = 0; i < oinfo->oi_md->lsm_stripe_count; i++) {
|
|
||||||
struct lov_oinfo *loi = oinfo->oi_md->lsm_oinfo[i];
|
|
||||||
struct lov_request *req;
|
|
||||||
|
|
||||||
if (lov_oinfo_is_dummy(loi))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!lov_check_and_wait_active(lov, loi->loi_ost_idx)) {
|
|
||||||
CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
req = kzalloc(sizeof(*req), GFP_NOFS);
|
|
||||||
if (!req) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto out_set;
|
|
||||||
}
|
|
||||||
req->rq_stripe = i;
|
|
||||||
req->rq_idx = loi->loi_ost_idx;
|
|
||||||
|
|
||||||
req->rq_oi.oi_oa = kmem_cache_zalloc(obdo_cachep, GFP_NOFS);
|
|
||||||
if (!req->rq_oi.oi_oa) {
|
|
||||||
kfree(req);
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto out_set;
|
|
||||||
}
|
|
||||||
memcpy(req->rq_oi.oi_oa, oinfo->oi_oa,
|
|
||||||
sizeof(*req->rq_oi.oi_oa));
|
|
||||||
req->rq_oi.oi_oa->o_oi = loi->loi_oi;
|
|
||||||
req->rq_oi.oi_oa->o_stripe_idx = i;
|
|
||||||
req->rq_oi.oi_cb_up = cb_setattr_update;
|
|
||||||
|
|
||||||
if (oinfo->oi_oa->o_valid & OBD_MD_FLSIZE) {
|
|
||||||
int off = lov_stripe_offset(oinfo->oi_md,
|
|
||||||
oinfo->oi_oa->o_size, i,
|
|
||||||
&req->rq_oi.oi_oa->o_size);
|
|
||||||
|
|
||||||
if (off < 0 && req->rq_oi.oi_oa->o_size)
|
|
||||||
req->rq_oi.oi_oa->o_size--;
|
|
||||||
|
|
||||||
CDEBUG(D_INODE, "stripe %d has size %llu/%llu\n",
|
|
||||||
i, req->rq_oi.oi_oa->o_size,
|
|
||||||
oinfo->oi_oa->o_size);
|
|
||||||
}
|
|
||||||
lov_set_add_req(req, set);
|
|
||||||
}
|
|
||||||
if (!set->set_count) {
|
|
||||||
rc = -EIO;
|
|
||||||
goto out_set;
|
|
||||||
}
|
|
||||||
*reqset = set;
|
|
||||||
return rc;
|
|
||||||
out_set:
|
|
||||||
lov_fini_setattr_set(set);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LOV_U64_MAX ((__u64)~0ULL)
|
#define LOV_U64_MAX ((__u64)~0ULL)
|
||||||
#define LOV_SUM_MAX(tot, add) \
|
#define LOV_SUM_MAX(tot, add) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -119,8 +119,7 @@ int osc_match_base(struct obd_export *exp, struct ldlm_res_id *res_id,
|
|||||||
__u64 *flags, void *data, struct lustre_handle *lockh,
|
__u64 *flags, void *data, struct lustre_handle *lockh,
|
||||||
int unref);
|
int unref);
|
||||||
|
|
||||||
int osc_setattr_async_base(struct obd_export *exp, struct obd_info *oinfo,
|
int osc_setattr_async(struct obd_export *exp, struct obd_info *oinfo,
|
||||||
struct obd_trans_info *oti,
|
|
||||||
obd_enqueue_update_f upcall, void *cookie,
|
obd_enqueue_update_f upcall, void *cookie,
|
||||||
struct ptlrpc_request_set *rqset);
|
struct ptlrpc_request_set *rqset);
|
||||||
int osc_punch_base(struct obd_export *exp, struct obd_info *oinfo,
|
int osc_punch_base(struct obd_export *exp, struct obd_info *oinfo,
|
||||||
|
@ -524,11 +524,19 @@ static int osc_io_setattr_start(const struct lu_env *env,
|
|||||||
oa->o_oi = loi->loi_oi;
|
oa->o_oi = loi->loi_oi;
|
||||||
obdo_set_parent_fid(oa, io->u.ci_setattr.sa_parent_fid);
|
obdo_set_parent_fid(oa, io->u.ci_setattr.sa_parent_fid);
|
||||||
oa->o_stripe_idx = io->u.ci_setattr.sa_stripe_index;
|
oa->o_stripe_idx = io->u.ci_setattr.sa_stripe_index;
|
||||||
oa->o_mtime = attr->cat_mtime;
|
oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
|
||||||
oa->o_atime = attr->cat_atime;
|
if (ia_valid & ATTR_CTIME) {
|
||||||
|
oa->o_valid |= OBD_MD_FLCTIME;
|
||||||
oa->o_ctime = attr->cat_ctime;
|
oa->o_ctime = attr->cat_ctime;
|
||||||
oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP | OBD_MD_FLATIME |
|
}
|
||||||
OBD_MD_FLCTIME | OBD_MD_FLMTIME;
|
if (ia_valid & ATTR_ATIME) {
|
||||||
|
oa->o_valid |= OBD_MD_FLATIME;
|
||||||
|
oa->o_atime = attr->cat_atime;
|
||||||
|
}
|
||||||
|
if (ia_valid & ATTR_MTIME) {
|
||||||
|
oa->o_valid |= OBD_MD_FLMTIME;
|
||||||
|
oa->o_mtime = attr->cat_mtime;
|
||||||
|
}
|
||||||
if (ia_valid & ATTR_SIZE) {
|
if (ia_valid & ATTR_SIZE) {
|
||||||
oa->o_size = size;
|
oa->o_size = size;
|
||||||
oa->o_blocks = OBD_OBJECT_EOF;
|
oa->o_blocks = OBD_OBJECT_EOF;
|
||||||
@ -541,6 +549,10 @@ static int osc_io_setattr_start(const struct lu_env *env,
|
|||||||
} else {
|
} else {
|
||||||
LASSERT(oio->oi_lockless == 0);
|
LASSERT(oio->oi_lockless == 0);
|
||||||
}
|
}
|
||||||
|
if (ia_valid & ATTR_ATTR_FLAG) {
|
||||||
|
oa->o_flags = io->u.ci_setattr.sa_attr_flags;
|
||||||
|
oa->o_valid |= OBD_MD_FLFLAGS;
|
||||||
|
}
|
||||||
|
|
||||||
oinfo.oi_oa = oa;
|
oinfo.oi_oa = oa;
|
||||||
init_completion(&cbargs->opc_sync);
|
init_completion(&cbargs->opc_sync);
|
||||||
@ -550,9 +562,8 @@ static int osc_io_setattr_start(const struct lu_env *env,
|
|||||||
&oinfo, osc_async_upcall,
|
&oinfo, osc_async_upcall,
|
||||||
cbargs, PTLRPCD_SET);
|
cbargs, PTLRPCD_SET);
|
||||||
else
|
else
|
||||||
result = osc_setattr_async_base(osc_export(cl2osc(obj)),
|
result = osc_setattr_async(osc_export(cl2osc(obj)),
|
||||||
&oinfo, NULL,
|
&oinfo, osc_async_upcall,
|
||||||
osc_async_upcall,
|
|
||||||
cbargs, PTLRPCD_SET);
|
cbargs, PTLRPCD_SET);
|
||||||
cbargs->opc_rpc_sent = result == 0;
|
cbargs->opc_rpc_sent = result == 0;
|
||||||
}
|
}
|
||||||
|
@ -341,8 +341,7 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int osc_setattr_async_base(struct obd_export *exp, struct obd_info *oinfo,
|
int osc_setattr_async(struct obd_export *exp, struct obd_info *oinfo,
|
||||||
struct obd_trans_info *oti,
|
|
||||||
obd_enqueue_update_f upcall, void *cookie,
|
obd_enqueue_update_f upcall, void *cookie,
|
||||||
struct ptlrpc_request_set *rqset)
|
struct ptlrpc_request_set *rqset)
|
||||||
{
|
{
|
||||||
@ -360,9 +359,6 @@ int osc_setattr_async_base(struct obd_export *exp, struct obd_info *oinfo,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oti && oinfo->oi_oa->o_valid & OBD_MD_FLCOOKIE)
|
|
||||||
oinfo->oi_oa->o_lcookie = *oti->oti_logcookies;
|
|
||||||
|
|
||||||
osc_pack_req_body(req, oinfo);
|
osc_pack_req_body(req, oinfo);
|
||||||
|
|
||||||
ptlrpc_request_set_replen(req);
|
ptlrpc_request_set_replen(req);
|
||||||
@ -390,14 +386,6 @@ int osc_setattr_async_base(struct obd_export *exp, struct obd_info *oinfo,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int osc_setattr_async(struct obd_export *exp, struct obd_info *oinfo,
|
|
||||||
struct obd_trans_info *oti,
|
|
||||||
struct ptlrpc_request_set *rqset)
|
|
||||||
{
|
|
||||||
return osc_setattr_async_base(exp, oinfo, oti,
|
|
||||||
oinfo->oi_cb_up, oinfo, rqset);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int osc_create(const struct lu_env *env, struct obd_export *exp,
|
static int osc_create(const struct lu_env *env, struct obd_export *exp,
|
||||||
struct obdo *oa, struct obd_trans_info *oti)
|
struct obdo *oa, struct obd_trans_info *oti)
|
||||||
{
|
{
|
||||||
@ -3013,7 +3001,6 @@ static struct obd_ops osc_obd_ops = {
|
|||||||
.getattr = osc_getattr,
|
.getattr = osc_getattr,
|
||||||
.getattr_async = osc_getattr_async,
|
.getattr_async = osc_getattr_async,
|
||||||
.setattr = osc_setattr,
|
.setattr = osc_setattr,
|
||||||
.setattr_async = osc_setattr_async,
|
|
||||||
.iocontrol = osc_iocontrol,
|
.iocontrol = osc_iocontrol,
|
||||||
.set_info_async = osc_set_info_async,
|
.set_info_async = osc_set_info_async,
|
||||||
.import_event = osc_import_event,
|
.import_event = osc_import_event,
|
||||||
|
Loading…
Reference in New Issue
Block a user