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 <hch@xxxxxx> Acked-by: Mimi Zohar <zohar@xxxxxxxxxxxxxxxxxx> (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; -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html