浏览代码

9p: Add 'u' and 'g' format specifies for kuids and kgids

This allows concentrating all of the conversion to and from kuids and
kgids into the format needed by the 9p protocol into one location.

Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Ron Minnich <rminnich@gmail.com>
Cc: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman 12 年之前
父节点
当前提交
97fc8b1ebf
共有 1 个文件被更改,包括 36 次插入0 次删除
  1. 36 0
      net/9p/protocol.c

+ 36 - 0
net/9p/protocol.c

@@ -85,6 +85,8 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size)
 	d - int32_t
 	d - int32_t
 	q - int64_t
 	q - int64_t
 	s - string
 	s - string
+	u - numeric uid
+	g - numeric gid
 	S - stat
 	S - stat
 	Q - qid
 	Q - qid
 	D - data blob (int32_t size followed by void *, results are not freed)
 	D - data blob (int32_t size followed by void *, results are not freed)
@@ -163,6 +165,26 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt,
 					(*sptr)[len] = 0;
 					(*sptr)[len] = 0;
 			}
 			}
 			break;
 			break;
+		case 'u': {
+				kuid_t *uid = va_arg(ap, kuid_t *);
+				__le32 le_val;
+				if (pdu_read(pdu, &le_val, sizeof(le_val))) {
+					errcode = -EFAULT;
+					break;
+				}
+				*uid = make_kuid(&init_user_ns,
+						 le32_to_cpu(le_val));
+			} break;
+		case 'g': {
+				kgid_t *gid = va_arg(ap, kgid_t *);
+				__le32 le_val;
+				if (pdu_read(pdu, &le_val, sizeof(le_val))) {
+					errcode = -EFAULT;
+					break;
+				}
+				*gid = make_kgid(&init_user_ns,
+						 le32_to_cpu(le_val));
+			} break;
 		case 'Q':{
 		case 'Q':{
 				struct p9_qid *qid =
 				struct p9_qid *qid =
 				    va_arg(ap, struct p9_qid *);
 				    va_arg(ap, struct p9_qid *);
@@ -377,6 +399,20 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
 					errcode = -EFAULT;
 					errcode = -EFAULT;
 			}
 			}
 			break;
 			break;
+		case 'u': {
+				kuid_t uid = va_arg(ap, kuid_t);
+				__le32 val = cpu_to_le32(
+						from_kuid(&init_user_ns, uid));
+				if (pdu_write(pdu, &val, sizeof(val)))
+					errcode = -EFAULT;
+			} break;
+		case 'g': {
+				kgid_t gid = va_arg(ap, kgid_t);
+				__le32 val = cpu_to_le32(
+						from_kgid(&init_user_ns, gid));
+				if (pdu_write(pdu, &val, sizeof(val)))
+					errcode = -EFAULT;
+			} break;
 		case 'Q':{
 		case 'Q':{
 				const struct p9_qid *qid =
 				const struct p9_qid *qid =
 				    va_arg(ap, const struct p9_qid *);
 				    va_arg(ap, const struct p9_qid *);