123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- --- 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;
|