Message ID | 20180619160223.4108556-3-arnd@arndb.de |
---|---|
State | New |
Headers | show |
Series | [1/3] hfs: stop using timespec based interfaces | expand |
Hi: On Tue, Jun 19, 2018 at 06:02:09PM +0200, Arnd Bergmann wrote: > We have the data in the kernel, so we might just as well provide it to > user space. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > fs/hfsplus/dir.c | 1 + > fs/hfsplus/hfsplus_fs.h | 2 ++ > fs/hfsplus/inode.c | 14 ++++++++++++++ > 3 files changed, 17 insertions(+) > > diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c > index b5254378f011..df14b6dd5b5a 100644 > --- a/fs/hfsplus/dir.c > +++ b/fs/hfsplus/dir.c > @@ -566,6 +566,7 @@ const struct inode_operations hfsplus_dir_inode_operations = { > .symlink = hfsplus_symlink, > .mknod = hfsplus_mknod, > .rename = hfsplus_rename, > + .getattr = hfsplus_getattr, > .listxattr = hfsplus_listxattr, > #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL > .get_acl = hfsplus_get_posix_acl, > diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h > index 646c207be38d..1a6b469f8d22 100644 > --- a/fs/hfsplus/hfsplus_fs.h > +++ b/fs/hfsplus/hfsplus_fs.h > @@ -489,6 +489,8 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd); > int hfsplus_cat_write_inode(struct inode *inode); > int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, > int datasync); > +int hfsplus_getattr(const struct path *path, struct kstat *stat, > + u32 request_mask, unsigned int query_flags); > > /* ioctl.c */ > long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); > diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c > index c0c8d433864f..f9bb568f9479 100644 > --- a/fs/hfsplus/inode.c > +++ b/fs/hfsplus/inode.c > @@ -276,6 +276,19 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) > return 0; > } > > +int hfsplus_getattr(const struct path *path, struct kstat *stat, > + u32 request_mask, unsigned int query_flags) > +{ > + struct inode *inode = d_backing_inode(path->dentry); I think d_inode() is better. They work the same, but "normal filesystems should not use this", according to the d_backing_inode() documentation. > + > + generic_fillattr(inode, stat); > + > + stat->btime = hfsp_mt2ut(HFSPLUS_I(inode)->create_date); > + stat->result_mask |= STATX_BTIME; > + > + return 0; > +} > + > int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, > int datasync) > { > @@ -335,6 +348,7 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, > > static const struct inode_operations hfsplus_file_inode_operations = { > .setattr = hfsplus_setattr, > + .getattr = hfsplus_getattr, > .listxattr = hfsplus_listxattr, > #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL > .get_acl = hfsplus_get_posix_acl, > -- > 2.9.0 > What about symlinks and special files? Thanks, Ernest
On Thu, Jun 21, 2018 at 12:45 AM, Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com> wrote: >> --- a/fs/hfsplus/inode.c >> +++ b/fs/hfsplus/inode.c >> @@ -276,6 +276,19 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) >> return 0; >> } >> >> +int hfsplus_getattr(const struct path *path, struct kstat *stat, >> + u32 request_mask, unsigned int query_flags) >> +{ >> + struct inode *inode = d_backing_inode(path->dentry); > > I think d_inode() is better. They work the same, but "normal filesystems > should not use this", according to the d_backing_inode() documentation. > Right, definitely. I copied it from vfs_getattr_nosec() without thinking about it much. I see how David Howells put that d_backing_inode() there, but still don't understand it. >> @@ -335,6 +348,7 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, >> >> static const struct inode_operations hfsplus_file_inode_operations = { >> .setattr = hfsplus_setattr, >> + .getattr = hfsplus_getattr, >> .listxattr = hfsplus_listxattr, >> #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL >> .get_acl = hfsplus_get_posix_acl, >> -- >> 2.9.0 >> > > What about symlinks and special files? My mistake again, thanks for pointing that out. Doing the symlinks correctly here would actually add a bit more complexity as they use the generic page_symlink_inode_operations at the moment. I think I'd rather just retract this patch and let someone else handle it if they actually want this feature. I only added it because it seemed trivial to do, but that was clearly not true. ;-) Arnd
diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index b5254378f011..df14b6dd5b5a 100644 --- a/fs/hfsplus/dir.c +++ b/fs/hfsplus/dir.c @@ -566,6 +566,7 @@ const struct inode_operations hfsplus_dir_inode_operations = { .symlink = hfsplus_symlink, .mknod = hfsplus_mknod, .rename = hfsplus_rename, + .getattr = hfsplus_getattr, .listxattr = hfsplus_listxattr, #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL .get_acl = hfsplus_get_posix_acl, diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 646c207be38d..1a6b469f8d22 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -489,6 +489,8 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd); int hfsplus_cat_write_inode(struct inode *inode); int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, int datasync); +int hfsplus_getattr(const struct path *path, struct kstat *stat, + u32 request_mask, unsigned int query_flags); /* ioctl.c */ long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index c0c8d433864f..f9bb568f9479 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -276,6 +276,19 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) return 0; } +int hfsplus_getattr(const struct path *path, struct kstat *stat, + u32 request_mask, unsigned int query_flags) +{ + struct inode *inode = d_backing_inode(path->dentry); + + generic_fillattr(inode, stat); + + stat->btime = hfsp_mt2ut(HFSPLUS_I(inode)->create_date); + stat->result_mask |= STATX_BTIME; + + return 0; +} + int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, int datasync) { @@ -335,6 +348,7 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, static const struct inode_operations hfsplus_file_inode_operations = { .setattr = hfsplus_setattr, + .getattr = hfsplus_getattr, .listxattr = hfsplus_listxattr, #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL .get_acl = hfsplus_get_posix_acl,
We have the data in the kernel, so we might just as well provide it to user space. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- fs/hfsplus/dir.c | 1 + fs/hfsplus/hfsplus_fs.h | 2 ++ fs/hfsplus/inode.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+) -- 2.9.0