summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch')
-rw-r--r--target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch155
1 files changed, 155 insertions, 0 deletions
diff --git a/target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch b/target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch
new file mode 100644
index 0000000000..c1f7367dd8
--- /dev/null
+++ b/target/linux/generic/patches-4.0/501-yaffs-3.5-convert-to-use-kuid_t-kgid_t.patch
@@ -0,0 +1,155 @@
+--- a/fs/yaffs2/yaffs_vfs.c
++++ b/fs/yaffs2/yaffs_vfs.c
+@@ -329,6 +329,33 @@ static int yaffs_readpage(struct file *f
+ return ret;
+ }
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
++#define YCRED_FSUID() from_kuid(&init_user_ns, current_fsuid())
++#define YCRED_FSGID() from_kgid(&init_user_ns, current_fsgid())
++#else
++#define YCRED_FSUID() YCRED(current)->fsuid
++#define YCRED_FSGID() YCRED(current)->fsgid
++
++static inline uid_t i_uid_read(const struct inode *inode)
++{
++ return inode->i_uid;
++}
++
++static inline gid_t i_gid_read(const struct inode *inode)
++{
++ return inode->i_gid;
++}
++
++static inline void i_uid_write(struct inode *inode, uid_t uid)
++{
++ inode->i_uid = uid;
++}
++
++static inline void i_gid_write(struct inode *inode, gid_t gid)
++{
++ inode->i_gid = gid;
++}
++#endif
+
+ static void yaffs_set_super_dirty_val(struct yaffs_dev *dev, int val)
+ {
+@@ -1225,9 +1252,9 @@ static int yaffs_mknod(struct inode *dir
+ struct yaffs_obj *parent = yaffs_inode_to_obj(dir);
+
+ int error = -ENOSPC;
+- uid_t uid = YCRED(current)->fsuid;
++ uid_t uid = YCRED_FSUID();
+ gid_t gid =
+- (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
++ (dir->i_mode & S_ISGID) ? i_gid_read(dir) : YCRED_FSGID();
+
+ if ((dir->i_mode & S_ISGID) && S_ISDIR(mode))
+ mode |= S_ISGID;
+@@ -1424,9 +1451,9 @@ static int yaffs_symlink(struct inode *d
+ {
+ struct yaffs_obj *obj;
+ struct yaffs_dev *dev;
+- uid_t uid = YCRED(current)->fsuid;
++ uid_t uid = YCRED_FSUID();
+ gid_t gid =
+- (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
++ (dir->i_mode & S_ISGID) ? i_gid_read(dir) : YCRED_FSGID();
+
+ yaffs_trace(YAFFS_TRACE_OS, "yaffs_symlink");
+
+@@ -1829,8 +1856,8 @@ static void yaffs_fill_inode_from_obj(st
+
+ inode->i_ino = obj->obj_id;
+ inode->i_mode = obj->yst_mode;
+- inode->i_uid = obj->yst_uid;
+- inode->i_gid = obj->yst_gid;
++ i_uid_write(inode, obj->yst_uid);
++ i_gid_write(inode, obj->yst_gid);
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
+ inode->i_blksize = inode->i_sb->s_blocksize;
+ #endif
+@@ -1856,7 +1883,7 @@ static void yaffs_fill_inode_from_obj(st
+
+ yaffs_trace(YAFFS_TRACE_OS,
+ "yaffs_fill_inode mode %x uid %d gid %d size %lld count %d",
+- inode->i_mode, inode->i_uid, inode->i_gid,
++ inode->i_mode, i_uid_read(inode), i_gid_read(inode),
+ inode->i_size, atomic_read(&inode->i_count));
+
+ switch (obj->yst_mode & S_IFMT) {
+--- a/fs/yaffs2/yaffs_attribs.c
++++ b/fs/yaffs2/yaffs_attribs.c
+@@ -14,6 +14,48 @@
+ #include "yaffs_guts.h"
+ #include "yaffs_attribs.h"
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
++static inline uid_t ia_uid_read(const struct iattr *iattr)
++{
++ return from_kuid(&init_user_ns, iattr->ia_uid);
++}
++
++static inline gid_t ia_gid_read(const struct iattr *iattr)
++{
++ return from_kgid(&init_user_ns, iattr->ia_gid);
++}
++
++static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
++{
++ iattr->ia_uid = make_kuid(&init_user_ns, uid);
++}
++
++static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
++{
++ iattr->ia_gid = make_kgid(&init_user_ns, gid);
++}
++#else
++static inline uid_t ia_uid_read(const struct iattr *iattr)
++{
++ return iattr->ia_uid;
++}
++
++static inline gid_t ia_gid_read(const struct iattr *inode)
++{
++ return iattr->ia_gid;
++}
++
++static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
++{
++ iattr->ia_uid = uid;
++}
++
++static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
++{
++ iattr->ia_gid = gid;
++}
++#endif
++
+ void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh)
+ {
+ obj->yst_uid = oh->yst_uid;
+@@ -77,9 +119,9 @@ int yaffs_set_attribs(struct yaffs_obj *
+ if (valid & ATTR_MODE)
+ obj->yst_mode = attr->ia_mode;
+ if (valid & ATTR_UID)
+- obj->yst_uid = attr->ia_uid;
++ obj->yst_uid = ia_uid_read(attr);
+ if (valid & ATTR_GID)
+- obj->yst_gid = attr->ia_gid;
++ obj->yst_gid = ia_gid_read(attr);
+
+ if (valid & ATTR_ATIME)
+ obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime);
+@@ -103,9 +145,9 @@ int yaffs_get_attribs(struct yaffs_obj *
+
+ attr->ia_mode = obj->yst_mode;
+ valid |= ATTR_MODE;
+- attr->ia_uid = obj->yst_uid;
++ ia_uid_write(attr, obj->yst_uid);
+ valid |= ATTR_UID;
+- attr->ia_gid = obj->yst_gid;
++ ia_gid_write(attr, obj->yst_gid);
+ valid |= ATTR_GID;
+
+ Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime;