diff mbox series

[v2,2/2] ksmbd: retrieve number of blocks using vfs_getattr in set_file_allocation_info

Message ID 20240222095819.2188726-2-mmakassikis@freebox.fr
State New
Headers show
Series [v2,1/2] ksmbd: replace generic_fillattr with vfs_getattr | expand

Commit Message

Marios Makassikis Feb. 22, 2024, 9:58 a.m. UTC
Use vfs_getattr() to retrieve stat information, rather than make
assumptions about how a filesystem fills inode structs.

Signed-off-by: Marios Makassikis <mmakassikis@freebox.fr>
---
changes in v2:
 - reword commit message to remove XFS reference.
 - fix build

 fs/smb/server/smb2pdu.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Namjae Jeon Feb. 22, 2024, 10:59 a.m. UTC | #1
2024-02-22 18:58 GMT+09:00, Marios Makassikis <mmakassikis@freebox.fr>:
> Use vfs_getattr() to retrieve stat information, rather than make
> assumptions about how a filesystem fills inode structs.
>
> Signed-off-by: Marios Makassikis <mmakassikis@freebox.fr>
Applied it to #ksmbd-for-next-next.
Thanks for your patch.
diff mbox series

Patch

diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index f6cc5d2730ff..199c31c275e5 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -5809,15 +5809,21 @@  static int set_file_allocation_info(struct ksmbd_work *work,
 
 	loff_t alloc_blks;
 	struct inode *inode;
+	struct kstat stat;
 	int rc;
 
 	if (!(fp->daccess & FILE_WRITE_DATA_LE))
 		return -EACCES;
 
+	rc = vfs_getattr(&fp->filp->f_path, &stat, STATX_BASIC_STATS,
+			 AT_STATX_SYNC_AS_STAT);
+	if (rc)
+		return rc;
+
 	alloc_blks = (le64_to_cpu(file_alloc_info->AllocationSize) + 511) >> 9;
 	inode = file_inode(fp->filp);
 
-	if (alloc_blks > inode->i_blocks) {
+	if (alloc_blks > stat.blocks) {
 		smb_break_all_levII_oplock(work, fp, 1);
 		rc = vfs_fallocate(fp->filp, FALLOC_FL_KEEP_SIZE, 0,
 				   alloc_blks * 512);
@@ -5825,7 +5831,7 @@  static int set_file_allocation_info(struct ksmbd_work *work,
 			pr_err("vfs_fallocate is failed : %d\n", rc);
 			return rc;
 		}
-	} else if (alloc_blks < inode->i_blocks) {
+	} else if (alloc_blks < stat.blocks) {
 		loff_t size;
 
 		/*