+int
+mds_destroy_object(struct obd_device *obd,
+ struct inode *inode, int async)
+{
+ struct mds_obd *mds = &obd->u.mds;
+ struct lov_mds_md *lmm = NULL;
+ int rc, lmm_size;
+ ENTRY;
+
+ LASSERT(inode != NULL);
+
+ if (inode->i_nlink != 0) {
+ CDEBUG(D_INODE, "attempt to destroy OSS object when "
+ "i_nlink == %d\n", (int)inode->i_nlink);
+ RETURN(0);
+ }
+
+ OBD_ALLOC(lmm, mds->mds_max_mdsize);
+ if (lmm == NULL)
+ RETURN(-ENOMEM);
+
+ lmm_size = mds->mds_max_mdsize;
+ rc = mds_get_md(obd, inode, lmm, &lmm_size, 1, 0);
+ if (rc < 0) {
+ CERROR("no stripe info for %lu/%lu inode\n",
+ (unsigned long)inode->i_ino,
+ (unsigned long)inode->i_generation);
+ GOTO(out_free_lmm, rc);
+ }
+
+ if (rc > 0) {
+ /* asynchronously unlink objecect on OSS */
+ rc = mds_unlink_object(mds, inode, lmm, lmm_size,
+ NULL, 0, async);
+ if (rc) {
+ CERROR("error unlinking object on OSS, "
+ "err %d\n", rc);
+ GOTO(out_free_lmm, rc);
+ }
+ } else {
+ CDEBUG(D_INODE, "no stripping info found for inode "
+ "%lu/%lu\n", (unsigned long)inode->i_ino,
+ (unsigned long)inode->i_generation);
+ }
+ EXIT;
+out_free_lmm:
+ OBD_FREE(lmm, mds->mds_max_mdsize);
+ return rc;
+}
+