+ encode_pre_wcc(&result.wccstat3_u.wcc, dir);
+
+ if (!validate_filename(argp->name)
+ || strcmp(argp->name, ".") == 0
+ || strcmp(argp->name, "..") == 0)
+ {
+ result.status = NFS3ERR_NOENT;
+ g_mutex_unlock(dir->lock);
+ async_rpc_send_reply(req, &result);
+ return;
+ }
+
+ uint64_t inum = bluesky_directory_lookup(dir, argp->name);
+ BlueSkyInode *inode = bluesky_get_inode(fs, inum);
+ if (inode == NULL) {
+ result.status = NFS3ERR_NOENT;
+ g_mutex_unlock(dir->lock);
+ async_rpc_send_reply(req, &result);
+ return;
+ }
+ g_mutex_lock(inode->lock);
+ schedule_inode_unref(req, inode);
+
+ if (inode->type != BLUESKY_DIRECTORY) {
+ result.status = NFS3ERR_NOTDIR;
+ g_mutex_unlock(inode->lock);
+ g_mutex_unlock(dir->lock);
+ async_rpc_send_reply(req, &result);
+ return;
+ }
+ if (g_sequence_get_length(inode->dirents) > 0) {
+ printf("Directory not empty: %d entries\n",
+ g_sequence_get_length(inode->dirents));
+ result.status = NFS3ERR_NOTEMPTY;
+ g_mutex_unlock(inode->lock);
+ g_mutex_unlock(dir->lock);
+ async_rpc_send_reply(req, &result);
+ return;
+ }
+
+ /* TODO: Decrement link count, deallocate inode if needed. */
+
+ bluesky_directory_remove(dir, argp->name);
+
+ result.status = NFS3_OK;
+ result.wccstat3_u.wcc.after.present = TRUE;
+ encode_fattr3(&result.wccstat3_u.wcc.after.post_op_attr_u.attributes,
+ dir);
+
+ bluesky_inode_do_sync(dir);
+ bluesky_inode_do_sync(inode);
+ g_mutex_unlock(inode->lock);
+ g_mutex_unlock(dir->lock);
+ async_rpc_send_reply(req, &result);