Re: [RFC][PATCH v3 01/10] fs: common implementation of file type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 25, 2018 at 01:20:44PM +0200, Jan Kara wrote:
> On Tue 23-10-18 21:19:53, Phillip Potter wrote:
> > Many file systems use a copy&paste implementation
> > of dirent to on-disk file type conversions.
> > 
> > Create a common implementation to be used by file systems
> > with some useful conversion helpers to reduce open coded
> > file type conversions in file system code.
> 
> Thanks for the patch. I like the cleanup. Some comments inline...
> 
> > diff --git a/include/linux/file_type.h b/include/linux/file_type.h
> > new file mode 100644
> > index 000000000000..f015c41ca90c
> > --- /dev/null
> > +++ b/include/linux/file_type.h
> > @@ -0,0 +1,108 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#ifndef _LINUX_FILE_TYPE_H
> > +#define _LINUX_FILE_TYPE_H
> > +
> > +/*
> > + * This is a common implementation of dirent to fs on-disk
> > + * file type conversion.  Although the fs on-disk bits are
> > + * specific to every file system, in practice, many file systems
> > + * use the exact same on-disk format to describe the lower 3
> > + * file type bits that represent the 7 POSIX file types.
> > + * All those file systems can use this generic code for the
> > + * conversions:
> > + *  i_mode -> fs on-disk file type (ftype)
> > + *  fs on-disk file type (ftype) -> dirent file type (dtype)
> > + *  i_mode -> dirent file type (dtype)
> 
> I don't think these three lines above are really useful. If you want to
> make it easier for fs developers, add Docbook coments at function
> implementations.
> 
> > + */
> > +
> > +/*
> > + * struct dirent file types
> > + * exposed to user via getdents(2), readdir(3)
> > + *
> > + * These match bits 12..15 of stat.st_mode
> > + * (ie "(i_mode >> 12) & 15").
> > + */
> > +#define S_DT_SHIFT	12
> > +#define S_DT(mode)	(((mode) & S_IFMT) >> S_DT_SHIFT)
> > +#define S_DT_MASK	(S_IFMT >> S_DT_SHIFT)
> > +
> > +#define DT_UNKNOWN	0
> > +#define DT_FIFO		S_DT(S_IFIFO) /* 1 */
> > +#define DT_CHR		S_DT(S_IFCHR) /* 2 */
> > +#define DT_DIR		S_DT(S_IFDIR) /* 4 */
> > +#define DT_BLK		S_DT(S_IFBLK) /* 6 */
> > +#define DT_REG		S_DT(S_IFREG) /* 8 */
> > +#define DT_LNK		S_DT(S_IFLNK) /* 10 */
> > +#define DT_SOCK		S_DT(S_IFSOCK) /* 12 */
> 
> Why not keep the original definition by absolute number. After all these
> must match glibc...
> 
> > +#define DT_WHT		14
> > +
> > +#define DT_MAX		(S_DT_MASK + 1) /* 16 */
> > +
> > +/*
> > + * fs on-disk file types.
> > + * Only the low 3 bits are used for the POSIX file types.
> > + * Other bits are reserved for fs private use.
> > + *
> > + * Note that no fs currently stores the whiteout type on-disk,
> > + * so whiteout dirents are exposed to user as DT_CHR.
> > + */
> > +#define FT_UNKNOWN	0
> > +#define FT_REG_FILE	1
> > +#define FT_DIR		2
> > +#define FT_CHRDEV	3
> > +#define FT_BLKDEV	4
> > +#define FT_FIFO		5
> > +#define FT_SOCK		6
> > +#define FT_SYMLINK	7
> > +
> > +#define FT_MAX		8
> > +
> > +/*
> > + * fs on-disk file type to dirent file type conversion
> > + */
> > +static unsigned char fs_dtype_by_ftype[FT_MAX] = {
> > +	[FT_UNKNOWN]	= DT_UNKNOWN,
> > +	[FT_REG_FILE]	= DT_REG,
> > +	[FT_DIR]	= DT_DIR,
> > +	[FT_CHRDEV]	= DT_CHR,
> > +	[FT_BLKDEV]	= DT_BLK,
> > +	[FT_FIFO]	= DT_FIFO,
> > +	[FT_SOCK]	= DT_SOCK,
> > +	[FT_SYMLINK]	= DT_LNK
> > +};
> 
> So you define static variable in a header file. That will make it appear in
> each and every object that includes this header (when not used it will get
> optimized away but still...). IMO that is not good and I don't think
> anything here is so performance super-crittical, that the cost of
> additional function call would matter (correct me if I'm wrong here). So
> I'd rather see these tables and associated functions in some C file.
> 
> > +static inline unsigned char fs_dtype(int filetype)
> 
> This function name is not very descriptive and consistent with the other
> two. It should be like fs_ftype_to_dtype(), right?
> 
> > +{
> > +	if (filetype >= FT_MAX)
> > +		return DT_UNKNOWN;
> > +
> > +	return fs_dtype_by_ftype[filetype];
> > +}
> 
> Otherwise the patch looks good to me.
> 
> 								Honza
> -- 
> Jan Kara <jack@xxxxxxxx>
> SUSE Labs, CR

Dear Jan,

Thanks for your comments/feedback, really appreciate it. All good points
and I will make sure I act on it all before republishing the series. I'd
be interested to know your thoughts on Ted T'so's suggestion about moving
the new header to the uapi area - yes or no in your opinion? Happy with
either, but looking for the widest possible acceptance. Thanks.

Regards,
Phil



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux