9p: Add 'u' and 'g' format specifies for kuids and kgids
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 30 Jan 2013 01:07:42 +0000 (17:07 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 12 Feb 2013 11:19:29 +0000 (03:19 -0800)
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>
net/9p/protocol.c

index 3d33ecf..c289c6c 100644 (file)
@@ -85,6 +85,8 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size)
        d - int32_t
        q - int64_t
        s - string
+       u - numeric uid
+       g - numeric gid
        S - stat
        Q - qid
        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;
                        }
                        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':{
                                struct p9_qid *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;
                        }
                        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':{
                                const struct p9_qid *qid =
                                    va_arg(ap, const struct p9_qid *);