- LBUG();
- return -EINVAL;
-
-got_it:
- from = (char*)de - (char*)page_address(page);
- to = from + rec_len;
- lock_page(page);
- err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
- if (err)
- goto out_unlock;
- if (de->inode) {
- ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len);
- de1->rec_len = cpu_to_le16(rec_len - name_len);
- de->rec_len = cpu_to_le16(name_len);
- de = de1;
+ case IOC_MDC_GETSTRIPE: {
+ struct ptlrpc_request *request = NULL;
+ struct ll_fid fid;
+ struct mds_body *body;
+ struct lov_user_md *lump = (struct lov_user_md *)arg;
+ struct lov_mds_md *lmm;
+ char *filename;
+ int rc, lmmsize;
+
+ filename = getname((const char *)arg);
+ if (IS_ERR(filename))
+ RETURN(PTR_ERR(filename));
+
+ ll_inode2fid(&fid, inode);
+ rc = mdc_getattr_name(sbi->ll_mdc_exp, &fid, filename,
+ strlen(filename)+1, OBD_MD_FLEASIZE,
+ obd_size_diskmd(sbi->ll_osc_exp, NULL),
+ &request);
+ if (rc < 0) {
+ CDEBUG(D_INFO, "mdc_getattr_name failed on %s: rc %d\n",
+ filename, rc);
+ GOTO(out_name, rc);
+ }
+
+ body = lustre_msg_buf(request->rq_repmsg, 0, sizeof (*body));
+ LASSERT(body != NULL); /* checked by mdc_getattr_name */
+ LASSERT_REPSWABBED(request, 0);/* swabbed by mdc_getattr_name */
+
+ lmmsize = body->eadatasize;
+
+ if (!(body->valid & OBD_MD_FLEASIZE) || lmmsize == 0)
+ GOTO(out_req, rc = -ENODATA);
+
+ if (lmmsize > 4096)
+ GOTO(out_req, rc = -EFBIG);
+
+ lmm = lustre_msg_buf(request->rq_repmsg, 1, lmmsize);
+ LASSERT(lmm != NULL);
+ LASSERT_REPSWABBED(request, 1);
+
+ rc = copy_to_user(lump, lmm, lmmsize);
+ if (rc)
+ GOTO(out_req, rc = -EFAULT);
+
+ EXIT;
+ out_req:
+ ptlrpc_req_finished(request);
+ out_name:
+ putname(filename);
+ return rc;