free_page((unsigned long)buf);
}
+ssize_t ll_copy_user_md(const struct lov_user_md __user *md,
+ struct lov_user_md **kbuf)
+{
+ struct lov_user_md lum;
+ ssize_t lum_size;
+ ENTRY;
+
+ if (copy_from_user(&lum, md, sizeof(lum)))
+ RETURN(-EFAULT);
+
+ lum_size = ll_lov_user_md_size(&lum);
+ if (lum_size < 0)
+ RETURN(lum_size);
+
+ OBD_ALLOC(*kbuf, lum_size);
+ if (*kbuf == NULL)
+ RETURN(-ENOMEM);
+
+ if (copy_from_user(*kbuf, md, lum_size) != 0) {
+ OBD_FREE(*kbuf, lum_size);
+ RETURN(-EFAULT);
+ }
+
+ RETURN(lum_size);
+}
+
/*
* Compute llite root squash state after a change of root squash
* configuration setting or add/remove of a lnet nid