Re: [PATCH v2] exfat: check disk status during buffer write
From: dongliang cui
Date: Wed Jul 24 2024 - 04:27:45 EST
On Wed, Jul 24, 2024 at 3:50 PM Sungjong Seo <sj1557.seo@xxxxxxxxxxx> wrote:
>
> > On Wed, Jul 24, 2024 at 3:03 PM Sungjong Seo <sj1557.seo@xxxxxxxxxxx>
> > wrote:
> > >
> [snip]
> > > >
> > > > +static int exfat_block_device_ejected(struct super_block *sb)
> > > > +{
> > > > + struct backing_dev_info *bdi = sb->s_bdi;
> > > > +
> > > > + return bdi->dev == NULL;
> > > > +}
> > > Have you tested with this again?
> > Yes, I tested it in this way. The user side can receive the -ENODEV error
> > after the device is ejected.
> > dongliang.cui@deivice:/data/tmp # dd if=/dev/zero of=test.img bs=1M
> > count=10240
> > dd: test.img: write error: No such device
> > 1274+0 records in
> > 1273+1 records out
> > 1335635968 bytes (1.2 G) copied, 8.060 s, 158 M/s
> Oops!, write() seems to return ENODEV that man page does not have.
> In exfat_map_cluster, it was necessary to distinguish and return error
> values, but now that explicitly differentiated error messages will be
> printed. So, why not return EIO again? It seem appropriate to return EIO
> instead of ENODEV from the read/write syscall.
Yes, indeed.
I will make the changes all together in the next version.
Thanks!
>
> >
> > >
> > > > +
> > > > static int exfat_get_block(struct inode *inode, sector_t iblock,
> > > > struct buffer_head *bh_result, int create)
> > > > {
> > > > @@ -290,6 +298,9 @@ static int exfat_get_block(struct inode *inode,
> > > > sector_t iblock,
> > > > sector_t valid_blks;
> > > > loff_t pos;
> > > >
> > > > + if (exfat_block_device_ejected(sb))
> > > This looks better than the modified location in the last patch.
> > > However, the caller of this function may not be interested in exfat
> > > error handling, so here we should call exfat_fs_error_ratelimit()
> > > with an appropriate error message.
> > Thank you for the reminder. I will make the changes in the next version.
> Sounds good!
>
> >
> > >
> > > > + return -ENODEV;
> > > > +
> > > > mutex_lock(&sbi->s_lock);
> > > > last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb);
> > > > if (iblock >= last_block && !create)
> > > > --
> > > > 2.25.1
> > >
> > >
>
>