summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorJixiong Hu <Jixiong.Hu@mediatek.com>2024-03-19 17:20:40 +0800
committerTom Rini <trini@konsulko.com>2024-04-10 09:34:52 -0600
commit278c644cfa48a5f9c2ec27eab64bf0d25d712649 (patch)
tree366b27c59661f2b3ce98bc7418d18eb34d330607 /fs
parentae8e1d5aa46034963bca28fb07dac76970f718fe (diff)
downloadu-boot-278c644cfa48a5f9c2ec27eab64bf0d25d712649.tar.gz
u-boot-278c644cfa48a5f9c2ec27eab64bf0d25d712649.tar.bz2
u-boot-278c644cfa48a5f9c2ec27eab64bf0d25d712649.zip
fs: ext4: Change the Settings of file permissions
When a file is created in the linux and corresponding file permission is set, if the file needs to be modified in uboot during the startup process, the modified file permission will be reset to 755. Therefore, when the ext4fs_write() function is called, if the file already exists, the file permission of the new file is equal to the file permission of the existing file.
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/ext4_write.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/ext4/ext4_write.c b/fs/ext4/ext4_write.c
index ea4c5d4157..d057f6b5a7 100644
--- a/fs/ext4/ext4_write.c
+++ b/fs/ext4/ext4_write.c
@@ -847,6 +847,7 @@ int ext4fs_write(const char *fname, const char *buffer,
{
int ret = 0;
struct ext2_inode *file_inode = NULL;
+ struct ext2_inode *existing_file_inode = NULL;
unsigned char *inode_buffer = NULL;
int parent_inodeno;
int inodeno;
@@ -900,6 +901,15 @@ int ext4fs_write(const char *fname, const char *buffer,
/* check if the filename is already present in root */
existing_file_inodeno = ext4fs_filename_unlink(filename);
if (existing_file_inodeno != -1) {
+ existing_file_inode = (struct ext2_inode *)zalloc(fs->inodesz);
+ if (!existing_file_inode)
+ goto fail;
+ ret = ext4fs_iget(existing_file_inodeno, existing_file_inode);
+ if (ret) {
+ free(existing_file_inode);
+ goto fail;
+ }
+
ret = ext4fs_delete_file(existing_file_inodeno);
fs->first_pass_bbmap = 0;
fs->curr_blkno = 0;
@@ -948,9 +958,15 @@ int ext4fs_write(const char *fname, const char *buffer,
sizebytes = 0;
}
} else {
- file_inode->mode = cpu_to_le16(S_IFREG | S_IRWXU | S_IRGRP |
- S_IROTH | S_IXGRP | S_IXOTH);
+ if (existing_file_inode) {
+ file_inode->mode = existing_file_inode->mode;
+ } else {
+ file_inode->mode = cpu_to_le16(S_IFREG | S_IRWXU | S_IRGRP |
+ S_IROTH | S_IXGRP | S_IXOTH);
+ }
}
+ if (existing_file_inode)
+ free(existing_file_inode);
/* ToDo: Update correct time */
file_inode->mtime = cpu_to_le32(timestamp);
file_inode->atime = cpu_to_le32(timestamp);