On Thu, 2017-05-18 at 08:26 +0200, Christoph Hellwig wrote:
> For some file systems we still memcpy into it, but in various places this
> already allows us to use the proper uuid helpers.  More to come..
> 
> Signed-off-by: Christoph Hellwig <h...@lst.de>

Acked-by: Mimi Zohar <zo...@linux.vnet.ibm.com> (Changes to IMA/EVM)

> ---
>  drivers/xen/tmem.c                  |  6 +++---
>  fs/ext4/super.c                     |  2 +-
>  fs/f2fs/super.c                     |  2 +-
>  fs/gfs2/ops_fstype.c                |  2 +-
>  fs/gfs2/sys.c                       | 22 +++++-----------------
>  fs/ocfs2/super.c                    |  2 +-
>  fs/overlayfs/copy_up.c              |  5 ++---
>  fs/overlayfs/namei.c                |  2 +-
>  fs/xfs/xfs_mount.c                  |  3 +--
>  include/linux/cleancache.h          |  2 +-
>  include/linux/fs.h                  |  5 +++--
>  mm/cleancache.c                     |  2 +-
>  security/integrity/evm/evm_crypto.c |  2 +-
>  security/integrity/ima/ima_policy.c |  2 +-
>  14 files changed, 23 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c
> index 4ac2ca8a7656..bf13d1ec51f3 100644
> --- a/drivers/xen/tmem.c
> +++ b/drivers/xen/tmem.c
> @@ -233,12 +233,12 @@ static int tmem_cleancache_init_fs(size_t pagesize)
>       return xen_tmem_new_pool(uuid_private, 0, pagesize);
>  }
> 
> -static int tmem_cleancache_init_shared_fs(char *uuid, size_t pagesize)
> +static int tmem_cleancache_init_shared_fs(uuid_t *uuid, size_t pagesize)
>  {
>       struct tmem_pool_uuid shared_uuid;
> 
> -     shared_uuid.uuid_lo = *(u64 *)uuid;
> -     shared_uuid.uuid_hi = *(u64 *)(&uuid[8]);
> +     shared_uuid.uuid_lo = *(u64 *)&uuid->b[0];
> +     shared_uuid.uuid_hi = *(u64 *)&uuid->b[8];
>       return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize);
>  }
> 
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 0b177da9ea82..6e3b4186a22f 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -3952,7 +3952,7 @@ static int ext4_fill_super(struct super_block *sb, void 
> *data, int silent)
>               sb->s_qcop = &ext4_qctl_operations;
>       sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
>  #endif
> -     memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
> +     memcpy(&sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
> 
>       INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
>       mutex_init(&sbi->s_orphan_lock);
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 83355ec4a92c..0b89b0b7b9f7 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1937,7 +1937,7 @@ static int f2fs_fill_super(struct super_block *sb, void 
> *data, int silent)
>       sb->s_time_gran = 1;
>       sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
>               (test_opt(sbi, POSIX_ACL) ? MS_POSIXACL : 0);
> -     memcpy(sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
> +     memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
> 
>       /* init f2fs-specific super block info */
>       sbi->valid_super_block = valid_super_block;
> diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
> index ed67548b286c..b92135c202c2 100644
> --- a/fs/gfs2/ops_fstype.c
> +++ b/fs/gfs2/ops_fstype.c
> @@ -203,7 +203,7 @@ static void gfs2_sb_in(struct gfs2_sbd *sdp, const void 
> *buf)
> 
>       memcpy(sb->sb_lockproto, str->sb_lockproto, GFS2_LOCKNAME_LEN);
>       memcpy(sb->sb_locktable, str->sb_locktable, GFS2_LOCKNAME_LEN);
> -     memcpy(s->s_uuid, str->sb_uuid, 16);
> +     memcpy(&s->s_uuid, str->sb_uuid, 16);
>  }
> 
>  /**
> diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
> index 7a515345610c..e77bc52b468f 100644
> --- a/fs/gfs2/sys.c
> +++ b/fs/gfs2/sys.c
> @@ -71,25 +71,14 @@ static ssize_t fsname_show(struct gfs2_sbd *sdp, char 
> *buf)
>       return snprintf(buf, PAGE_SIZE, "%s\n", sdp->sd_fsname);
>  }
> 
> -static int gfs2_uuid_valid(const u8 *uuid)
> -{
> -     int i;
> -
> -     for (i = 0; i < 16; i++) {
> -             if (uuid[i])
> -                     return 1;
> -     }
> -     return 0;
> -}
> -
>  static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
>  {
>       struct super_block *s = sdp->sd_vfs;
> -     const u8 *uuid = s->s_uuid;
> +
>       buf[0] = '\0';
> -     if (!gfs2_uuid_valid(uuid))
> +     if (uuid_is_null(&s->s_uuid))
>               return 0;
> -     return snprintf(buf, PAGE_SIZE, "%pUB\n", uuid);
> +     return snprintf(buf, PAGE_SIZE, "%pUB\n", &s->s_uuid);
>  }
> 
>  static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
> @@ -712,14 +701,13 @@ static int gfs2_uevent(struct kset *kset, struct 
> kobject *kobj,
>  {
>       struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
>       struct super_block *s = sdp->sd_vfs;
> -     const u8 *uuid = s->s_uuid;
> 
>       add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
>       add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
>       if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
>               add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
> -     if (gfs2_uuid_valid(uuid))
> -             add_uevent_var(env, "UUID=%pUB", uuid);
> +     if (!uuid_is_null(&s->s_uuid))
> +             add_uevent_var(env, "UUID=%pUB", &s->s_uuid);
>       return 0;
>  }
> 
> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
> index ca1646fbcaef..83005f486451 100644
> --- a/fs/ocfs2/super.c
> +++ b/fs/ocfs2/super.c
> @@ -2062,7 +2062,7 @@ static int ocfs2_initialize_super(struct super_block 
> *sb,
>       cbits = le32_to_cpu(di->id2.i_super.s_clustersize_bits);
>       bbits = le32_to_cpu(di->id2.i_super.s_blocksize_bits);
>       sb->s_maxbytes = ocfs2_max_file_offset(bbits, cbits);
> -     memcpy(sb->s_uuid, di->id2.i_super.s_uuid,
> +     memcpy(&sb->s_uuid, di->id2.i_super.s_uuid,
>              sizeof(di->id2.i_super.s_uuid));
> 
>       osb->osb_dx_mask = (1 << (cbits - bbits)) - 1;
> diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
> index 9008ab9fbd2e..5b795873f7fa 100644
> --- a/fs/overlayfs/copy_up.c
> +++ b/fs/overlayfs/copy_up.c
> @@ -284,7 +284,6 @@ static int ovl_set_origin(struct dentry *dentry, struct 
> dentry *lower,
>                         struct dentry *upper)
>  {
>       struct super_block *sb = lower->d_sb;
> -     uuid_be *uuid = (uuid_be *) &sb->s_uuid;
>       const struct ovl_fh *fh = NULL;
>       int err;
> 
> @@ -294,8 +293,8 @@ static int ovl_set_origin(struct dentry *dentry, struct 
> dentry *lower,
>        * up and a pure upper inode.
>        */
>       if (sb->s_export_op && sb->s_export_op->fh_to_dentry &&
> -         uuid_be_cmp(*uuid, NULL_UUID_BE)) {
> -             fh = ovl_encode_fh(lower, uuid);
> +         !uuid_is_null(&sb->s_uuid)) {
> +             fh = ovl_encode_fh(lower, &sb->s_uuid);
>               if (IS_ERR(fh))
>                       return PTR_ERR(fh);
>       }
> diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
> index bad0f665a635..6709f27c6876 100644
> --- a/fs/overlayfs/namei.c
> +++ b/fs/overlayfs/namei.c
> @@ -135,7 +135,7 @@ static struct dentry *ovl_get_origin(struct dentry 
> *dentry,
>        * Make sure that the stored uuid matches the uuid of the lower
>        * layer where file handle will be decoded.
>        */
> -     if (uuid_be_cmp(fh->uuid, *(uuid_be *) &mnt->mnt_sb->s_uuid))
> +     if (!uuid_equal(&fh->uuid, &mnt->mnt_sb->s_uuid))
>               goto out;
> 
>       origin = exportfs_decode_fh(mnt, (struct fid *)fh->fid,
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 682b336a7a6a..6a18ae407713 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -74,8 +74,7 @@ xfs_uuid_mount(
>       int                     hole, i;
> 
>       /* Publish UUID in struct super_block */
> -     BUILD_BUG_ON(sizeof(mp->m_super->s_uuid) != sizeof(uuid_t));
> -     memcpy(&mp->m_super->s_uuid, uuid, sizeof(uuid_t));
> +     uuid_copy(&mp->m_super->s_uuid, uuid);
> 
>       if (mp->m_flags & XFS_MOUNT_NOUUID)
>               return 0;
> diff --git a/include/linux/cleancache.h b/include/linux/cleancache.h
> index fccf7f44139d..bbb3712dd892 100644
> --- a/include/linux/cleancache.h
> +++ b/include/linux/cleancache.h
> @@ -27,7 +27,7 @@ struct cleancache_filekey {
> 
>  struct cleancache_ops {
>       int (*init_fs)(size_t);
> -     int (*init_shared_fs)(char *uuid, size_t);
> +     int (*init_shared_fs)(uuid_t *uuid, size_t);
>       int (*get_page)(int, struct cleancache_filekey,
>                       pgoff_t, struct page *);
>       void (*put_page)(int, struct cleancache_filekey,
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 803e5a9b2654..3e68cabb8457 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -30,6 +30,7 @@
>  #include <linux/percpu-rwsem.h>
>  #include <linux/workqueue.h>
>  #include <linux/delayed_call.h>
> +#include <linux/uuid.h>
> 
>  #include <asm/byteorder.h>
>  #include <uapi/linux/fs.h>
> @@ -1328,8 +1329,8 @@ struct super_block {
> 
>       struct sb_writers       s_writers;
> 
> -     char s_id[32];                          /* Informational name */
> -     u8 s_uuid[16];                          /* UUID */
> +     char                    s_id[32];       /* Informational name */
> +     uuid_t                  s_uuid;         /* UUID */
> 
>       void                    *s_fs_info;     /* Filesystem private info */
>       unsigned int            s_max_links;
> diff --git a/mm/cleancache.c b/mm/cleancache.c
> index ba5d8f3e6d68..f7b9fdc79d97 100644
> --- a/mm/cleancache.c
> +++ b/mm/cleancache.c
> @@ -130,7 +130,7 @@ void __cleancache_init_shared_fs(struct super_block *sb)
>       int pool_id = CLEANCACHE_NO_BACKEND_SHARED;
> 
>       if (cleancache_ops) {
> -             pool_id = cleancache_ops->init_shared_fs(sb->s_uuid, PAGE_SIZE);
> +             pool_id = cleancache_ops->init_shared_fs(&sb->s_uuid, 
> PAGE_SIZE);
>               if (pool_id < 0)
>                       pool_id = CLEANCACHE_NO_POOL;
>       }
> diff --git a/security/integrity/evm/evm_crypto.c 
> b/security/integrity/evm/evm_crypto.c
> index d7f282d75cc1..1d32cd20009a 100644
> --- a/security/integrity/evm/evm_crypto.c
> +++ b/security/integrity/evm/evm_crypto.c
> @@ -164,7 +164,7 @@ static void hmac_add_misc(struct shash_desc *desc, struct 
> inode *inode,
>       hmac_misc.mode = inode->i_mode;
>       crypto_shash_update(desc, (const u8 *)&hmac_misc, sizeof(hmac_misc));
>       if (evm_hmac_attrs & EVM_ATTR_FSUUID)
> -             crypto_shash_update(desc, inode->i_sb->s_uuid,
> +             crypto_shash_update(desc, &inode->i_sb->s_uuid.b[0],
>                                   sizeof(inode->i_sb->s_uuid));
>       crypto_shash_final(desc, digest);
>  }
> diff --git a/security/integrity/ima/ima_policy.c 
> b/security/integrity/ima/ima_policy.c
> index da3e7d50e0d7..659dbcc83d2f 100644
> --- a/security/integrity/ima/ima_policy.c
> +++ b/security/integrity/ima/ima_policy.c
> @@ -244,7 +244,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, 
> struct inode *inode,
>           && rule->fsmagic != inode->i_sb->s_magic)
>               return false;
>       if ((rule->flags & IMA_FSUUID) &&
> -         memcmp(&rule->fsuuid, inode->i_sb->s_uuid, sizeof(rule->fsuuid)))
> +         !uuid_equal(&rule->fsuuid, &inode->i_sb->s_uuid))
>               return false;
>       if ((rule->flags & IMA_UID) && !rule->uid_op(cred->uid, rule->uid))
>               return false;

Reply via email to