extern struct address_space_operations ll_aops;
+void ll_release(struct dentry *de)
+{
+ ENTRY;
+
+ OBD_FREE(de->d_fsdata, sizeof(struct ll_dentry_data));
+ EXIT;
+}
+
void ll_intent_release(struct dentry *de)
{
struct lustre_handle *handle;
EXIT;
return;
}
+
+ LASSERT(ll_d2d(de) != NULL);
+
if (de->d_it->it_lock_mode) {
handle = (struct lustre_handle *)de->d_it->it_lock_handle;
if (de->d_it->it_op == IT_SETATTR) {
} else
ldlm_lock_decref(handle, de->d_it->it_lock_mode);
}
- de->d_it = NULL;
+ // de->d_it = NULL;
+ up(&ll_d2d(de)->lld_it_sem);
EXIT;
}
if (atomic_read(&de->d_count) > 0)
RETURN(1);
+ if (ll_d2d(de) == NULL) {
+ CERROR("allocating fsdata\n");
+ ll_set_dd(de);
+ }
+ down(&ll_d2d(de)->lld_it_sem);
+ // de->d_it = it;
+
+ RETURN(0);
+}
+
+int ll_set_dd(struct dentry *de)
+{
+ ENTRY;
+ LASSERT(de != NULL);
+
+ lock_kernel();
+
+ if (de->d_fsdata != NULL) {
+ CERROR("dentry %p already has d_fsdata set\n", de);
+ } else {
+ OBD_ALLOC(de->d_fsdata, sizeof(struct ll_dentry_data));
+ sema_init(&ll_d2d(de)->lld_it_sem, 1);
+ }
+
+ unlock_kernel();
+
RETURN(0);
}
struct dentry_operations ll_d_ops = {
- d_revalidate2: ll_revalidate2,
- d_intent_release: ll_intent_release
+ .d_revalidate2 = ll_revalidate2,
+ .d_intent_release = ll_intent_release,
+ .d_release = ll_release,
};