if (lock->l_resource->lr_lvb_len) {
void *lvb = req_capsule_client_get(&req->rq_pill, &RMF_DLM_LVB);
- cfs_down(&lock->l_resource->lr_lvb_sem);
+ lock_res(lock->l_resource);
memcpy(lvb, lock->l_resource->lr_lvb_data,
lock->l_resource->lr_lvb_len);
- cfs_up(&lock->l_resource->lr_lvb_sem);
+ unlock_res(lock->l_resource);
}
LDLM_DEBUG(lock, "server preparing completion AST (after %lds wait)",
* local_lock_enqueue by the policy function. */
cookie = req;
} else {
+ /* based on the assumption that lvb size never changes during
+ * resource life time otherwise it need resource->lr_lock's
+ * protection */
if (lock->l_resource->lr_lvb_len) {
req_capsule_set_size(&req->rq_pill, &RMF_DLM_LVB,
RCL_SERVER,
if (rc == 0) {
if (lock->l_resource->lr_lvb_len > 0) {
+ /* MDT path won't handle lr_lvb_data, so
+ * lock/unlock better be contained in the
+ * if block */
void *lvb;
lvb = req_capsule_server_get(&req->rq_pill,
&RMF_DLM_LVB);
LASSERTF(lvb != NULL, "req %p, lock %p\n",
req, lock);
-
- cfs_down(&lock->l_resource->lr_lvb_sem);
+ lock_res(lock->l_resource);
memcpy(lvb, lock->l_resource->lr_lvb_data,
lock->l_resource->lr_lvb_len);
- cfs_up(&lock->l_resource->lr_lvb_sem);
+ unlock_res(lock->l_resource);
}
} else {
lock_res_and_lock(lock);
LPU64")\n", obd->obd_name, res->lr_name.name[1],
res->lr_name.name[0]);
- dentry = filter_fid2dentry(obd, NULL, res->lr_name.name[1],
+ dentry = filter_fid2dentry(obd, NULL, res->lr_name.name[1],
res->lr_name.name[0]);
if (IS_ERR(dentry)) {
rc = PTR_ERR(dentry);
/* This will be called in two ways:
*
- * m != NULL : called by the DLM itself after a glimpse callback
- * m == NULL : called by the filter after a disk write
+ * r != NULL : called by the DLM itself after a glimpse callback
+ * r == NULL : called by the filter after a disk write
*
* If 'increase_only' is true, don't allow values to move backwards.
*/
struct ost_lvb *lvb;
struct obd_device *obd;
struct inode *inode;
+ struct inode *tmpinode = NULL;
ENTRY;
LASSERT(res);
- cfs_down(&res->lr_lvb_sem);
+ lock_res(res);
lvb = res->lr_lvb_data;
if (lvb == NULL) {
CERROR("No lvb when running lvbo_update!\n");
LASSERT(obd);
inode = res->lr_lvb_inode;
- /* filter_fid2dentry could fail */
- if (unlikely(!inode)) {
+ /* filter_fid2dentry could fail, esp. in OBD_FAIL_OST_ENOENT test case */
+ if (unlikely(inode == NULL)) {
struct dentry *dentry;
- dentry = filter_fid2dentry(obd, NULL, res->lr_name.name[1],
+ unlock_res(res);
+
+ dentry = filter_fid2dentry(obd, NULL, res->lr_name.name[1],
res->lr_name.name[0]);
if (IS_ERR(dentry))
- GOTO(out, rc = PTR_ERR(dentry));
+ RETURN(PTR_ERR(dentry));
if (dentry->d_inode)
- inode = res->lr_lvb_inode = igrab(dentry->d_inode);
+ tmpinode = igrab(dentry->d_inode);
f_dput(dentry);
+ /* tmpinode could be NULL, but it does not matter if other
+ * have set res->lr_lvb_inode */
+ lock_res(res);
+ if (res->lr_lvb_inode == NULL) {
+ res->lr_lvb_inode = tmpinode;
+ tmpinode = NULL;
+ }
+ inode = res->lr_lvb_inode;
}
if (!inode || !inode->i_nlink)
}
out:
- cfs_up(&res->lr_lvb_sem);
+ unlock_res(res);
+ if (tmpinode)
+ iput(tmpinode);
return rc;
}