2022년 8월 24일 (수) 오전 9:10, Namjae Jeon <linkinjeon@xxxxxxxxxx>님이 작성: > > 2022-08-23 17:26 GMT+09:00, Hyunchul Lee <hyc.lee@xxxxxxxxx>: > > 2022년 8월 23일 (화) 오전 11:45, Namjae Jeon <linkinjeon@xxxxxxxxxx>님이 작성: > >> > >> >> >> >> > diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c > >> >> >> >> > index 53c91ab02be2..6716c4e3c16d 100644 > >> >> >> >> > --- a/fs/ksmbd/smb2pdu.c > >> >> >> >> > +++ b/fs/ksmbd/smb2pdu.c > >> >> >> >> > @@ -3970,11 +3970,9 @@ int smb2_query_dir(struct ksmbd_work > >> >> >> >> > *work) > >> >> >> >> > */ > >> >> >> >> > if (!d_info.out_buf_len && !d_info.num_entry) > >> >> >> >> > goto no_buf_len; > >> >> >> >> > - if (rc == 0) > >> >> >> >> > - restart_ctx(&dir_fp->readdir_data.ctx); > >> >> >> >> > - if (rc == -ENOSPC) > >> >> >> >> > + if (rc > 0 || rc == -ENOSPC) > >> >> >> >> Do you know why -ENOSPC error is ignored ? > >> >> >> >> > >> >> >> > > >> >> >> > I don't know why and can't find the commit history > >> >> >> > for this. > >> >> >> After checking if -ENOSPC error is returned, there is no need to > >> >> >> leave > >> >> >> it if it is not needed. > >> >> > > >> >> > In most cases, -ENOSPC is not returned. Because the value > >> >> > is set to the return value from filesystems' iterate or > >> >> > iterate_share, > >> >> > and most file systems don't allocate disk space for this operation. > >> >> > > >> >> > But we cannot guarantee this. So how about changing handling > >> >> > iterate_dir > >> >> > like gendents system call. Even if an error code is returned by > >> >> > iterate_dir, > >> >> > it treats as normal if several child files are iterated and the > >> >> > buffer > >> >> > is filled with > >> >> > information about those. > >> >> Among the errors of the smb2 query directory in the specification, > >> >> there is a file corruption error response > >> >> type(STATUS_FILE_CORRUPT_ERROR). > >> >> Can you check when smb server return that error response for smb2 > >> >> query directory? > >> >> > >> > > >> > According to MS-REREF, it means "The file or directory is corrupt and > >> > unreadable. > >> > Run the chkdsk utility". And there is no function to return the error > >> > in > >> > Samba. > >> Is samba not able to know corruption errors using getdents syscall as you > >> said? > > > > If iterate_dir returns an error and there are files iterated, getdents > > syscall will succeed. > > But if a client requests SMB2_QUERY_DIR again due to STATUS_NO_MORE_FILES > > absence of the last response, iterate_dir returns an error again and > > there are no > > files iterated, getdents syscall will fail. Samba can send a response > > with an error. > Sorry, can't understand. What error ? When I set the last entry of directory FAT chain to be invalid value in exFAT, the last getdents returns -EIO, but Samba sends responses without an error > > > >> There is no reason to follow it. I think that ksmbd is able to return > >> this error. > > > > Can we determine we should return a response with STATUS_FILE_CORRUPT_ERROR > > if iterate_dir returns -EIO? > STATUS_FILE_CORRUPT_ERROR is still not cleared. want to know how > windows server handle it. In the above example, Windows server sends an empty SMB2_QUERY_DIRECTORY response with STATUS_FILE_CORRUPT_ERROR. And when executing "dir <directory>" in Windows terminal for the local exFAT filesystem, there are no files iterated and DirIOError is generated. > > > > -- > > Thanks, > > Hyunchul > > -- Thanks, Hyunchul